Vimで独自キーマッピングに使える未割り当てキー一覧
便利な機能を独自のキーに割り当てようとして、気づかず既存の標準機能を潰してしまったことがあります。Vimはほとんどのキーに何らかの機能が割り振られているため、空いているキーを知らずに適当なキーへマッピングするのは危険です。
目次(10項目)
ノーマルモードの未割り当てキー
- Ctrl-k
- Ctrl-\
- Ctrl-_
特別な設定をしていない標準状態で、これらは何にも割り当てられていません。安心して独自のマッピングに使えます。
インサートモードの未割り当てキー
- Ctrl-b
- Ctrl-f
- Ctrl-l
- Ctrl-s
- Ctrl-Shift-b
- Ctrl-Shift-s
- Ctrl-Shift-z
- Ctrl-Shift-4
- Ctrl-Shift-8
- Ctrl-Shift-/
- Ctrl-Shift-\
インサートモードは、ノーマルモードよりも未割り当てのキーが多くなっています。凝った修飾キーの組み合わせが多いのは、単純なCtrl+アルファベットの大半がすでに何かに使われているためです。
未割り当てではないが実質使ってよいキー
同じ機能に複数のキーが割り当てられている「冗長なキー」も、実質的にはマッピングの対象にできます。代表的なものを挙げます。
| モード | 候補キー | 同機能のキー |
|---|---|---|
| ノーマル | Ctrl-i | Tab |
| ノーマル | Ctrl-n | j(補完メニュー外) |
| ノーマル | Ctrl-p | k(補完メニュー外) |
| ノーマル | Del | x |
| ノーマル | Home / End | 0 / $ |
| ノーマル | 矢印キー | hjkl |
矢印キーはhjklで完全に代替できるので、思い切って矢印キーそのものを再マッピングしてしまう人もいます。ただし他人と同じ環境を共有する場合は混乱の元になるので、個人用の設定に限定したほうが無難です。
gとの組み合わせも狙い目
ノーマルモードではgキーに続けて別のキーを組み合わせる拡張コマンド群があります。この中には未使用の組み合わせも残っており、gb・gc・gj・gk・gs・gt・gy・gzあたりは変更しても既存機能への影響が少ない候補になります。ただし将来のVimアップデートで意味が割り当てられる可能性もあるため、絶対に安全とは言い切れない点は留意してください。
マッピング前に必ず確認する
:verbose map {キー}
この一覧を鵜呑みにせず、実際にマッピングする前は:verbose mapで本当に空いているか確認する習慣をつけると安心です。プラグインによって独自にキーが使われていることもあるため、環境によって空き状況は変わります。
:verbose mapで確認します。
お気に入りのプラグイン機能をよく考えずにキーへ割り当てたら、標準の折りたたみコマンドを潰していたことに後から気づきました。それ以来、新しいマッピングを追加する前には必ず:verbose mapで確認するようになり、同じ失敗を繰り返さなくなりました。
Leaderキーを使えば衝突を避けられる
空いているキーを探すより、<Leader> を前置きするほうが確実です。<Leader> は自分で決めた前置きキーで、そのあとに続くキーは既存の機能と衝突しません。
let mapleader = " " " スペースキーを Leader にする
nnoremap <Leader>w :w<CR>
nnoremap <Leader>q :q<CR>
スペースキーが人気なのは、ノーマルモードでは l と同じ働きしかしておらず、潰しても困らないためです。設定する順番に注意が要り、mapleader はマッピングを書く前に設定しないと反映されません。
nnoremap と nmap を使い分ける
マッピングには再帰するものとしないものがあります。nmap は展開結果に別のマッピングが含まれていればそれも展開しますが、nnoremap は展開しません。
意図せず無限ループになったり、プラグインのマッピングが混ざったりするので、既定は nnoremap にしておきます。nmap が要るのは、プラグインが提供する <Plug> で始まるマッピングを呼ぶときだけです。
nnoremap <Leader>d dd " 通常はこちら
nmap <Leader>c <Plug>Commentary " <Plug> を呼ぶときだけ nmap
複数キーの待ち時間
2文字以上のマッピングを作ると、1文字目を押したあとVimが続きを待ちます。この待ち時間は timeoutlen で決まり、既定は1000ミリ秒です。
set timeout
set timeoutlen=500 " マッピングの待ち時間
set ttimeoutlen=10 " キーコードの待ち時間(Esc の反応)
2つの設定は別物です。前者はマッピングの続きを待つ時間、後者は Esc のようなキーコードの続きを待つ時間で、後者を短くすると Esc の反応が良くなります。Esc そのものを押しやすいキーで代用する方法はESCキーの代わりになるキーにまとめています。前者を短くしすぎると、打つのが遅い人のマッピングが成立しなくなるので注意が要ります。
まとめ
未割り当てキーと冗長キーを把握しておけば、既存機能を壊さずに独自マッピングを増やせます。最終確認は必ず:verbose mapで行うと安心です。