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