Neovimのビルトインプラグインマネージャー`vim.pack`を試す
Neovimにビルトインのプラグインマネージャー vim.pack
が実装されたらしい。
v0.12に含まれる予定だが、試してみたくなったので最新版のNeovimを触ってみる。
HEADビルドしてインストール
vim.pack
について
mini.nvimの作者echasnovskiさんが実装したらしく、以下のPRで実装と様々な議論がなされている。
この実装は第1フェーズのようで、今後以下のような改善が見込まれている。
nvim-treesitterを追加してみる
以下の設定を追加し、:restart
コマンドで再起動すると、別バッファでプラグインをインストールするか尋ねられるのでYesと入力してインストール後、init.luaの内容がハイライトされるようになればOK。
helpのvim.pack.Specによると、srcはgit cloneできる形式を指定する必要があるので、lazy.nvim等他のプラグインマネージャーのように"user(organization)/repository-name"のような形式は使えないので注意。
ちょっと面倒くさいので、以下のように関数でショートハンド的に書けるようにしている。
local function gh(repo)
return "https://github.com/" .. repo
end
vim.pack.add({
{ src = gh("nvim-treesitter/nvim-treesitter") },
})
require('nvim-treesitter.configs').setup {
ensure_installed = { "lua" },
highlight = { enable = true },
indent = { enable = true },
}
プラグイン一覧を確認する
:= vim.pack.get()
{ {
active = true,
path = "/Users/kmkkiii/.local/share/nvim/site/pack/core/opt/nvim-treesitter",
spec = {
name = "nvim-treesitter",
src = "https://github.com/nvim-treesitter/nvim-treesitter",
version = "master"
}
} }
Press ENTER or type command to continue
依存関係や他のオプションはどうするのか(未検証)
vim.pack.addのspec記述順で読み込まれると思うので、依存関係を先に記述すれば動きそう?
blink.cmpではfuzzy mathcerのためにバイナリインストールか自前ビルドの設定があるが、それをどうやって適用するかよくわかっていない(このあたりは今後拡充されていくのかも)。
:help vim.pack
ChatGPTに翻訳してもらった
⸻
vim.pack - 組み込みプラグインマネージャー(開発中)
⚠️ 開発中の組み込みプラグインマネージャーです!
既存機能のテスト歓迎。ただし予告なしに破壊的変更がある可能性があります。
概要
• プラグインは専用の vim.pack ディレクトリ($XDG_DATA_HOME/nvim/site/pack/core/opt)内でのみ管理されます。
• プラグインのサブディレクトリ名は仕様上の名前と一致させます。
• このディレクトリ内のプラグインはすべて vim.pack によって管理されていることが前提です。
要件
• Git(バージョン 2.36 以上)が必要です。
• 対象のプラグインは Git リポジトリで、バージョンは semver に従ったタグ(例: v1.2.3)を使用します。
⸻
使用例
基本的なインストールと管理
init.lua に以下を記述:
vim.pack.add({
-- plugin1 をデフォルトブランチでインストール
'https://github.com/user/plugin1',
-- テーブル形式(オプション指定が可能)
{ src = 'https://github.com/user/plugin1' },
-- プラグイン名を明示的に指定("plugin2")
{ src = 'https://github.com/user/generic-name', name = 'plugin2' },
-- バージョンを指定
{
src = 'https://github.com/user/plugin3',
version = vim.version.range('1.0'),
},
{
src = 'https://github.com/user/plugin4',
version = 'main',
},
})
その後すぐに以下のようにプラグインを使用可能:
plugin1 = require('plugin1')
次に行うこと
• Neovim を再起動(例: :restart)
• add() 後、未インストールのプラグインがディスク上に配置されます。
• プラグインを更新するには:
vim.pack.update()
• 更新内容を確認し、:write で適用、:quit で破棄。
⸻
プラグインのバージョン変更
1. init.lua の version を変更(例: vim.version.range('*'))
2. :restart で再起動
3. vim.pack.update({ 'plugin1' }) を実行
4. 更新内容を確認し、適用または破棄
⸻
更新を一時停止(フリーズ)
• 現在のコミットハッシュを version に設定(例: abc12345)
• vim.pack.update() 実行後に表示されるハッシュをコピーして使用
• 再起動で適用
フリーズ解除
• version を任意のバージョンまたはブランチに設定し直す
• 再起動で更新が有効に
⸻
プラグインの削除
vim.pack.del({ 'plugin-name' })
• init.lua からも削除しないと、再インストールされます。
⸻
フック可能なイベント
イベント名 タイミング
PackChangedPre プラグイン状態変更前
PackChanged プラグイン状態変更後
各イベントで使用可能な event-data:
• kind: "install", "update", "delete"
• spec: プラグイン仕様
• path: プラグインのフルパス
⸻
vim.pack.Spec 仕様
フィールド 型 説明
src string Git URI(任意の git clone 形式)
name string? プラグイン名(省略時はリポジトリ名)
version string vim.VersionRange?
⸻
関数一覧
vim.pack.add({specs}, {opts})
現在のセッションにプラグインを追加。
• 既に存在する場合は何もしない
• 存在しない場合は git clone と git checkout で導入
• :packadd を自動実行
オプション
フィールド 型 説明
load boolean plugin/ や ftdetect/ を読み込む(デフォルト: true)
⸻
vim.pack.del({names})
指定したプラグインをディスクから削除
• names: プラグイン名の配列
⸻
vim.pack.get()
管理中のすべてのプラグイン情報を取得
• 戻り値:以下のフィールドを持つテーブル配列
• spec: 解決済みの vim.pack.Spec
• path: パス
• active: 現セッションで読み込まれているか
⸻
vim.pack.update({names}, {opts})
プラグインを更新
• names: 更新対象のプラグイン名(省略時は全て)
• opts.force: true で確認なし即更新(デフォルト: false)
更新手順(通常)
1. 差分を確認できるバッファが別タブで開く
2. > で始まる行が適用、< は元に戻す
3. 以下のLSP機能が利用可能:
• gO: 構造表示
• K: ホバー表示
4. :write で更新適用、:quit でキャンセル
⸻
⚠️ 更新履歴は stdpath("log")/nvim-pack.log に記録されます。
⸻