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 さん!

One thought on “addressing in ex

  1. Pingback: 赤心慶福 — completion #2

Leave a Reply

Your email address will not be published. Required fields are marked *