Humanity

Edit the world by your favorite way

emap.vimに:AllMapsの機能を追加した

※この記事はVim Advent Calendar 2012の248日目の記事です。

emap.vimとは

tyru/emap.vim · GitHub

デフォルトのmapコマンドに納得がいかなかったので作ったプラグインです。

要は「おれがかんがえたさいきょうのmapコマンド」です。*3

.vimrcで使うには、各Exコマンドを使用する前に

" Define :Map commands
call emap#load('noprefix')

call emap#set_sid_from_sfile(expand('<sfile>'))
" call emap#set_sid_from_vimrc()
" call emap#set_sid(s:SID())

のようにしてExコマンドを定義する必要があります。
デフォルトでは「EmMap」のように「Em」プレフィクスが付いていますが、「noprefix」という引数をemap#load()関数に渡すことでプレフィクスを付けずに定義することが可能です。

デフォルトでnoremap
デフォルトで
nnoremap <unique> j gj

Map [n] j gj

と書けます。

複数モードへ同時にマッピング
nnoremap <unique> j gj
xnoremap <unique> j gj
onoremap <unique> j gj

Map [nxo] j gj

と書けます。

bangを付けるとインサートモードとコマンドラインモードに対するマッピングになるのが気にいらない

emap.vimではbangを付けるとunmapの意味になります。
そのためunmapのためのコマンドはありません。

nunmap j
Map! [n] j

また複数指定可能です。

Map! [n] j gj
行末のスペースがマッピングの一部として認識されてしまう問題

emap.vimでは無視します。

「グローバルなキーマッピングバッファローカルなキーマッピングが両方ある場合、バッファローカルなキーマッピングが優先される」問題を解決する

DefMacroMapというコマンドを使います。
このコマンドで定義したマッピングは特別な記法で参照することで展開されます。

AllMapsとは

私の.vimrcに定義していた以下のようなExコマンドです。
過去にVim Hacksでも紹介しています。

command!
\   -nargs=* -complete=mapping
\   AllMaps
\   map <args> | map! <args> | lmap <args>
AllMaps

で全てのモードのマッピングを列挙し、

AllMaps a

で全てのモードの「a」というlhsを持つマッピングを列挙します。

本題

さて、タイトルの通り、emap.vimにAllMapsの機能を追加しました。
具体的には以下のような記法でAllMapsと同等の機能がemap.vimで使えるようになっています。

  1. 「Map」
    • 「AllMaps」と等価
  2. 「Map lhs」
    • 「AllMaps lhs」と等価
  3. 「Map [nvo] lhs」
    • nvoのlhsのみ列挙(AllMapsではモードの指定は不可能)

2番目のmodesを省略する記法は参照時のみ有効です。
これは間違えて「Map lhs rhs」としてしまい、全てのモードでマッピングを作成してしまわないための制限です。


これでAllMapsの定義を(僕の).vimrcから削除することができ、戦闘力を減らすことができました。
.vimrcの設定はガンガンプラグイン化しましょう。

*1:かといって初心者が対象のプラグインという訳ではないですが・・・

*2:バッファローカルな、もしくはマッピングされてない場合デフォルトのの機能を実行できるようになるとうれしい?

*3:まぁまだsyntax対応とか関数呼び出し用のmapコマンドが定義できないのでちっとも最強じゃないですが・・・