map された lhs が rhs へ展開される際、オプション remap が有効な場合、rhs もまた map 対象となる。すなわち、再帰が発生する。
:map! Q Q_key_pressed
などと定義し、テキスト編集中に Q キーを押したりすると、恐ろしいことが起きる。
再帰を収束させるために、vim においてはオプション maxmapdepth の数値が参照される。デフォルトの値は 1000 である。これ以上の再帰は発生しないようになっている。wasavi でもソース上は再帰の上限があり、それ以上は再帰が発生しない。ただしオプションとしては公開していない。値はとりあえず 100 固定。
再帰を発生させない map を行うには、vim では map の代わりに noremap を使う。しかし前の記事にも書いたが、あまりほいほいと ex コマンドを新設したくない。そこで、昨日の記事で考えたシンタックスに則り、
- remap の発生する(正確には、オプション remap によって動作が変わる)map
:map! Q Q_key_pressed
- remap の発生しない map
:map! [noremap] Q Q_key_pressed
というような書き方にしようと思う。
またもや vimmer から殺意を向けられそうではあるが。