まくまくVimノート
キーマップの基本 (map, noremap)
2013-07-18

キーマップに関するヘルプ

キーマップに関するヘルプは、以下のコマンドで参照することができます。

:help map.txt
:help key-mapping

map 系コマンドによるキーマッピング

キーマップの設定を行うには、主に以下のようなコマンドを使用します。 コマンドを使い分けることによって、特定のモードでだけ有効なマッピングを定義できます。

  • 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>

下記はいろいろなキーマップ設定の例です。

キーマップ設定の例 (~/.vimrc)

" '-' キーでカーソル位置の単語を削除
nmap - diw

" 'F1' キーで 'Hello' を挿入
nmap <F1> iHello<Esc>

" Ctrl+Tab で次のバッファへ切り替え
map <C-Tab> :bn<CR>

" Ctrl+Shift+Tab で前のバッファへ切り替え
map <C-S-Tab> :bp<CR>

noremap 系コマンドによるキーマッピング

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 コマンドライン用のキーマッピング

参考

2013-07-18