Vim駅伝2025-04-30の記事です。
Vim/Neovimの起動速度を維持しながら、高機能性を追求する方法としてプラグインの遅延読み込みはよく使われるテクニックです。
素朴には以下のようにautocmd
を使って実現できますし、vim-jetpackやlazy.nvimなどのプラグインマネージャーを使うと、より簡単に実現できます。
" autocmdを使った遅延読み込みのイメージ
" `VimEnter`はVim起動時に必ず発火するので、遅延に利用する旨味はない
augroup MyLazyLoad
autocmd!
autocmd ++once VimEnter * set runtimepath+=~/<path-to-your-plugin>
augroup END
実現は簡単ですが、設計にはいくつか注意が必要です。
- 設定を間違えると、意味がないばかりかかえって使い勝手が悪くなる
- 起動時間が短縮しない、欲しいときにプラグインが読み込まれない、など
- 特定のイベントで大量のプラグインを遅延読み込みすると、一時的に処理が重くなる
初めて使うプラグインは無理せずとりあえず即時読み込みすると無難ですね。
とりわけステータスラインプラグインは(1)の影響を受けやすいので、私の考え方と設定を共有します。
- 単一ウィンドウならステータスラインは不要
- したがって、初期状態では
:set laststatus=0
にしてOK - これにより、遅延読み込み前のステータスラインが設定不要になる
- ファイル情報が欲しいときは
CTRL-G
でファイル名を表示すれば十分
- したがって、初期状態では
- 新規ウィンドウを開いたときに、表示中のウィンドウ数をカウントして、2つ以上なら遅延読み込みを実施
- このとき、ステータスラインを表示するため、
:set laststatus=2
も実行 - floatwinやtabpageの追加によるウィンドウ数の変化は無視
- このとき、ステータスラインを表示するため、
私は、ステータスラインにGitやLSPの情報を表示しないため、このような考え方ができます。どうしても遅延したいときはこういった割り切りも大事ですね。
実際の設定例としてlazy.nvim
とmini.statusline
を使ってみます。考え方は他に応用が効くと思います。
-- lazy.nvimを使ったステータスラインプラグイン(mini.statusline)の遅延読み込み
{
"https://github.com/echasnovski/mini.statusline",
lazy = true,
init = function()
-- プラグインを読み込むまでステータスラインを非表示
vim.opt.laststatus = 0
-- 遅延読み込みのためのautocmd
vim.api.nvim_create_autocmd("WinNew", {
group = vim.api.nvim_create_augroup("atusy-mini-statusline", {}),
callback = function()
-- 実質1ウィンドウなら読み込みを保留
local cnt = 0
for _, w in pairs(vim.api.nvim_tabpage_list_wins(0)) do
if vim.api.nvim_win_get_config(w).relative == "" then
cnt = cnt + 1
if cnt == 2 then
break
end
end
end
if cnt < 2 then
return false
end
-- プラグインの読み込み
-- lazy.nvimユーザーは`require()`で遅延読み込み可能
vim.opt.laststatus = 2
require("mini.statusline")
-- 遅延読み込みautocmdを削除
return true
end,
})
end,
config = function()
require("mini.statusline").setup({})
end
}
実装にあたって追加で気にするポイントは以下。
- 遅延読み込みには
event = "WinNew"
などのイベント指定もできるが、今回はイベント発生時のウィンドウ数に依存するため、autocmd
を使う init
関数でautocmd
を定義しているので、遅延読み込みが必要なことをlazy=true
で明示する- 自前で
autocmd
を定義するので、繰り返し評価されないように、適宜autocmd
を削除する- Neovimの場合は
autocmd
のcallback
でreturn true
すると削除できる
- Neovimの場合は
mini.statusline
はmini.nvim
の一部だがmini.nvim
全体を遅延読み込みすると、ステータスライン以外の機能も遅延してしまうので、対策する- 今回の例では
mini.statusline
を単体のプラグインとして扱う - atusy自身は
mini.nvim
全体を遅延読み込みするため、一工夫している
- 今回の例では
ENJOY
ちなみに2025-04-28のVim駅伝記事は「.zsh_historyファイルをイジる」でした。 Zshの履歴ってフツーのプレインテキストだと思ってたので、なん……だと……?という気分。ソースまで見てワークアラウンドに至るのすばらしいですね。