Vim のキーマップとは
Vim の *map
系コマンドを使うと、キーマップ(キーバインド)を定義できます。
キーマップとは、特定のキー入力(キーシーケンス)を別のキー入力に変換する機能です。
例えば、<F1>
キーを押すことで :help
コマンドを実行するように設定することができます。
頻繁に使うコマンドを短いキーシーケンスに割り当てることで、効率的に作業できるようになります。
Vim では、ノーマルモード、インサートモード、ビジュアルモード、コマンドラインモードなど、それぞれのモードごとにキーマップを定義できます。
また、noremap
系コマンドを使うことで、マッピングの伝播を防ぐことができます。
キーマップのヘルプ
Vim のキーマップに関するヘルプドキュメントは、以下のコマンドで表示することができます。 必要に応じて参照してください。
:help map.txt
:help key-mapping
map 系コマンドによるキーマッピング
キーマップの設定を行うには、主に以下のようなコマンドを使用します。 コマンドを使い分けることによって、特定のモードでだけ有効なマッピングを定義できます。
map
… ノーマルモード、ビジュアルモード用のキーマッピングnmap
… ノーマルモード用のキーマッピングvmap
… ビジュアルモード用のキーマッピングimap
… インサートモード用のキーマッピングcmap
… コマンドラインモード用のキーマッピング
よく使用するのは、ノーマルモード用のマップ定義を行う nmap
と、インサートモード用のマップ定義を行う imap
です。
マッピングの定義は、以下のような形式で行います。
例えば、下記のように実行したあとで、インサートモードで Ctrl
キーを押しながら F10
キーを 2 回押すと、カーソル位置に Hello World
が挿入されます。
<C-F10>
は Ctrl
キーを押しながら F10
キーを押すことを表します。
このようなキー入力の表現方法は、:help key-notation
で詳しく説明されています。もっと単純に F10
キー 1 つに割り当ててもよかったのですが、ここではこんな複雑なキーシーケンスにもマッピングできるよという例を示しています。
同様のキーシーケンスをノーマルモード用に割り当てる場合は、下記のように先に i
コマンドでインサートモードに入らないといけないことに注意してください。
最後には <Esc>
でノーマルモードに戻ってあげると行儀が良いです。
下記はいろいろなキーマップ設定の例です。
noremap 系コマンドによるキーマッピング
map 系コマンド(map
, nmap
, vmap
, imap
, cmap
等)によるマッピングは、右値に指定されたコマンドが既にマッピング定義されていると、そのマッピング値が使用されます。
つまり、マッピング定義が伝播します。
例えば、
:imap <C-T> Hello
:imap <F1> <C-T> " Hello という入力に置き換えられる
と定義してあるときに、インサートモードで F1
キーを入力すると、F1
キーにマッピングされているコマンド Ctrl-T
は既に Hello
にマッピングされているので、Hello
と入力されます。
このようなマッピングの伝播を防ぐには、map
系コマンドの代わりに、noremap
系コマンドを使用します。
:imap <C-T> Hello
:inoremap <F1> <C-T> " Ctrl-T の入力として扱われる
上記のように設定すると、F1
キーを入力したとき、Vim がデフォルトで Ctrl-T
に割り当てている機能である「インデント」の振る舞いをします。
Ctrl-T
を入力したときの振る舞いは、:help i_CTRL-T
で調べることができます。
デフォルトでは、現在の行に shiftwidth
分のインデントを挿入する機能に割り当てられています。
似たようなキー割り当ての一覧は、:help index
で調べることができます。map 系のコマンドと同様に、noremap 系のコマンドも各モード用にキーマップ定義を行うためのコマンドが用意されています。
noremap
… ノーマルモード、ビジュアルモード用のキーマッピング(マッピング伝播なし)nnoremap
… ノーマルモード用のキーマッピング(マッピング伝播なし)vnoremap
… ビジュアルモード用のキーマッピング(マッピング伝播なし)inoremap
… インサートモード用のキーマッピング(マッピング伝播なし)cnoremap
… コマンドラインモード用のキーマッピング(マッピング伝播なし)