vim-users.jp

Hack #144: 分かりやすく副作用のないKey-mappingsを定義する

Posted at 2010/05/04
このエントリーをはてなブックマークに追加

Hack #59: 分かりやすいKey-mappingsを定義するの方法だとグローバルなマッピング空間を使ってしまうのが玉に瑕です。
そのせいで、例えば

nnoremap [tag] <Nop>
nmap     t     [tag]

" ...

" tag jump
nnoremap [t    <C-]>

としている場合に[tと押しても[tag]がまだ候補にあるために
&timeout&timeoutlenなどの値によりますが)すぐには実行されずに
キー入力を一瞬待たされるようになります。

この場合は[tを[Tに変えるなどすれば問題は解決しますが、
こうした副作用を気にかけながらマッピングを定義するのは少々面倒です。
なんとかして副作用のないマッピングを定義できないでしょうか。

解決

マッピングを<SID>で定義します。

nnoremap <SID>[tag] <Nop>
nmap     t          <SID>[tag]

” …

” 重複する候補がないためすぐに実行される
nnoremap [t    <C-]>

<SID>を先頭につけることでスクリプトローカルなマッピングを定義することができます。

発展

これを使ってさらに.vimrcを見通しをよくすることもできます。

nnoremap <SID>[yank-$] y$
nnoremap <SID>[register-+] "+
nnoremap <SID>[register-*] "*

nmap Y  <SID>[yank-$]
nmap ;Y <SID>[register-+]<SID>[yank-$]
nmap ,Y <SID>[register-*]<SID>[yank-$]

複雑なマッピングを定義する時は<SID>マッピングを使うことで
見通しがよく副作用のないマッピングを定義することができます。

tyru

もどる
blog comments powered by Disqus