この記事では、Neovimのキーマップのカスタマイズ方法について学んでいきましょう。
キーマップ設定ファイルの作成
前回の記事で構築した~/.config/nvim/lua/userディレクトリ内にキーマップ設定用のファイルを作成します。
nvim ~/.config/nvim/lua/user/keymaps.lua
キーマップ関数
キーマップ関数はvim.api.nvim_set_keymapですが、キーマップを追加する度にタイプするには長いので、以下のように別の変数に格納します。
local keymap = vim.api.nvim_set_keymap
これで、keymapとタイプするだけで関数が使えるようになりますので、例えば以下のように簡潔に記載できるようになります。
keymap("n", "<C-l>", "<C-w>l", { noremap = true, silent = true })
上記のkeymap関数には4つの引数があります。
最初はneovimのモードを指定し、どのモードで使うkeymapかを指定します。代表的なモードは以下の通りです。
n: normalの略でノーマルモード
i: insertの略で挿入モード
v: visualの略だが、実際はビジュアルと選択モード両方に適用
x: ビジュアルモード(選択モードは除外)
s: selectの略で選択モード
t: terminal-jobの略でターミナル・ジョブモード
c: command lineの略でコマンドラインモード
2つ目の引数は新しく作成するキーマップです。上記では”<C-w>l”となっており、コントロールキーとlの同時押しを意味しています。
3つ目が、このキーマップを使った時にどのような動作に対応させるかで、既存のキーマップを記載します。上記では、コントロールとwからのlですので、画面スプリット時に左側の画面に移動するnvimの元々の動作コマンドを指しています。
4つ目の引数がオプションです。luaのテーブルを使って以下のように指定します。
{ noremap = true, silent = true }
noremapはno recursive map(再帰的にマップしない)の略で、例えば以下のような場合でnoremapと指定しないと、aを押すとbではなくcの動作になってしまいます。
keymap(“n”, “a”, “b”, { silent = true })
keymap(“n”, “b”, “c”, { silent = true })
noremapを指定すると、aはbの動作をします。
keymap(“n”, “a”, “b”, { noremap = true, silent = true })
keymap(“n”, “b”, “c”, { noremap = true, silent = true })
デフォルトのオプション設定は頻繁に使うので、以下のように変数に格納しておくと便利です。
local opts = { noremap = true, silent = true }
なお、元々のキーマップを上書きして別の動作を指定する場合を除いて、新しいキーマップを指定しても元のキーマップが無効になるわけではなく、どちらとも使うことが出来ます。
リーダーキー(leader key)を指定して使う場合は以下のようになります。
vim.g.mapleader = “ “
keymap("n", "<leader>e", ":Lex 30<cr>", opts)
この例ではleaderキーにスペースを割り当てた後、リーダーキーとeのキーマップでNetrwを左ウィンドウで30の幅で開くように指定しています。
<leader>が、指定したリーダーキーです。
また、<cr>はcarriage returnでEnterキーのことです。実際のコマンドモードではEnterを押してコマンドを実行するためです。
大文字を含むキーマップを作成したい場合は、シフトキーを以下のように指定します。
keymap("n", "<S-l>", ":bnext<CR>", opts)
これで大文字のエル(L)がマップされます。
キーマップ例
いくつかのキーマップ例をそれぞれのモードごとに記載してみます。
ノーマルモードでのキーマップ例
keymap("n", "<C-j>", "<C-w>j", opts)
通常はコントロールキーとwを押した後にjを押して下のウィンドウに移動しますが、コントロールとjの同時押しで移動出来るようにしています。
挿入モードでのキーマップ例
keymap("i", "jk", "<ESC>", opts)
通常は挿入モードからノーマルモードに移行するにはエスケープキーを押しますが、jkのシークエンスで同じ動作を実現しています。
ビジュアル・選択モードのキーマップ例
keymap("v", "<", "<gv", opts)
通常のインデントでは、一度インデントを変更すると選択が解除されてしまうので、解除されると同時に再選択し、選択解除にならないようにする。
ビジュアルモードのキーマップ例
keymap("x", "J", ":move '>+1<CR>gv-gv", opts)
一行上に移動して選択解除しない。
キーマップ設定ファイルの読み込み
keymaps.luaの設定が一通り完了したら、~/.config/nvim/init.luaファイルを開いて以下の通り記載をすれば、neovim起動時に設定が適用されるようになります。
require "user.keymaps"
以上でキーマップの設定方法についての解説を終わります。
効率的にコーディング出来るよう、ぜひご自身が使いやすいキーマップを設定みてください。
