例によって map コマンドのテスト。
テストといいつつ、新しい機能なのだけど。ピュアな vi が備える map の機能はかなりストイックである。map の一覧を表示するか、新しく定義するかの 2 パターンしかない。
- map の全定義を削除する
- すでにマップされたストローク lhs の検索
あたりはあってよいと思うが、ない。まあ map なんて exrc で一括で行うものだろうし、vi にこれらの機能を埋め込むより exec 編集したほうが早いじゃん、ということなのだろう。
さてこういうパターンの場合、vim はほぼ 100% 実装済みだったりする。定義の全削除は mapclear、lhs の検索は rhs を省略した map の実行といった具合だ。
ただ、map の検索はともかく、全削除のためだけに新しい ex コマンドを新設するのはどうなのかなーと思う。なんとか map のシンタックス内で完結したほうがいいのではないか?
map のシンタックスは、:map[!] [lhs rhs]
である。lhs と rhs は両方を常に指定しないといけない。lhs と rhs は空白文字列で区切られる。lhs と rhs のそれぞれで空白文字を含める場合は CTRL-V でエスケープする必要がある。
これを踏まえた上で lhs が特別な値であった場合に、rhs を引数として特別な動作をさせたい。なおかつ特別な値というのは、vi コマンド列としてはエラーになるものでなければならない。そうしないと、その文字列に対するマッピングができなくなるので。
ということで考えてみると、\[\w+\] を使えばいいんじゃないかな。vi のコマンドでは [ のあとには [ が続くに決まってる(vim はここでもいろいろ拡張しているが)のだ。それから、lhs と rhs の両方指定制限は取り払う。そうすると、
- マップの全削除
:map [clear]
- マップ内の lhs のうち指定の引数で始まるもので検索し表示
:map Q
みたいな感じになる。この例では [ も ] もリテラルであり、そのままこの通り書く。
vimmer には「死ね!」って言われそうだけど、とりあえずこんな感じで組んでみる。