LazyVim と neovim のTips
#lazyvim #neovim
neovimは起動時に、~/.config/nvim/init.luaを探して読み込む
基本中の基本なので覚えておいてください。
bash起動時の.bashrc, .bash_profile... みたいなもんです。
同じ設定属性(ex: vim.opt.number ...)の設定がされている場合は、後から設定された値が優先される
luaも普通のプログラミング言語なので、まぁ直感的に当然であると思えば良い。
別々のファイルで同じ属性の設定をしてたなら、後で読み込まれたファイルの方の値が優先される。
neovimを起動してる時に、ファイルで設定されていた属性を手動で変更したら、それが優先される。
code: 仕組み
1. neovim が init.lua を読み込み、init.lua に紐づくluaファイルも読み込む
2. 読み込んだ際の設定値が、後ろ優先でneovimに登録される(= グローバル設定)
3. neovim 利用中に、コマンドで 設定値を変更したら、その起動中だけ変更が反映される(= ローカル設定)
至ってシンプル。プログラムの基本。
autocmdはイベントと処理内容のセットであり、neovim起動してすぐトリガーされるわけではない
autocmdはめっちゃ重要であり、ここの理解を怠るとしんどくなるので逃げないように。
そんな難しいものではない。ただのトリガー登録してるだけだから。
「どういうトリガー・イベントがあるのか」「それはいつ発火するのか」を覚えさえすれば、基本的にはOK。
よくあるのは、設定値がneovimに反映されないっていう状況
これはautocmdによって、何かのタイミングで設定値が上書きされてる可能性あり。
同じイベントに対してautocmdが登録されてる場合は、登録された順に実行される
code: lua
-- 1つ目(先に登録)
vim.api.nvim_create_autocmd("FileType", {
pattern = "markdown",
callback = function() print("A") end,
})
-- 2つ目(後に登録)
vim.api.nvim_create_autocmd("FileType", {
pattern = "markdown",
callback = function() print("B") end,
})
-- 結果: A → B の順で両方実行される
グループ名の存在しない「autocmd」は制御しにくい(削除したい時とか厳しい)ので、グループ名はつけましょう
code: lua
vim.api.nvim_create_autocmd("FileType", {
group = vim.api.nvim_create_augroup("hogehoge"),
pattern = { ... },
callback = function()
...
end,
})
2つ以上のautocmd間でグループ名が衝突した場合の挙動は、vim.api.nvim_create_augroupのclear値によって変わる。
code: lua
vim.api.nvim_create_augroup("my_group", { clear = true }) -- 既存を削除する
vim.api.nvim_create_augroup("my_group", { clear = false }) -- 既存を残す
って感じ。
clear=falseで作った場合は、1つのグループに2つ以上のautocmdが存在することになる。
もし、グループに関連するautocmdを削除する際は、全て削除される。
LazyVIm 利用時のよくあるluaファイル読み込み順序
code: a
1. init.lua
└── require("config.lazy")
2. lazy.nvim の setup() 実行
├── LazyVim/LazyVim プラグイン読み込み
│ ├── lazyvim/config/options.lua ← LazyVim のデフォルト
│ ├── lazyvim/config/keymaps.lua
│ └── lazyvim/config/autocmds.lua
│
├── config/options.lua ← あなたのカスタム設定(LazyVim の後に読まれる)
├── config/keymaps.lua
└── config/autocmds.lua
3. プラグイン読み込み
├── lazyvim/plugins/*.lua ← LazyVim のプラグイン設定
└── plugins/*.lua ← あなたのプラグイン設定(後から上書き可能)
LazyVimのプラグイン設定時の基本は、opts はマージ、config は上書き
重要.icon これめっちゃ重要なので気をつけて。
code: lua
-- LazyVim の設定
{ "some-plugin", opts = { a = 1, b = 2 } }
-- あなたの設定
{ "some-plugin", opts = { b = 3, c = 4 } }
-- 結果: { a = 1, b = 3, c = 4 }(マージされる)
neovimがrequireした際は、runtimepathの順に調べていくことになる。
:lua print(vim.inspect(vim.api.nvim_list_runtime_paths()))で調べれる。
基本的に~/.config/nvimが最初の探索ディレクトリ
その次に、~/.local/share/nvimの中身が探られていく。
例えば、require("config.options")と実行があったら...
最初に~/.config/nvimの中にconfig.options.luaがあるかチェックされるてこと。
autocmdのイベントタイプにUserというのがあり、これはuserのタイミングで発火できる。カスタムイベント。
こういう定義がされてるautocmdがあるとする。これは自動では発火しない。
code: sample.lua
vim.api.nvim_create_autocmd("User", {
pattern = "VeryLazy",
callback = function()
M.load("autocmds") -- ← 後で読み込む
M.load("keymaps") -- ← 後で読み込む
end,
})
任意のタイミングで実行される必要がある。
code: samle.lua
vim.api.nvim_exec_autocmds("User", { pattern = "VeryLazy" })
ちなみに、pattternはなんでもいい。
LazyVimのlua読み込みのイメージは以下
code: a
M.init()
└── M.load("options")
├── lazyvim.config.options
└── config.options(あなたの設定)
M.setup() → VeryLazy イベント
├── M.load("autocmds")
│ ├── lazyvim.config.autocmds
│ └── config.autocmds(あなたの設定)
└── M.load("keymaps")
├── lazyvim.config.keymaps
└── config.keymaps(あなたの設定)
VeryLazyの発火は、LazyVimではなく、lazy.nvimがやります。ややこしいけど。
autocmdsの読み込みには条件があります。
code: lua
-- ファイルを開かずに起動したら遅延読み込み
local lazy_autocmds = vim.fn.argc(-1) == 0
if not lazy_autocmds then
M.load("autocmds") -- ファイルを開いて起動したらすぐ読み込む
end
table:
起動方法 autocmds keymaps
nvim (引数なし) VeryLazy VeryLazy
nvim file.lua (ファイル指定) すぐ VeryLazy
ファイルを開いて起動した場合、autocmds はすぐ必要(FileType イベントなど)なので、VeryLazy を待たずに読み込む
lazy.nvim
hr.icon
neovimのpluginマネージャー。なので、pluginを管理していると思えばよい。
ただ、それに加えて、pluginのloadタイミングも管理している。
code: lua
require("lazy").setup({
spec = {
{ "LazyVim/LazyVim", import = "lazyvim.plugins" },
-- { import = "lazyvim.plugins.extras.linting.eslint" },
{ import = "plugins" },
},
defaults = {
lazy = true,
version = "*",
},
change_detection = {
notify = false,
},
})
こういう感じで、specでloadしたいpluginを指定しつつ、他の設定もできるって感じ。
defaults.lazyに関して
これがfalseの場合は、基本的に何もlazyに関して設定してないpluginを全てneovim起動後に自動loadする。
trueなら自動loadしない。何かのトリガーがない限りloadされない。
lazy.nvimの主要オプション
https://scrapbox.io/files/6920543a7c5d8fa274000091.png
neotest
hr.icon
基本的な概要
いろんな言語のために有志で用意されてるテストランナーってのがある。
使いたいテストランナーのアダプターを、neotest.setupにて登録することで、テストツールとして利用することができる。
テストを実行する際、ランナー同士で競合する?
しない
neotestは、テスト実行する際、アダプターの登録順にテスト実行できるか聞いていくから。
そこで、最初にテストできるランナーに任せることになる。
テストランナーのアダプターを登録する際、ignore_file_typesでテスト対応しないfiletypeとか決めれる
code: sample.lua
require("neotest-vim-test")({
ignore_file_types = { "python", "vim", "lua" },
})
filetypeは、neovimが指定しているものを使う。
とはいえ、各アダプターは内部で対応ファイルタイプを内包してる。元から設定しているので、基本は気にしなくていいはず。
例えば neotest-jest は javascript, typescript, typescriptreact などを自動で認識する。neotest-python は python だけ。
ignore_file_typesは例外的に除外したい場合のオプション。通常は指定不要。
neotestは基本的にこんな感じ。使い方とかは公式を見て。
https://github.com/nvim-neotest/neotest?tab=readme-ov-file
あとは、アダプターごとに設定を見て適宜変えればいいだけ。
jest使いたいなら、jestアダプターをneotestに追加しつつ、その追加時に設定まで済ませるとかね。
treesitter
hr.icon
構文解析器。色んな言語の構文を解析してくれるやつ。
一番重要と言ってもいい。ほとんどの言語系プラグインがこいつに依存してる。
だから、必要な言語があれば、このtreesitterでinstallしておく必要がある。
ってことだけ一旦覚えておこう。終わり。