📦

Neovimのbuilt-inパッケージマネージャーでプラグインを遅延ロードする方法

に公開

概要

lz.nというプラグインを導入することでlazy.nvimに似た遅延ロードの設定が可能になります。

vim.pack

Neovimではnightly buildにbuilt-inパッケージマネージャーとなるvim.packが追加されました。

本記事ではvim.packの詳しい使い方は説明しませんが、例えば以下のように設定ファイルに記述することで、nvim-lspconfignvim-treesitterがneovimに追加されます。

vim.pack.add({
  "https://github.com/neovim/nvim-lspconfig",
  {
    src = "https://github.com/nvim-treesitter/nvim-treesitter",
    version = "main"
  }
})

現状ではプラグイン同士の依存関係の管理や遅延ロードといった、lazy.nvimなど主流なプラグインマネージャーで利用できる便利機能が実装されていません。
依存関係の管理方法についてはIssue34778で議論されていますが、遅延ロードは導入しないことがIssue35562で明言されています。
これは公式側が、そもそも遅延ローディングはプラグイン作成者が注意深くプラグインを設計することで、ユーザーがわざわざ設定しなくても同等の効果を得られるようにすべきと考えているからです。とはいえ、setup()で初期化しているluaプラグインが大半を占める現状、これらのプラグインが公式の方針通りの設計に直してくれるのを待つのは非現実的です。そこでこの遅延ロード機能のみを提供してくれるプラグインを導入することで対応します。

lz.nの導入

lz.nはNeoVimコミュニティではメジャーなlazy.nvimから遅延ロード機能のみを抽出したようなプラグインです。単純ゆえ小さなプラグインマネージャーとは相性がよく、built-inパッケージマネージャー以外にもpaq-nvimnixでプラグイン管理している人も利用することができます。
それぞれの設定方法についてはExampleを参考にしてください。

使用方法

lz.nで遅延ローディングを設定した記述を示します。この例ではOil.nvimOilコマンドが実行されたときに初めてロードされるように設定しています。Oil.nvimはバッファライクに操作できるファイラーです。

vim.pack.add({"https://github.com/lumen-oss/lz.n"})

---@type (string|lz.n.pack.Spec)[]
local plugins = {
    "https://github.com/neovim/nvim-lspconfig",
    {
        src = "https://github.com/nvim-treesitter/nvim-treesitter",
        version = "main",
    },
    {
        src = "https://github.com/mfussenegger/nvim-dap",
    },
    {
        --dependency for nvim-dap-ui
        src = "https://github.com/nvim-neotest/nvim-nio",
    },
    {
        src = "https://github.com/rcarriga/nvim-dap-ui",
    },
    {
        src = "https://github.com/stevearc/oil.nvim",
        data = {
            cmd = "Oil",
            after = function ()
                require("oil").setup({
                    float = {
                        max_width=0.4,
                        max_height=0.5,
                    },
                    keymaps = {
                        ["q"] = "actions.close",
                    },
                })
            end
        }
    },
}

vim.pack.add(plugins, { load = require("lz.n").load })

この設定を読みこみ、neovimを起動してみます。luaプラグインがロードされている(=require(name)が実行されている)かどうかはpackage.loaded[name]を見ることで確認できます。Oilがまだロードされていないことを確認するため、コマンドラインに:=package.loaded["oil"]を入力しnilが返ってくることを確認します。

の実行結果

確認できたので、次はOil --floatコマンドを入力し、設定通りプラグインが実行されることを確認します。
正しく設定できていれば画面中央に小さくOilのバッファが表示されるはずです。

の実行結果

無事表示されました。続いて再度package.loaded["oil"]を実行し、プラグインがロードされていることを確認しましょう。

2度目のの実行結果

oilから公開されているAPIが見えるようになりました。これでlz.nによりプラグインの遅延ロードができることが分かりました。
他の方法で遅延ロードを設定したい場合はREADMEのPlugin Specを参照してください。lazy.nvimとの対応表もあるので、普段lazy.nvimを利用している人は分かりやすいと思います。

まとめ

Neovimのbuilt-inパッケージマネージャーとlz.nプラグインを組み合わせてプラグインの遅延ロードを設定する方法を紹介しました。

Discussion