ITエンジニアによるITエンジニアのためのブログ

Neovimキーマップのカスタマイズ

この記事では、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"

以上でキーマップの設定方法についての解説を終わります。

効率的にコーディング出来るよう、ぜひご自身が使いやすいキーマップを設定みてください。