emap.vimに:AllMapsの機能を追加した
※この記事はVim Advent Calendar 2012の248日目の記事です。
emap.vimとは
デフォルトのmapコマンドに納得がいかなかったので作ったプラグインです。
- 大体においてnoremapの方が多く使うというのに4bytesも長いのは気にいらない
- デフォルトでマッピングの上書きを防ぐための
オプションが指定されていないのが気にいらない - 既存のマッピングに上書きする場合には-forceオプションを指定
- 複数モードに同じマッピングをする場合、モードだけ違うマッピングを並べるのが気にいらない
- bangを付けるとインサートモードとコマンドラインモードに対するマッピングになるのが気にいらない
- 行末のスペースがマッピングの一部として認識されてしまう問題
- 分かりやすいKey-mappingsの弊害 - 永遠に未完成の「グローバルなキーマッピングとバッファローカルなキーマッピングが両方ある場合、バッファローカルなキーマッピングが優先される」問題を解決する
- ただし'timeoutlen'だけ待たされる問題*2は未解決
要は「おれがかんがえたさいきょうの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
と書けます。
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で使えるようになっています。
- 「Map」
- 「AllMaps」と等価
- 「Map lhs」
- 「AllMaps lhs」と等価
- 「Map [nvo] lhs」
- nvoのlhsのみ列挙(AllMapsではモードの指定は不可能)
2番目のmodesを省略する記法は参照時のみ有効です。
これは間違えて「Map lhs rhs」としてしまい、全てのモードでマッピングを作成してしまわないための制限です。
これでAllMapsの定義を(僕の).vimrcから削除することができ、戦闘力を減らすことができました。
.vimrcの設定はガンガンプラグイン化しましょう。