🐡
nvimのカスタマイズを学びます ~keymap編~
今回からnvimのカスタマイズの方法について勉強していこうと思っています。まずはkeymapの設定方法について勉強してみました。
設定ファイルの構築
まず、nvimの設定は$HOME/.config/nvim
にて実装しています。キーマップはその中でlua/config/keymaps.lua
で実装しています。
キーマップの設定方法
まずはキーマップの設定方法について調べてみました。vimにはいくつかのモードがあり、どのモードの元でキーマップを設定するかを指定することができます。各モードごとにどのように設定するは以下のフォーマットでできるようです。
基本フォーマット: vim.keymap.set("<モード>", "<マッピングするキーマップ>", "<実行されるコマンド>")
-
n
(ノーマルモード): デフォルトモード -
v
(ビジュアルモード): テキストの選択を行うモード -
x
(ビジュアルモード): ブロック選択 -
i
(インサートモード): テキストを入力するモード -
s
(セレクトモード): 特定の機能によるテキスト選択が行われるモード -
o
(オペレーターペンディングモード): オペレータの対象範囲を待機する状態 -
t
(端末モード): 端末エミュレータとして使用されるモード -
c
(コマンドラインモード): コマンドを入力するモード
なお、モードの情報は以下の@4roro4さんの記事を参考にしました。
今回はこの中でノーマルモードについてコマンドを実装してみます。理由としては、普段自分がそれくらいしか使っていないからです(もっと使えるようにします、、、)。
ノーマルモードで利用できるコマンドの作成
ノーマルモードでコマンドを実装するにはモードにn
を設定します。以下で私が普段使っているコマンドをまとめてみます。
- 全テキストを選択:
keymap.set("n", "<C-a>", "gg<S-v>G")
- 現在の行の下に空白を挿入するが、インサートモードにはしない:
keymap.set("n", "<C-o>", "o<Esc>")
-
:tabedit
を実行:keymap.set("n", "te", ":tabedit")
-
:split
を実行:keymap.set("n", "sp", ":split ")
-
:vsplit
を実行:keymap.set("n", "vs", ":vsplit ")
- 10行下に移動:
keymap.set("n", "<leader>j", "10j")
- 10行下に移動:
keymap.set("n", "<leader>k", "10k")
- 今のカーソルの右側にスペースを挿入:
keymap.set("n", "aa", "a <Esc>")
- 現在選択しているカッコに対応する範囲を選択する:
keymap.set("n", "<leader>%", "v%")
-
nvim
について作成している設定ファイルのフォルダに対してtelescopeを実行
keymap.set("n", "<leader>fv", function()
require("telescope.builtin").find_files({
cwd = "/Users/.../.config/nvim"
})
end, { desc = "Find config files ~/.config/nvim"})
-
zsh
について作成している設定ファイルのフォルダに対してtelescopeを実行
keymap.set("n", "<leader>fz", function()
require("telescope.builtin").find_files({
cwd = "/Users/.../.config/zsh"
})
end, { desc = "Find config files ~/.config/zsh"})
最後の二つのように、実行するコマンドについて関数として定義することができます。
コマンド実装に必要な知識
コマンド実装する中で覚えておきたいことをメモしておきます。
-
vim.keymap
にキーマップを設定する -
noremap
はマッピング先にさらにマッピングがあってもそれは実行されないようにする -
<leader>
はカスタムショートカットの起点として判定されるもの。私はスペースキーになっています -
vim.fn.input("入力してね:")
でユーザに入力を促すことができる
まとめ
今回はvimのキーマップについてluaで実装する方法を調べてみました。まだ初めてでどんなコマンドを実装するかは悩んでいますが、自分の開発がもっと早くできるようになるためにいろいろ考えてみたいと思います。作成したコマンドはdotfilesとしてGitHub上でまとめておきます。ぜひみなさんのおすすめコマンドも教えてください。
Discussion