はじめに
Neovimのキーマップはデフォルトでも使いやすいのですが、カスタマイズすることでさらに快適に編集できるようになります。
この記事では、僕が実際に使っているNeovimのキーマップを紹介します。
この記事で紹介するキーマップは、基本的にNeovim標準機能で使えるものに限定しています。
環境
NVIM v0.12.2Build type: RelWithDebInfoLuaJIT 2.1.1774896198僕はLinux(Cachy OS)とMacを併用しているので、どちらでも使えるキーマップとなっています。
設定ファイルはLuaで記述しています。
キーマップ
インサートモードから抜ける
vim.keymap.set("i", "jk", "<ESC>")Neovim(というかVim)はESCキーでインサートモードから抜けることができます。
しかし、ご存知の通りESCキーはキーボードの左上に追いやられているため、非常に押しづらいです。
そこで押しやすいけど絶対に入力で使わないキーの組み合わせをESCキーの代わりにすることがよくあります。
他の例としては、jj(連打で入力できる)やfj(人差し指のみで押せるので押しやすいが、両手が必要)などがあります。
このあたりは好みや思想が出るので、調べてみると結構おもしろいです。
僕の場合は、最も入力が速いのがjkだと感じたのでこちらを採用しています。
また、jkの入力ミスでkjと入力してしまうことがある場合は、そちらもESCに設定している人もいるようです。
ターミナルモードから抜ける
vim.keymap.set("t", "<C-\\>", "<C-\\><C-n>")ターミナルモードから抜けるためのキーマップです。
インサートモードのときと同じようにjkで抜けるようにすると、ターミナル内でネストしてNeovimを開いているときなどにうまくいかないので、別のキーに割りあてています。
redoのキーマップを直感的にする
vim.keymap.set("n", "U", "<C-r>")Neovim(Vim)では、uでundo、<C-r>でredoができます。
しかし、uの対になる操作が<C-r>なのはあまり直感的ではないため、Uをredoに割り当てています。
helixというエディタで使われているキーマップを参考にしました。
スクロール後にカーソルを中央にする
vim.keymap.set("n", "<C-u>", "<C-u>zz")vim.keymap.set("n", "<C-d>", "<C-d>zz")スクロール後にカーソルが中央に来るよう、zzを追加しています。
検索のハイライトを消す
vim.keymap.set("n", "<ESC>", "<Cmd>noh<CR>")検索のハイライトがずっと残っていると邪魔なので、ESCキーで消せるようにしています。
ヤンクした内容をペースト
vim.keymap.set({ "n", "x" }, "<leader>p", '"0p')vim.keymap.set({ "n", "x" }, "<leader>P", '"0P')ヤンクした内容をペーストする際、ddなどの操作により通常のレジスタが上書きされてしまうことがあります。
ヤンクレジスタ("0)にはヤンクした内容のみが保存されるため、こちらを参照することで削除操作などの影響を受けずにペーストできます。
毎回"0pと入力するのは面倒なので、<leader>pと<leader>Pに割り当てています。
置換コマンドを入力
vim.keymap.set("n", "<leader>rr", ":%s/")vim.keymap.set("x", "<leader>rr", ":s/")vim.keymap.set("n", "<leader>rv", ":%s/\\v")vim.keymap.set("x", "<leader>rv", ":s/\\v")vim.keymap.set("n", "<leader>rV", ":%s/\\V")vim.keymap.set("x", "<leader>rV", ":s/\\V")置換コマンドを毎回入力するのがめんどくさいので、キーマップを設定しています。
水平・垂直にウィンドウを分割
vim.keymap.set("n", "<leader>-", ":split<CR><C-w>j")vim.keymap.set("n", "<leader>\\", ":vsplit<CR><C-w>l")画面を分割したあと、自動でカーソルが新しいウィンドウへ移動するようにしています。
ウィンドウ間の移動
vim.keymap.set("n", "<C-h>", "<C-w>h")vim.keymap.set("n", "<C-j>", "<C-w>j")vim.keymap.set("n", "<C-k>", "<C-w>k")vim.keymap.set("n", "<C-l>", "<C-w>l")vim.keymap.set("t", "<C-h>", [[<Cmd>wincmd h<CR>]])vim.keymap.set("t", "<C-j>", [[<Cmd>wincmd j<CR>]])vim.keymap.set("t", "<C-k>", [[<Cmd>wincmd k<CR>]])vim.keymap.set("t", "<C-l>", [[<Cmd>wincmd l<CR>]])ウィンドウ間の移動は頻繁に行うので、<C-w>のprefixを入力しないで済むようにしています。
シグネチャヘルプを表示
vim.keymap.set("n", "gK", vim.lsp.buf.signature_help)vim.keymap.set("i", "<C-k>", vim.lsp.buf.signature_help)シグネチャヘルプ(関数の引数情報とかを確認するやつ)を表示するキーマップです。
診断を移動
local diagnostic_goto = function(next, severity) return function() vim.diagnostic.jump({ count = next and 1 or -1, float = true, severity = severity and vim.diagnostic.severity[severity] or nil, }) endendvim.keymap.set("n", "]d", diagnostic_goto(true))vim.keymap.set("n", "[d", diagnostic_goto(false))vim.keymap.set("n", "]e", diagnostic_goto(true, "ERROR"))vim.keymap.set("n", "[e", diagnostic_goto(false, "ERROR"))vim.keymap.set("n", "]w", diagnostic_goto(true, "WARN"))vim.keymap.set("n", "[w", diagnostic_goto(false, "WARN"))診断(エラーや警告などのメッセージ)を移動するキーマップです。全診断の移動と、診断レベル(ERRORとWARN)ごとの移動を設定しています。
まとめ
僕が普段使っているキーマップを紹介しました。
これらはすべて僕が考えたものではなく、様々なdotfilesリポジトリや別のエディタなどを参考にしています。
先人たちの発想と工夫に感謝いたします。