タイトル画像

manager.nvim 本体編

こんにちは。N本ノック9日目ですね。 親にPC貸してと言われたのでIMEなしの状態で渡した静カニです。 manager.nvimをdotfilesとリポジトリ分けた癖に解説記事がなかったので書いていきます。 (この記事は本体編です。 拡張編はこちら、 思想編はこちら。)

使い方

使い方です。

導入

init.luaにこれでも書いておいてください。

local managerpath = vim.fs.joinpath(vim.fn.stdpath('data'), 'site', 'pack', 'manager', 'start', 'manager.nvim')
if not (vim.uv or vim.loop).fs_stat(managerpath) then
    local managerrepo = "https://github.com/shizukani-cp/manager.nvim.git"
    vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=main", managerrepo, managerpath })
    if vim.v.shell_error ~= 0 then
        vim.api.nvim_echo({
            { "Failed to clone manager.nvim:\n", "ErrorMsg" },
        }, true, {})
    end
end
vim.opt.runtimepath:prepend(managerpath)

モジュールシステムが必要なためNeoVim0.5以上、 あとプラグインをgit cloneで入れているのでgitが必須です。

初期化

このプラグインマネージャーはオブジェクト指向っぽい感じなのでインスタンスを作って それに対して操作していく感じになります。このインスタンスは複数作成可能です。

local manager = require("manager.core").new()

これによってManagerオブジェクトが初期化されて、プラグインマネージャーとして使えるようになります。 また、newコンストラクターの引数には~/.local/share/nvim/site/pack/managermanagerの部分を指定でき、 このディレクトリ内(正確には配下のoptディレクトリ内)にプラグインがインストールされていきます (デフォルト値はmanagerです)。ということで初期化できたのでここからプラグインマネージャーとして運用していきます。

プラグインの登録

とりあえずコードの流れに沿って進めていきます。

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

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

managerはさっき初期化したときの変数名です。この後のコードも断りがない限りこの前提です。

ということでこの登録部分で重要なのは、「この時点ではプラグインはインストールはされるが、 読みこまれていない」という点です。その読み込みは次のセクションを参照してください。

引数の意味はidはそのままID(cloneする際のディレクトリ)、urlgit cloneするURLで、これらは必須です。 configは読み込まれた直後に実行される関数、 dependenciesはそのプラグインを読み込む前に読み込む必要があるプラグインのテーブルです。

dependenciesの補足が二つほどあるので書いておくと、 まず1つ目は、ここでは依存プラグインのIDを書き、URLは別で書かなければならないという点です。 もう2つ目は、依存プラグインのチェックはload時に行われるという点です。 このためtelescope.nvimを先に定義後、plenary.nvimを定義しても問題ありません。

また、このコードには出て来ていませんが有効な引数もありbranch,dev,dirの3つです。 branchはそのままcloneする際のブランチを指定します。

devはローカルのプラグインを使うかのフラグで、基本dirとセットで使うと思われます。 そのdirは、ローカルのプラグインのパスです。

読み込み

ここで読み込むことでプラグインが使えるようになります。さっき指定したconfigもこのタイミングで実行されます。

manager:load("telescope.nvim")

遅延ロードについては明日紹介します。

プラグインの実体の削除

manager:remove("bad_plugin")の形式でプラグインを消します。 もちろんaddが消されるわけがないのでもう一度起動したらaddを消さない限り再インストールされます。 一応addされてなくてもパスを錬成して消してたと思います。ただaddされていないゴミを一括削除は後述のcleanを使ってください。

ゴミ掃除

manager:clean()という形式で使います。 これ自体はその時点でaddされていないプラグインをremoveするというシンプルなものなのですが、 一つトラップがあるので気を付けてください。

例えばこのような感じです。

local manager_a = require("manager.core").new("manager_a")
manager_a:add({
    id = "my_nice_plugin",
    url = "https://github.com/example/my_nice_plugin",
})
-- 修正忘れ?                                   ↓↓↓↓↓↓↓↓
local manager_b = require("manager.core").new("manager_a")
manager_b:clean()
manager_a:load("my_nice_plugin")

manager_a:addの時点でmy_nice_pluginはインストールされているわけですが、manager_bは知りません。 そのため、manager_b:cleanするとmy_nice_pluginを存在しているけど知らないということで消してしまいます。 あるはずのプラグインが消えてる時点でロクなことにはならないのでこうならないようにインストール先はちゃんと管理しましょう。

アップデート

manager:update()またはmanager:update("my_nice_plugin")の形式です。 引数なしでは全プラグイン、引数ありではそのプラグインのみアップデートします。 アップデートとは言っても単にgit pull -Cしてるだけなのでプラグインの作者が何かした後Amendしてforce pushしたら (たぶんそれするのは私だけですね)コンフリクトが起きるのでそのときは自力で解決してください。

ログ

あまりプラグインマネージャーとして必須という感じはしませんがデバッグの負担がかなり違うのでログがあります。 一応APIもあるので書いておきます。

local _ = manager.logger:on(function(e)
    if e.level >= 3 then
        vim.notify(e.msg, e.level)
    end
end)

まあシンプルにログが追加されたときに警告以上のレベルだったら表に通知する感じですね。 ちなみに戻り値はハンドラを削除する関数です。今回は使わないので_という名のゴミ箱に入れてます。

勘のいいガk…じゃなくて方は気付いたかもしれませんが、標準ではログを勝手に出力することはありません。 自分で設定するようにしましょう。

終わり

これはまだ本体編なので拡張編は明日