map extension

例によって 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 には「死ね!」って言われそうだけど、とりあえずこんな感じで組んでみる。

Leave a Reply

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