Vim で <Leader> キーを使ったキーコンビネーションを定義する (mapleader)

Vim の Leader キー は、キーマッピングを定義するときに使用可能なプレフィックスキーです。

Leader キーとは

例えば、.vimrc で次のようなキーマップ設定があったとします。

.vimrc(Leader キーの使用例)
nmap <Leader>a :echo "Hello"<CR>
nmap <Leader>b :echo "World"<CR>

これは、Leader キーに続けて a キーや b キーを入力することで、HelloWorld と表示するキーコンビネーションを定義しています。 つまり、Leader キーはキーコンビネーションのためのプレフィックスキー です(実際には任意の位置で使えます)。

Leader キーには、デフォルトでバックスラッシュ (\) が割り当てられているため、上記の設定を行った場合は、\a と入力することで Hello と表示されることになります。 次のように直接バックスラッシュキー (<Bslash>) を使って定義するのとは何が違うのでしょうか?

.vimrc
nmap <Bslash>a :echo "Hello"<CR>
nmap <Bslash>b :echo "World"<CR>

Leader キーを使ったキーマッピングには、次のような利点があります。

  • Leader キーは単なるプレフィックキーだということを強調できる(特に自分の .vimrc を公開するとき)
  • Leader キーだけを変更したくなったときに、まとめて置き換えられる(Leader キーは任意のキーに設定できます)
  • 他のユーザーの .vimrc 設定を使いまわしやすい(自分の好きな Leader キーで使える)
  • Plugin の中でキーマッピングを定義するときに Leader キーを使うことで、ユーザーによるキー設定の余地を残す

Leader キーを設定する (mapleader)

Leader キーを任意のキーに設定するには、次のように g:mapleader 変数を設定します。 デフォルトではバックスラッシュキーが使用されますが、決して押しやすいキーではないので、スペースキーやカンマを Leader キーとして使用する人が多いようです。

let g:mapleader = "\<Space>"
let g:mapleader = ","

スペースキーを表現するときは、"\<Space>" と記述することに注意してください。 同様に、CTRL-W という入力は "\<C-W>" と記述します(参考: :help expr-quote, :help key-notation)。

g:mapleader 変数は、nmapnnoremap コマンドなどで <Leader> を参照する前に定義しておく必要がありますmapleader 変数を設定する前に <Leader> を参照すると、デフォルトのバックスラッシュキーに置き換えられてしまいます。

☝️ スペースキーのデフォルトの振る舞い ノーマルモードのスペースキーには、デフォルトでは L キーと同じ振る舞い(カーソルを右へ移動させる)が割り当てられています。 Leader キーをスペースキーに割り当てた場合でも、スペースキーを押してから 1 秒間放置することで、このデフォルトの振る舞いを実行することができます。 このあたりの振る舞いは、timeoutttimeouttimeoutlen などのオプションで調整できます。

Leader キーを使ったキーマップの例

" Leader キーをスペースキーに変更 (注: <Leader> を参照する前に設定する)
let g:mapleader = "\<Space>"

" タブの切り替え
nnoremap <Leader>h :<C-u>tabprev<CR>
nnoremap <Leader>l :<C-u>tabnext<CR>

" NERDTree 用のキーマップ
nnoremap <Leader>nt :<C-u>NERDTreeToggle<CR>
nnoremap <Leader>nf :<C-u>NERDTreeFind<CR>

<Leader> は小文字で <leader> と記述することもできます。

Leader キーにどのキーが設定されているか調べる

Leader キーの現在の割り当てを調べるには次のように実行します。

Leader キーの割り当てを表示
:echo g:mapleader

Leader キーにスペースキーが割り当てられている場合は、空白文字が出力されるので、実際には何も表示されていないように見えるので注意してください。

何も設定されていない場合(デフォルトでバックスラッシュ \ が割り当てられている状態)は、次のようなエラー表示になります。

E121: 未定義の変数です: g:mapleader
E121: Undefined variable: g:mapleader

おまけ

LocalLeader キー

<Leader> とは別に、バッファローカルな Leader キーとして参照可能な <LocalLeader> が用意されています。 <LocalLeader> 用のキーは、b:maplocalleader 変数で設定します。

" LocalLeader キーをカンマに変更
let b:maplocalleader = ","

" バッファローカルなキーマップ
nnoremap <buffer> <LocalLeader>h :<C-u>tabprev<CR>
nnoremap <buffer> <LocalLeader>l :<C-u>tabnext<CR>

VS Code での Leader キー設定

VS Code (Visual Studio Code) の Vim プラグインでも、Leader キーの設定ができます。

settings.json(VS Code の設定ファイル抜粋)
{
  /*
   * Vim 拡張用の設定。
   */
  "vim.leader": "<Space>",  // Leader キーとしてスペースキーを使う
  "vim.useSystemClipboard": true,  // システムクリップボードを使う

  // ...
}