Vim では検索や置換をするときに、その範囲を指定することになります。
今回は範囲の指定方法についてまとめます。
範囲についてはこちらのページが詳しいです。
→ Ranges | Vim Tips Wiki | Fandom
本記事もこのサイトを参考にしています。
また、:help cmdline-ranges
から説明を見ることができます。
行の位置で指定する
行番号や、行末やすべての行などを表す記号によって指定します。
書き方 | 意味 | 例 |
---|---|---|
A | 行番号A の行 | :23s/old/new/g |
$ | 最終行 | :$s/old/new/g |
. | カーソルがある行 | :.w single.txt |
.N | カーソル行の N 行後 | :.3s/old/new/g , :.-2s/old/new/g |
% | すべての行 | :%s/old/new/g |
A,B | 行A から行B | :23,26s/old/new/g , :.,$s/old/new/g |
A;B | 行A から行B (A との相対位置) | :23;.3s/old/new/g |
A... B | 行A からB 行 | :23s/old/new/g 5 |
コマンドによって範囲を明示しなかったときのデフォルトの範囲が決まっています。
置換の:s
は:.s
と、保存の:w
は:%w
と等価になります。
私が置換の範囲でよく使うのは、現在行から行番号(:,25s
)や現在行から数行先まで(:,.3s
)です。
引数にファイル名を取らないコマンドであれば、
:.,.3s/old/new/g
は:s/old/new/g 4
のように書くこともできます。
また、:
の前に数値を打つ(4:s/old/new/g
)ことでも同じことができます。
このとき4:
と打った時点でコマンドラインに.,.+3
と表示されます。
行番号を使用する場合は、行番号を表示(:set number
)しておくと便利です。
マークや選択範囲で指定する
Vim ではm(マーク名)
でマークを設定することができます。
これを用いて置換範囲を指定することもできます。
:'a,'b
とすれば、マークa
からマークb
までの範囲を指定できます。
動画ではma 5j 5j mb :'a,'bs/ni/ha/g <CR>
と入力しています。
ビジュアルモードで選択ができ、選択状態で:
を押すとコマンドラインに:'<,'>
と入力されます。
'<
と'>
はそれぞれ選択範囲開始行、終了行を示すマークなので、
マークを用いた範囲選択と本質的には同じことです。
文字で指定する
何行目かは知らないが、文字だけはわかるとき、
文字で指定することもできます。
/letter/
でカーソル行の次の行から下方検索してletter
を含む最初の行を選択し、
?letter?
でカーソル行の前の行から上方検索してletter
を含む最初の行を選択します。
動画ではカーソル行が 20 行目で、まずmakezu
を上方検索し、areba
を下方検索して、
それらの行を基準に行を前後させて範囲を指定しています。
検索・置換に便利な設定・プラグイン
~/.vimrc
に記述しておくと検索・置換のときに便利な設定です。
1" 行番号を表示する2set number3" インクリメントサーチ(文字入力毎に検索をする)4" これがないとコマンドで Enter キーを押すまで検索結果がわからない5set incsearch6" 検索結果をハイライトする7set hlsearch
プラグインとしてはtraces.vimが便利です。
範囲の表示、置換結果のプレビューができるようになります。
これがないと暗闇を歩くような気持ちです。
先の動画でも使っています。
お役に立てれば幸いです。
では