Vimでステータスラインプラグインを遅延読み込みする

by
カテゴリ:
タグ:

Vim駅伝2025-04-30の記事です。

Vim/Neovimの起動速度を維持しながら、高機能性を追求する方法としてプラグインの遅延読み込みはよく使われるテクニックです。

素朴には以下のようにautocmdを使って実現できますし、vim-jetpacklazy.nvimなどのプラグインマネージャーを使うと、より簡単に実現できます。

" autocmdを使った遅延読み込みのイメージ
" `VimEnter`はVim起動時に必ず発火するので、遅延に利用する旨味はない
augroup MyLazyLoad
  autocmd!
  autocmd ++once VimEnter * set runtimepath+=~/<path-to-your-plugin>
augroup END

実現は簡単ですが、設計にはいくつか注意が必要です。

  1. 設定を間違えると、意味がないばかりかかえって使い勝手が悪くなる
    • 起動時間が短縮しない、欲しいときにプラグインが読み込まれない、など
  2. 特定のイベントで大量のプラグインを遅延読み込みすると、一時的に処理が重くなる

初めて使うプラグインは無理せずとりあえず即時読み込みすると無難ですね。

とりわけステータスラインプラグインは(1)の影響を受けやすいので、私の考え方と設定を共有します。

私は、ステータスラインにGitやLSPの情報を表示しないため、このような考え方ができます。どうしても遅延したいときはこういった割り切りも大事ですね。

実際の設定例としてlazy.nvimmini.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
}

実装にあたって追加で気にするポイントは以下。

ENJOY

ちなみに2025-04-28のVim駅伝記事は「.zsh_historyファイルをイジる」でした。 Zshの履歴ってフツーのプレインテキストだと思ってたので、なん……だと……?という気分。ソースまで見てワークアラウンドに至るのすばらしいですね。