addressing in ex #2

若干の補足、あるいはトリビア:

  • 1 以上の整数として行番号を示すことができるが、実は 0 も許される。ただし多くの場合、0 は 1 に丸められる。ではどういう場合に 0 が役立つのかというと、たとえば :10,20co0 のようにバッファ先頭へコピーしたい場合など。copy コマンドで指定するコピー先アドレスは、実際にはコピーされる位置の直前の行番号である。したがって、バッファ先頭である 1 行目へコピーしたい場合は 0 を指定する必要があるのだ。
  • / ~ / の検索開始位置が曖昧な書き方になっていたが、正規表現を明示した場合であっても、省略した場合でも、検索開始位置はカーソルのある行の次の行からである。
  • アドレスは最大 2 つまで指定できるのだが、実はもっと多くのアドレスを指定してもエラーにはならない。単にそれぞれのコマンドが必要とする最大のアドレスが、アドレス群の末尾から取られるだけである。つまり :1,2,3p は 2 行目から 3 行目までが対象となる。
  • 指定の行へカーソルを移動させる場合、visual モードでは [行番号]G と入力するが、ex モードで :行番号 と入力する方法もある。このようにコマンドを省略した場合、内部的には暗黙的に print コマンドが選択される。ということはつまりコンソールに指定の行が出力されるはずであるが(:1p などと入力したかのように)そうならないのは、コマンドを省略したアドレス部分から後続する文字列が \n である場合は特別扱いで何も出力しないからだ。したがって、:||| などと入力すると、現在行が 3 回 出力される(4 回ではなく)。

addressing in ex

ex でアドレスを指定する場合の仕様。アドレス(正確には最大 2 つ指定できるので addresses)というのは
1,10d
などと指定する際のコマンド本体 d までの部分。これを単にカンマ区切りの数値としてパースすればいいんでしょ? などと考えるとやけどする。アドレスとして有効なシーケンスは:

  1. .(ピリオド): 現在行を示す
  2. $: 最終行を示す
  3. 1 以上の整数: 指定の行を示す
  4. ‘x: マーク x が指す行を示す
  5. / ~ /: 現在行から前方に正規表現検索して最初にマッチした行を示す。空の正規表現(//)の場合は、現在行の次の行から前方に前回用いた正規表現検索して最初にマッチした行を示す。2 つめのスラッシュは、コマンドラインの最後の文字である限り、省略可能である。前方に検索して何も見つからず、かつオプション wrapscan が指定されている場合、検索はバッファ先頭から最初に検索を開始した行の前までも対象となる。正規表現内では、\/ はスラッシュそのものを示すためのエスケープシーケンスである
  6. ? ~ ?: 現在行から後方に正規表現検索して最初にマッチした行を示す。その他こまごましたものは / ~ / と同様
  7. -正の整数。指定の数値と現在行を合計して導かれる行を示す。数値は省略でき、その場合は 1 とみなされる
  8. +正の整数。指定の数値と現在行を合計して導かれる行を示す。数値は省略でき、その場合は 1 とみなされる

となっている。さらに、それぞれのシーケンスの後ろに空白、[+-]、正の整数を続けることができ、示された行に対するオフセットとして使われる。空白は省略できる。数値もまた省略でき、その場合は 1 とみなされる。

これらのアドレスを最大 2 つ指定して addresses となるのだけど、その場合の区切りはカンマのほかにセミコロンも許される。セミコロンを指定すると、1 つめのアドレスがいったん現在行にセットされる。2 つめのアドレス算出は 1 つめのアドレスを基準として行われる。つまり、

/foo/;/bar/
はまず foo で検索し、さらに見つかった行の前方にある bar までの範囲を対象とする。

最後に、addresses として指定可能な特別なシーケンス % がある。これはバッファ全体を示す。すなわち 1,$ と同じ意味。

ということになっている。奥が深すぎますよ Bill Joy さん!

ex command test

テスト作業も ex コマンドを残すのみとなった。

すべてのテストを終えたら、各ブラウザの公式のエクステンション配布サイトに公開を申請することになると思う。

ところでそういうサイトに申請する場合ってエクステンションのソースのライセンスってどうなるんでしたっけ? と思い調べてみたら、

ということだ。今のところ wasavi は修正 BSD ライセンスということにしているのだが、Apache 2.0 License にするかもしれない。

本当は NYSL でいいのだが、いかんせん知名度がなさ過ぎる。