map extension #2

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 から殺意を向けられそうではあるが。

Leave a Reply

Your email address will not be published. Required fields are marked *