kmkkiii.com

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 に記録されます。