タイトル画像

manager.nvim 拡張編

こんにちは。N本ノック10日目ですね。ようやく2桁行きました。

自作kanatableのせいで「なります。」を「なにます。」と誤字ってしまった静カニです。 今回はmanager.nvimの拡張系を書いていきます。 ということで前回、本体編の続きから。 思想編はこっちです。

拡張

標準機能はこれまでの通りなのですが、例の遅延読み込みなどをどうするのか紹介していません。 ということで紹介していきます。

遅延読み込み

満を持して遅延読み込みいきましょう。

ここで重要になってくるのは、このmanager.nvimは本体ではプラグインマネージャーとして最低限、あとは別で。 ということです。つまり何が言いたいかと言うと、 遅延読み込みがなくてもプラグインマネージャーとして成り立つから遅延読み込みは別売りだよ、という話です。

ということでその別売りのプラグインが、manager-lazyloadです。 私はこんな感じに設定してます。

local function config(manager)
    require("manager.lazyload").setup(manager)
end

return function(manager)
    manager:add({
        id = "manager-lazyload",
        url = "https://github.com/shizukani-cp/manager-lazyload",
        config = config,
    })
    manager:load("manager-lazyload")
end

(config関数に自動でmanager側がselfを渡してくれるのを活用してます)

これを読み込んでおくと、manager:lazyload_eventmanager:lazyload_keyが使えるようになります。 manager:lazyload_event("CmdLineEnter", "2048.nvim")manager:lazyload_key("n", "<Leader>cb", "<Cmd>BlamerToggle<Cr>", "blamer.nvim", { noremap = true, silent = true, desc = "Blame" } ) というような形式で使います(setup済み前提)。 manager:lazyload_keyvim.keymap.setoptsの前にプラグインIDを追加したものです。

ロック/アンロック

結局manager:loadでプラグインが読み込まれてconfigも実行されるわけですが、ここで一つ嫌な問題が発生します。 というのは、例えばこう書きたいときの話です。

manager:add({
    id = "telescope.nvim",
    url = "https://github.com/nvim-telescope/telescope.nvim",
    dependencies = {
        "plenary.nvim",
    },
    config = function()
        -- Write your config here...
    end
})
manager:load("telescope.nvim")

manager:add({
    id = "plenary.nvim",
    url = "https://github.com/nvim-lua/plenary.nvim",
})

ここで、依存関係のエラーが発生します。 manager:load("telescope.nvim")の行の時点ではplenary.nvimaddされていないからです。 後でまとめてloadすればいいだろ、とか言われそうですが、 私の場合プラグインごとにファイルを作っていて、 それをlua/core/plugin.luaから大量requireする、という方式を採っています。 このときにlua/core/plugin.luaはSortしておきたい一方で、 個別ファイルに(即時)loadを書いておきたくなると、 上に示したようなコード例の状況が発生します。

これを解決するのが、別売りプラグインその二、manager-lockです。私の設定はこれですね。

local function config(manager)
    require("manager.lock").setup(manager, true)
end

return function(manager)
    manager:add({
        id = "manager-lock",
        url = "https://github.com/shizukani-cp/manager-lock",
        config = config,
    })
    manager:load("manager-lock")
end

setupの第二引数は元々のloadを上書きするか、というオプションですね。 私はlocked_loadと書くのが面倒なので上書きしてますが、 行儀のいい方は上書きせずにlocked_loadといちいち書くことをおすすめします。 ちなみにこれの副作用として、先のmanager-lazyloadの方でmanager:load()を実行しているので lock側の上書き次第でlazyloadの挙動が変わるというよからぬ事態になります。

ということでやっとこの拡張の解説に入るのですが、こいつによって提供されるのは、 manager:lock()manager:unlock()という2つの関数です。 これらの関数で、読み込みをロックしてloadを溜め込み、 あとで一通りaddされた後にアンロックして依存関係のエラーを避けてload、というムーブをかませます。

その他拡張

細かいところは各拡張のREADMEとかdocを見てください。

まとめ

大分本体は最低限にする思想なので拡張で頑張ってください