Vimで置換・検索時のエラーを抑制する
Vim で置換や検索をした際に、パターンが見つからなかった場合は E486: Pattern not found エラーが返る。たとえばマクロはエラーが発生するとそこで停止してしまうので、エラーが返らないようにしたくなるケースもある。ということで今回はその方法について調べた内容を書く。
置換
たとえば m
に以下のようなマクロを設定したとする。
:reg m Type Name Content c "m :%s/hoge/fuga/^M:echo "hello"^M
この場合、 hoge
というパターンが見つかれば問題ないが、見つからなかったら二番目のコマンド echo "hello"
は実行されない。
まず1つ目の回避策は、置換時にフラグ e
をつける。そうすることでエラーが返らなくなる。ヘルプはこちら。
:%s/hoge/fuga/e
もう一つの方法は、 try
, catch
を使うやり方。上記は置換時のみのものだったが、 try
, catch
を使うことでより汎用的なコマンドにも適用できる。ヘルプはこちら。
:try | %s/hoge/fuga/ | catch | endtry
検索
こちらも同様に、以下のマクロだと hoge
というパターンが見つからなければ二番目のコマンドは実行されない。
:reg m Type Name Content c "m /hoge^M:echo "hello"^M
こちらもまずは try
を使ってみたが、うまくいかない。
:try | /hoge | catch | endtry
実行するとコマンドを入力するところ (何て呼ぶのかわからない) に :
(コロンと謎の空白) が表示された状態になる。エスケープを2回 (なぜか2回) 押すと E486: Pattern not found: hoge | catch | endtry
と表示されるので hoge
以降の文字列全体を検索してしまっているらしい。これについてはやりようがありそうな気もするが、結局わからなかった。
いろいろ調べていて一つ判明したやり方は、組み込み関数 search
を使う方法。これに関しては try
も問題なく使用できる。ヘルプはこちら。
:try | call search("hoge") | catch | endtry