Vim で古い正規表現エンジンと新しい正規表現エンジンを切り替える
この記事は Vim Advent Calendar 2012 313日目の記事になります。
さて、先日リリースされた Vim 7.4 では新しい正規表現エンジンとして NFA の実装が追加されました。
このエンジンはいくつかのパターンで動作が速いのですが、まだすべての機能はサポートされていません。
その為、まだ古い正規表現エンジンも組み込まれており、ユーザ側で使用するエンジンを切り替えて使用する事ができます。
この正規表現エンジン周りの問題として以下のようなものが上げられます。
- <SNR> のマッチの仕方が 'regexpengine' の値によって違う · Issue #477 · vim-jp/issues
- 新正規表現エンジンで後方参照を使っていると正しくマッチしない場合がある · Issue #479 · vim-jp/issues
- Vim 7.4 で precious.vim を使用している場合にカーソル移動が遅くなる場合の対処方法
上記のような問題は正規表現エンジンによって挙動が違ったりする為、場合によって使用する正規表現エンジンを切り替える必要があります。
[オプションを使用して切り替える]
使用する正規表現エンジンを設定するために 'regexpengine' というオプションが新しく追加されました。
これは以下の様な値を設定する事ができます。
- 0:自動選択(デフォルト値)
- 1:古いエンジン
- 2:NFA エンジン
デフォルトでは自動的に適切なエンジンが選択されるような設定がされます。
明示的にエンジンを切り替えたい場合は '1' や '2' を設定して使用します。
[正規表現パターンの先頭でエンジンを指定する]
'regexpengine' 以外にも正規表現パターンの先頭で正規表現エンジンを指定する事ができます。
- \%#=0:強制的に自動選択にする。'regexpengine' が 0 以外のときだけ意味がある。
- \%#=1:強制的に古いエンジンを使う。
- \%#=2:強制的に NFA エンジンを使う。
" 使用する正規表現エンジンによって結果が異なる echo "\<SNR>" =~# "\<SNR>" " 明示的に NFAエンジンを使用するように指定 echo "\<SNR>" =~# "\\%#=2\<SNR>" " => 1 " NFA エンジンの場合でのみ意図した動作をするので " 明示的に NFA エンジンを使用するようにする execute "function /\\%#=2\<SNR>80_"
正規表現パターンごとに正規表現エンジンを指定する事ができるので、プラグイン側で正規表現を使用する場合などに明示的に指定する事ができます。