【Vim】検索範囲の指定方法まとめ

 

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
2
3
4
5
6
7
" 行番号を表示する
set number
" インクリメントサーチ(文字入力毎に検索をする)
" これがないとコマンドで Enter キーを押すまで検索結果がわからない
set incsearch
" 検索結果をハイライトする
set hlsearch

プラグインとしてはtraces.vimが便利です。

範囲の表示、置換結果のプレビューができるようになります。

これがないと暗闇を歩くような気持ちです。

先の動画でも使っています。


お役に立てれば幸いです。

では👋