Neovim のプラグイン管理には様々な選択肢があります。長年、lazy.nvim を使ってプラグインを管理していましたが、今回 Neovim の新しい組み込み機能である vim.pack
に移行してみました。
この記事では、vim.pack
の仕組みや実装背景、実際の移行方法と設定、そして使ってみて感じたメリット・デメリットを紹介します。
vim.pack とは
vim.pack
は Neovim の新しい組み込みプラグインマネージャーです。従来の packages 機能(Vim 8.0 で導入)を拡張し、より使いやすくした実装です。
詳細なドキュメントはこちら です。
実装背景
vim.pack
は 2024年に PR #34009 で提案・実装された機能です。これは、従来の packages 機能をより使いやすくするためのラッパー的な機能として設計されています。
vim.pack の基本的な仕組み
読み込みの仕組み
- Neovim 起動時、設定ファイル(init.lua など)が処理される
- その後、’packpath’ 内のすべての
pack/*/start/*
ディレクトリが検索される - 各プラグインの plugin/, ftdetect/, syntax/ ディレクトリが自動的に読み込まれる
- ヘルプファイルがあれば、
:helptags
で検索可能になる
vim.pack の API
vim.pack は以下のような Lua API を提供します:
vim.pack.add({
'https://github.com/nvim-lua/plenary.nvim',
{ src = 'https://github.com/nvim-tree/nvim-web-devicons', name = 'nvim-web-devicons' },
})
私はこれまで Lazy.nvim を使っていました。
これは neovim ユーザーの中では有名でよく使われるプラグインマネージャーの1つです。
lazy.nvim を使って設定していたプラグイン管理を vim.pack に移行しました。
移行方法
移行は Claude を使うと簡単に行えました。
lazy.nvim の設定を init.lua に書いていたので、「この init.lua と vim.pack のドキュメントを渡し、これらを読んで vim.pack を使うようにに変更して」と指示するといい感じに頑張ってくれました。
今のところ壊れることもなく実行できています。
lazy.nvim を使っていた場合の設定
移行前の lazy.nvim の設定の一部を抜粋して紹介します。
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
vim.fn.system({
"git", "clone", "--filter=blob:none",
"https://github.com/folke/lazy.nvim.git",
"--branch=stable", lazypath,
})
end
vim.opt.rtp:prepend(lazypath)
require("lazy").setup({
{ "nvim-lua/popup.nvim" },
{ "nvim-lua/plenary.nvim" },
{ "rcarriga/nvim-notify" },
{
"nvim-neo-tree/neo-tree.nvim",
dependencies = { "nvim-tree/nvim-web-devicons", "MunifTanjim/nui.nvim" },
cmd = { "Neotree" },
config = function()
require("neo-tree").setup(...)
end,
},
{
"hoob3rt/lualine.nvim",
event = "VeryLazy",
dependencies = { "nvim-tree/nvim-web-devicons" },
config = function()
require("lualine").setup(...)
end,
},
{
"neovim/nvim-lspconfig",
event = { "BufReadPre", "BufNewFile" },
dependencies = { "nvim-lua/plenary.nvim" },
config = function()
end,
},
})
vim.pack を使った新しい設定
移行後の vim.pack を使った設定はこのようになりました。
vim.pack.add({
'https://github.com/nvim-lua/popup.nvim',
'https://github.com/nvim-lua/plenary.nvim',
{ src = 'https://github.com/nvim-tree/nvim-web-devicons', name = 'nvim-web-devicons' },
'https://github.com/rcarriga/nvim-notify',
{ src = 'https://github.com/MunifTanjim/nui.nvim' },
})
vim.pack.add({
{ src = 'https://github.com/lewis6991/gitsigns.nvim' },
{ src = 'https://github.com/projekt0n/github-nvim-theme' },
{ src = 'https://github.com/hoob3rt/lualine.nvim' },
{ src = 'https://github.com/nvim-neo-tree/neo-tree.nvim' },
{ src = 'https://github.com/neovim/nvim-lspconfig' },
{ src = 'https://github.com/nvim-telescope/telescope.nvim' },
})
require('github-theme').setup({})
vim.cmd.colorscheme('github_dark_high_contrast')
require('gitsigns').setup()
require("neo-tree").setup({ ... })
require('lualine').setup({ ... })
主な変更点
- インストール方法
- lazy.nvim のブートストラップ処理が不要になり、vim.pack.add() で直接プラグインを指定
- 依存関係管理
- 手動で読み込み順序を考慮する必要がある
- 遅延読み込み
- lazy.nvim の洗練された遅延読み込みは使用できない
- 設定記述
- プラグインの設定を別途 require() で呼び出す必要がある
vim.pack にして良くなった部分
1. 外部依存の排除
プラグインマネージャー自体をインストールする必要がなくなりました。
Neovim に組み込まれているため、設定の移植性が向上します。
また、パッケージマネージャー自体の開発が終了したり突然使えなくなることは(多分)なさそうです。
2. 透明性の向上
プラグインの管理がシンプルで分かりやすくなりました。
どのプラグインがどこにあるのか、依存関係がどうなっているのかが明確です。
3. 設定の簡素化
複雑な遅延読み込みや条件分岐が不要な場合、設定がより簡素になります。
lazy.nvim の方が良かったこと、vim.pack ではできないこと
1. 自動的な依存関係管理
lazy.nvim は dependencies キーで依存関係を自動的に解決してくれましたが、vim.pack では手動で順序を管理する必要があります。
このプラグインはこっちのプラグインの依存先なので、追加しないといけない。というコメントを残しておく必要がありそうです。
2. 遅延読み込み
lazy.nvim の event、cmd、ft、keys などによる遅延読み込み機能は非常に便利でした。
vim.pack では基本的な遅延読み込みしかサポートしていません。
これは今後の開発に期待がかかるところです。
3. インタラクティブに更新はできない
vim.pack にはいい感じの UI はないため、Update をするためには vim.pack.update()
を実行する必要があります。
4. 設定がバラける
lazy.nvim ではプラグインを設定するところで、config として各種の設定をできました。
ですが vim.pack ではプラグインを指定するところと、プラグインの初期設定をするところが分かれています。
そのためプラグイン名と設定をまとめるのが難しいなあと思いました。
vim.pack.add
を細かく実行することでうまくできそうな感じがしますが、うまく試せていません。
移行してみての感想
vim.pack への移行は、シンプルさを求めるには良い選択肢だと感じました。
vim.pack が向いている人
- プラグインを厳選して必要最小限のプラグインで開発する人
- 外部依存を避けた、できるだけピュアな Neovim 環境を構築したい人
- シンプルな設定を好む人
lazy.nvim など既存のプラグインマネージャーが向いていそうな人
- プラグインを頻繁に試す人: 新しいプラグインを気軽に試したい人
- 複雑な遅延読み込みが必要な人: パフォーマンスを細かく最適化したい人
- 多数のプラグインを使う人: 大量のプラグインを効率的に管理したい人
- 自動化を重視する人: 更新やメンテナンスを自動化したい人
個人的には、vim.pack の思想はおもしろいですし、標準機能として実装されているのはよいことだと思っています。
しかし、現状では lazy.nvim のような成熟したプラグインマネージャーの方が総合的に見て実用性は高いです。
今後、vim.pack がさらに発展し、より多くの機能が追加されれば、標準的な選択肢として広く使われるようになるかもしれません。
とはいえ、現在でもシンプルなプラグイン管理を求める人には十分に価値のある選択肢だと思います。
今後の更新
vim.pack 関連っぽい issue を見ると色々な変更がありそうな感じがするので、今後も見ていくと良さそうです。
Views: 0