設定したキーマッピングの一覧を確認する(:map / :verbose map)
あるキーを押したら想定と違う動作をして、どこで設定したマッピングか分からず困ったことがあります。プラグインと自作の設定が両方入っている環境では、原因の切り分けに一覧表示が欠かせません。
検証環境:macOS + Vim 9.1.1752。一覧の記号の意味、:verboseの出力、:filterでの絞り込みは、実際にマッピングを定義して確かめた結果です。
目次(9項目)
| コマンド | これだけ覚える |
|---|---|
:verbose map {キー} | そのキーの定義元を特定する |
:nmap / :vmap / :imap | モード別に一覧表示する |
:unmap {キー} | マッピングを削除する |
全マッピングを表示する
:map
現在有効なキーマッピングを一覧表示します。ただし、これだけでは全モード共通のマッピングしか見えないことがあるため、モードごとに確認したい場合は専用のコマンドを使います。
モード別に表示する
| コマンド | 対象モード | 一覧の1文字目 |
|---|---|---|
:nmap | ノーマルモード | n |
:vmap | ビジュアル+選択モード | v |
:xmap | ビジュアルモードのみ | x |
:omap | オペレータ待機モード | o |
:imap | インサートモード | i |
:cmap | コマンドラインモード | c |
:tmap | 端末ジョブモード(:terminalの中) | t |
それぞれ:nm・:vm・:imのように省略できます。一覧の左端に出る1文字がモードを表していて、ここが空白のものは「ノーマル・ビジュアル・選択・オペレータ待機」の4モード共通、つまり:mapで定義されたマッピングです。
定義元のファイルまで表示する
:verbose map
:verbose nmap
verboseを先頭に付けると、そのマッピングがどの設定ファイル(vimrc本体か、どのプラグインか)で定義されたかまで表示されます。手元のVim 9.1で確認した出力がこちらです。
:verbose nmap <Leader>x
n \x * :echo "noremap"<CR>
Last set from ~/vrc.vim line 1
ファイル名だけでなく行番号まで出ます。プラグインが定義したものなら、そのプラグインのファイルパスがそのまま出るので、どのプラグインが原因かも一目で分かります。原因不明のキー衝突が起きたときは、まずこれで犯人を特定するのが最短ルートになります。
特定のキーだけ確認する
:verbose map <Esc>
:verbose nmap <Leader>a
全部を一覧表示すると量が多すぎることがあるので、疑わしいキーだけを指定して確認すると効率的です。マッピングを追加する前に「本当に空いているか」を確認する用途にも使えます。
キーワードで絞り込む
キーを1つに特定できないときは:filterが便利です。パターンにマッチするマッピングだけが表示されます。
:filter /git/ nmap
手元でgit関連のマッピングを3つ定義した状態で試すと、該当する2つだけが並びました。プラグインが大量にマッピングを定義している環境で「あのプラグインのキーは何だったか」を探すときに効きます。
他のモードも網羅する
ここまで紹介したもの以外にも、細かくモード別のコマンドが用意されています。
:omap:オペレータ待機モード:cmap:コマンドラインモード
特殊なマッピングがどのモードにも表示されず見当たらないときは、こうしたあまり意識しないモードも疑ってみると見つかりやすくなります。
出力の読み方(*と@の意味)
一覧の見た目は素っ気ないですが、実は{rhs}の直前に付く記号で性質が分かります。手元のVim 9.1で、再帰マッピング・非再帰マッピング・バッファローカルの3つを定義して:nmapを実行した結果です。
n \z *@:echo "buffer-local"<CR>
n \y :echo "map"<CR>
n \x * :echo "noremap"<CR>
公式ヘルプ(:help map-listing)が記号の意味を定義しています。
| 記号 | 意味 |
|---|---|
| * | 再マップされない(noremap系で定義された) |
& | スクリプトローカルなマッピングだけが再マップされる |
@ | バッファローカルなマッピング |
つまり*が付いていればnoremap系、付いていなければmap系です。上の出力でも\yだけ印が無く、これがnmapで定義したものだと一目で分かります。@が付いているものは今開いているバッファ限定なので、別のファイルを開くと消えます。「さっきまで効いていたのに効かない」ときはこれを疑ってください。
:verbose map {キー}で定義元を特定します。マッピングを追加する前の下調べにも使えます。
プラグインを増やしていくうちに、あるキーが期待通りに動かなくなったことがあります。:verbose mapで調べたら、後から入れた別のプラグインが同じキーを上書きしていたと分かりました。原因を推測で探すより、この一覧で機械的に特定したほうが圧倒的に早く解決できました。それ以来、新しいプラグインを入れるたびに主要なキーの一覧をざっと見るようにしています。
マッピングを削除したいとき
:unmap {キー}
:unmap! {キー}
調査の結果、不要なマッピングだと分かったら:unmapで削除できます。ただし設定ファイルで定義されているものは、ファイルを再読み込みするたびに復活してしまうため、恒久的に消したい場合は設定ファイル自体を編集する必要があります。
まとめ
キーマッピングのトラブルシューティングは:verbose mapが基本になります。原因不明の挙動に遭遇したら、まずこのコマンドで定義元を洗い出すと確実です。