- 2010-05-04 (火) 0:00
- Vim Hacks | Vim script
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>マッピングを使うことで
見通しがよく副作用のないマッピングを定義することができます。
Comments:3
- eldesh 10-05-06 (木) 14:59
-
非常に参考になりましたが, 一箇所気になったところがあります. > を先頭につけることでスクリプトローカルなマッピングを定義することができます。 この場合, スクリプトローカルという言葉は誤解を招くのでは無いでしょうか? vimスクリプトに詳しくない人が見た場合, この言葉を見ると「特定のスクリプトファイルの中でのみ有効なマッピングができる」と読めると思います. というか私が混乱しました(汗
- hatena.ne.jp/tyru/ 10-05-08 (土) 4:05
-
「特定のスクリプトファイルの中でのみ有効なマッピングができる」
いえ、この解釈で合ってます。
ただ厳密に言うと例えば「<SID>foo」というマッピングは「<SNR>{スクリプト番号}_foo」というマッピングとして扱われます。 「{スクリプト番号}」というのは:scriptnamesして出たパスの左に表示されている番号です。 例えばfoo.vimというファイルが3というスクリプト番号だった場合に、ファイル中で「map <SID>foo bar」するとそれは「map <SNR>3_foo bar」と同じことです。 また実際にそれでマッピングもできます。 なので他のファイルからも「map <SNR>3_foo bar」はできるので、厳密に言えば「スクリプトローカル」ではなかったりします。 もしその理由でスクリプトローカルではない、という意図でしたらすみません。
ただし先頭の「<SID>(内部的には<SNR>{スクリプト番号}_)」はキーボードから入力することはできません。 なので「<SID>」または「<SNR>{スクリプト番号}_」(普通これでマッピングをすることはありませんが)でマッピングすることで、 [tag]のように候補が他にあるかもしれないといった心配がない点で副作用のないKey-mapping、という意図でした。
- eldesh 10-05-13 (木) 10:06
-
>厳密に言えば「スクリプトローカル」ではなかったりします。 もしその理由でスクリプトローカルではない、という意図でしたらすみません。 はい. 可能な方法があるならパブリックなのかなという感覚でしたが, よく見たらヘルプにも”スクリプトローカル”と書かれてますし, Vimとしてはそちらの方が一般的なんですね. 正しくは「スクリプトの中からしか呼び出せない」という意図で書かれたものと解釈したので最初のポストになりました.
Trackbacks:0
- Trackback URL for this entry
- http://vim-users.jp/2010/05/hack-144/trackback/
- Listed below are links to weblogs that reference
- Hack #144: 分かりやすく副作用のないKey-mappingsを定義する from Vim-users.jp

