NeoVim のプラグインマネージャーを packer.nvim から lazy.nvim に移行した

最近 lazy.nvim という NeoVim のプラグインマネージャーの存在を知った。

README や Reddit を眺めていて良さそうだったこともあり、プラグインマネージャーを packer.nvim から lazy.nvim に乗り換えた。移行して数日経過したが、特に問題や困ることもなく普通に使えている。

この記事では主に自分のメモとして、移行に際して設定したことや移行の背景を残しておく。

移行手順について

lazy.nvim の README に packer.nvim からの移行方法が紹介されている。基本的にはこれに従えば良い。

おそらく大抵のケースでは require("packer").startup()require("lazy").setup() に書き換えつつ、ブロック内のプラグインの書式を多少変更するだけになると思う。

packer.nvim

require("packer").startup(function(use)
  use 'neovim/nvim-lspconfig'
  use 'hrsh7th/nvim-cmp'
  use 'hrsh7th/cmp-buffer'
  use {
    'nvim-treesitter/nvim-treesitter',
    run = function() require('nvim-treesitter.install').update({ with_sync = true }) end,
  }
end)

lazy.nvim

require("lazy").setup({
  'neovim/nvim-lspconfig',
  'hrsh7th/nvim-cmp',
  'hrsh7th/cmp-buffer',
  {
    'nvim-treesitter/nvim-treesitter',
    build = function() require('nvim-treesitter.install').update({ with_sync = true }) end,
  }
})

自分が実際に行った変更は以下の通り。

モチベーション

正直なところ NeoVim のプラグインマネージャーとして packer.nvim を使っていて特段困ったことはなかった。

しかしながら lazy.nvim では Lockfile がサポートされている。具体的にはパッケージをインストール、アップデートする際に lazy-lock.json というファイルが生成され、これによってインストールするプラグインのバージョンを固定化することができる。この機能の存在が移行の決め手となった。

というのもインストールしているプラグインのバージョンをあげたことで、NeoVim の動作がおかしくなることはしばしばある。こういったプラグインのバージョンアップは大抵のケースでコードを書く前にやっていて、結果としてコードを書くためにまずは NeoVim の設定を直す必要が生じていた。これに関してコードを書く前に NeoVim が壊れるかもしれないアクションを取るなという話もあるが、エディタを開く必要があるタイミングでバージョンアップを行うという行為に一定の合理性があるはず。

こういったケースで Lockfile を以前の状態に戻して再度プラグインをインストールすればよい、というのは理想的な対応であると思っている。

正確には packer.nvim にも Snapshot と呼ばれる Lockfile に相当するファイルを生成する機能が存在する。しかしながらこの packer.nvim の Snapshot は lazy.nvim と異なり明示的に取得する必要がある。プラグインのアップデートの度に Snapshot の取得を実行するのは現実的ではなく、個人的に実用に耐えなかった。自分でインストールやアップデートの都度 Snapshot を取得するように Lua のスクリプトを書くというのも手ではあったが、そこまでやるのであれば標準で Lockfile をサポートしている lazy.nvim を使ったほうがメンテナンス性も高くていいよね、という話である。

なお packer.nvim にも lazy.nvim のような挙動で Snapshot を取ることについて discussion はされている。現時点ではまだ実装はされていないものの、将来的には packer.nvim でも自分のモチベーションは解消されるかもしれない。

ちなみに packer.nvim で満足しているのであれば lazy.nvim にあえて乗り換える必要は無いと思っている。lazy.nvim の作者も Reddit で同様のことを言っているし