まとめ
- <Leader> を設定する。 <Space> にした。
- 既存のマッピングを潰さない。
- プラグイン固有のキーマッピングは次のようにする。
nmap <Leader>x [xxx]
(例えば xxx という名前のプラグイン。頭文字は x である) としてプラグイン固有のプレフィックスを定義する。nmap <silent> [x]d <Plug>(xxx-function)
、つまり <プラグイン固有のプレフィックス + キー> という形でマッピングを定義する。
動機。 coc.nvim の機能をもっと試したくなった。
coc.nvim/Readme.md at 25c5fcd5cdea0b1c35244f7fbcadab08afb9f7b4 · neoclide/coc.nvim に次のようにあり、初めてキーマッピングしようと思いました。
" Remap keys for gotos nmap <silent> gd <Plug>(coc-definition) nmap <silent> gy <Plug>(coc-type-definition) nmap <silent> gi <Plug>(coc-implementation) nmap <silent> gr <Plug>(coc-references)
というのも、 coc.nvim で LSP サーバの機能をもっと使ってみたくなり、まずは、 "Jump to def" だ! と思いました。はて? どうやってジャンプしたら良いのでしょうか? <C-]> は ctag のジャンプで違いますし、試してみてももちろん違いました。
よくわかりませんでしたので、 coc.nvim の README.md を読み、これだろう! と思って試そうとしたのでした。
しかし、待てよ? と立ち止まります。
gd gy gi gr といったキーはすでにマッピングされているかもしれません。既存のマッピングを潰すのは嫌です。
調べてみますと、 gd gi gr とほとんどがすでにマッピングされているではありませんか!
Vim のキーマッピングについて調べる
そこでそもそも Vim のキーマッピングについてのベストプラクティスを探ることにしました。
Vim のプレフィックスキー。もとい、 <Leader>
Vim に tmux の Ctrl + B のようなプレフィックスキーはあるのでしょうか? ありませんでした。
けれども、似たようなものはありました。 <Leader> キーです。プレフィックスキーと同様に使え、デフォルトは \ (バックスラッシュ) だそうです。うーん、、、これはいかにも使いにくそうです。嫌です。
ちなみに確認方法です。
<Leader> に <Space> を割り当てる。
<Space> を割り当てて満足行く生活を送れている記事がありました。キーマップについて調べる発端となった、既存のキーマップを潰さないようにもできるようです。
新しいキーマップを設定する
この設定により、<Space>uc、<Space>ubでUniteのコマンドを実行することができます。 ちなみに、初めの二行は<Space>uをprefixキーとして設定して、[unite]でキーマッピングした箇所は<Space>uで置き換えるというhackです。 このように定義しておくメリットは、vimrc上見やすくなるという効果もありますが、<Space>uと打った時に[unite]と表示されるため、prefixキーを打ったということが把握できるという効果もあります。
上記記事のやり方を採用してみることにしました。
なお、 "<Space>uと打った時に[unite]と表示されるため、" という部分は再現できませんでした、残念です><。
プラグイン固有のプレフィックスを設定するので、キーマッピングが被らない、既存のマッピングも潰さない、というメリットを受けられます。逆に、プラグイン固有のプレフィックスを定義するがために、タイプするキーが長くなってしまう、というデメリットが生まれてしまいす。
この時、 <Leader> もプレフィックスキーに含められるのだろうか? と思ったのですけれども、すでに次の実例も見ていたので安心して設定できました。
結果、次のキーマップとなりました。
" キーマッピング
let mapleader = "\<Space>"
nmap <Leader>c [coc.nvim]
nnoremap [coc.nvim] <Nop>
" Remap keys for gotos
nmap <silent> [coc.nvim]d <Plug>(coc-definition)
nmap <silent> [coc.nvim]y <Plug>(coc-type-definition)
nmap <silent> [coc.nvim]i <Plug>(coc-implementation)
nmap <silent> [coc.nvim]r <Plug>(coc-references)
試したところ、例えば定義ジャンプで成功した場合は何も表示されませんでしたが、失敗した場合は "[coc.nvim] Definition not found" などとエラーが表示されました。
おわりに
Vim キーマップで最初に思い出したのは、ずいぶん前に読んでぼんやりと覚えていたスパルタン Vim 5 です。
しかし無節操なマッピングは、デフォルトのマッピングとの整合性を壊したり、その他のVimの機能との直交性を乱したりする可能性があります。たとえば挿入モードでの迂闊なマッピングは、ドットリピートを妨げることが多々あります。
こうならないように、と思い、今回調べ、記録を残しました。
以上です。