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_eventとmanager: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_keyはvim.keymap.setのoptsの前にプラグイン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.nvimがaddされていないからです。
後でまとめて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を見てください。
- manager-command
:Managerでloadとかupdateとかいろいろできます。ただし一つのインスタンスしか扱えない模様。 - manager-ui なんかUIを提供するやつです。正直私は使ってないのでバグが他よりも多いかもしれません(他もかなり多いので五十歩百歩だと思った方は今後夜道を歩くときは気をつけるようにしてください)。
まとめ
大分本体は最低限にする思想なので拡張で頑張ってください
