キーマップに関するヘルプは、以下のコマンドで参照することができます。
:help map.txt
:help key-mapping
キーマップの設定を行うには、主に以下のようなコマンドを使用します。 コマンドを使い分けることによって、特定のモードでだけ有効なマッピングを定義できます。
map
: ノーマルモード、ビジュアルモード用のキーマッピングnmap
: ノーマルモード用のキーマッピングvmap
: ビジュアルモード用のキーマッピングimap
: インサートモード用のキーマッピングcmap
: コマンドライン用のキーマッピングよく使用するのは、ノーマルモードのマップ定義を行う nmap
と、インサートモードのマップ定義を行う imap
です。
マッピングの定義は、以下のような形式で行います。
:nmap <入力するキーシーケンス> <実行するコマンド>
:imap <入力するキーシーケンス> <実行するコマンド>
例えば、下記のように実行したあとで、インサートモードで Ctrl キーを押しながら F10 キーを2回押すと、カーソル位置に Hello World と入力されます(別に単純に F10 キー1つに割り当ててもよいのですが、ここではこんなキーシーケンスにマッピングできるということの説明のためにやっています)。
:imap <C-F10><C-F10> Hello World
同様のことをノーマルモードでも実行できるようにするには、下記のように先に i
コマンドでインサートモードに入らないといけないことに注意してください。
最後には <Esc>
でノーマルモードに戻ってあげると行儀が良いです。
:nmap <C-F10><C-F10> iHello World<Esc>
下記はいろいろなキーマップ設定の例です。
" '-' キーでカーソル位置の単語を削除
nmap - diw
" 'F1' キーで 'Hello' を挿入
nmap <F1> iHello<Esc>
" Ctrl+Tab で次のバッファへ切り替え
map <C-Tab> :bn<CR>
" Ctrl+Shift+Tab で前のバッファへ切り替え
map <C-S-Tab> :bp<CR>
map 系コマンド(map
, nmap
, vmap
, imap
, cmap
等)によるマッピングは、右値に指定されたコマンドが既にマッピング定義されていると、そのマッピング値が使用されます。
つまり、マッピング定義が伝播します。
例えば、
:imap <C-T> Hello
:imap <F1> <C-T>
と定義してあるときに、インサートモードで F1
キーを入力すると、F1
キーにマッピングされているコマンド Ctrl-T
は既に Hello
にマッピングされているので、Hello
と入力されます。
このようなマッピングの伝播を防ぐには、map
系コマンドの代わりに、noremap
系コマンドを使用します。
:imap <C-T> Hello
:inoremap <F1> <C-T>
上記のように設定すると、F1
キーを入力したとき、Vim がデフォルトで Ctrl-T
に割り当てている機能である「インデント」の振る舞いをします。
下記は、:help index
のヘルプページからの、i_CTRL-T
キーに割り当てられたデフォルト機能の説明の抜粋です。
i_CTRL-T
: 現在の行に shiftwidth 分のインデントを挿入する。map 系のコマンドと同様に、noremap 系のコマンドも各モード用にキーマップ定義を行うためのコマンドが用意されています。
map 系コマンド | noremap 系コマンド | 説明 |
---|---|---|
map |
noremap |
ノーマルモード、ビジュアルモード用のキーマッピング |
nmap |
nnoremap |
ノーマルモード用のキーマッピング |
vmap |
vnoremap |
ビジュアルモード用のキーマッピング |
imap |
inoremap |
インサートモード用のキーマッピング |
cmap |
cnoremap |
コマンドライン用のキーマッピング |