🐡

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さんの記事を参考にしました。

https://qiita.com/4roro4/items/4c535300ccf210bcbcf4

今回はこの中でノーマルモードについてコマンドを実装してみます。理由としては、普段自分がそれくらいしか使っていないからです(もっと使えるようにします、、、)。

ノーマルモードで利用できるコマンドの作成

ノーマルモードでコマンドを実装するにはモードに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