プラグインマネージャーをpacker.nvimからlazy.nvimに置き換えた

先日Packer.nvimの挙動がおかしくなったのを期に、Neovimで利用しているプラグインマネージャーをpacker.nvimからlazy.nvimに置き換えました。設定ファイルの書き方や置き換えの際の注意点などをメモします。

背景

packer.nvimは2023年8月を最後に更新が止まっており、今後もメンテナンスされる見込みがないため別のプラグインマネージャーの利用が推奨されていました。

This repository is currently unmaintained. For the time being (as of August, 2023), it is recommended to use one of the following plugin managers instead:

packer.nvim

私はその後もPacker.nvimを使い続けていましたが、2024年7月20日にPacker.nvimの挙動がおかしくなり、dap-goの設定がうまく読み込まれなくなりました(ちなみにdap-goはnvimのデバッグアダプタープロトコルを利用してGoのデバッグを行うためのプラグインです)。

そのため、Packer.nvimを置き換えることにしました。

lazy.nvim

Packer.nvimの代替としてlazy.nvimを選択しました。

選択した理由はpacker.nvimのリポジトリのREADMEで推奨されていたからです。同じくlazy.nvimに移行したユーザーの声も多く、情報が豊富で安定しているように感じました。

事前準備(init.vimからinit.luaへ移行)

Packer.nvimからlazy.nvimに置き換える際、まずinit.vimからinit.luaへの移行を行いました。

lazy.nvimのドキュメントにはluaでの設定方法が記載されていましたが、init.vimでの設定方法は記載されていなかったからです。

init.luaへの移行は以前から検討していたためこの機会に実施しました。

init.vimからinit.luaへ移行した

lazy.nvimの導入

lazy.nvimの導入はこちらのドキュメントに参考に行いました。

ディレクトリ構成

1~/.config/nvim/
2├── init.lua
3└── lua/
4    ├── lazy_nvim.lua
5    ~省略
6    └── plugins.lua

init.lua

init.luaにlazy_nvimを読み込む設定を追加しました。

1require('lazy_nvim')

init.luaが置かれている階層にluaディレクトリがあると、luaディレクトリ内のluaファイル名を指定することでinit.luaから読み込むことができます。

lazy_nvim.lua

lazy_nvim.luaにlazy.nvimの設定を記述しています。これはドキュメントのサンプルコードをほぼそのまま利用していますが、プラグインの設定は別のファイルに分けたかったため、setupの記述を下記のように変更しました。

1require("lazy").setup("plugins")

setup("plugins")とすることで、lazy_nvim.luaと同じ階層にあるplugins.luaを読み込むようになります。

plugins.lua

下記のようにプラグインの設定を記述しました。

 1return {
 2  -- File manager
 3  'lambdalisue/fern.vim',
 4  { -- colorscheme
 5    'catppuccin/nvim',
 6    config = function() vim.cmd('colorscheme catppuccin-mocha') end,
 7  },
 8  { -- Appearance
 9    'lukas-reineke/indent-blankline.nvim',
10    lazy = true,
11    event = { 'BufRead', 'BufNewFile' }
12  },
13  { -- Appearance
14    'nvim-lualine/lualine.nvim',
15    lazy = true,
16    event = { 'BufRead', 'BufNewFile' },
17    config = function() require('nvim_lualine') end
18  },
19  { -- Appearance
20    'lewis6991/gitsigns.nvim',
21    lazy = true,
22    event = { 'BufRead', 'BufNewFile' },
23    config = function() require('gitsigns_nvim') end
24  },
25  { -- Configurations for Nvim LSP
26    'neovim/nvim-lspconfig',
27    lazy = true,
28    event = { 'BufRead', 'BufNewFile' },
29    config = function() require('nvim_lspconfig') end
30  },
31  { -- Formatt and lint runner
32    'nvimtools/none-ls.nvim',
33    lazy = true,
34    event = { 'BufRead', 'BufNewFile' },
35    dependencies = {
36      {
37        'nvim-lua/plenary.nvim',
38        lazy = true,
39        event = { 'BufRead', 'BufNewFile' },
40      }
41    },
42    config = function() require('null_ls') end
43  },
44  { -- Auto completion
45    'hrsh7th/nvim-cmp',
46    dependencies = {
47      {
48        'hrsh7th/cmp-nvim-lsp',
49        lazy = true,
50        event = { 'InsertEnter' }
51      },
52      {
53        'hrsh7th/vim-vsnip',
54        lazy = true,
55        event = { 'InsertEnter' }
56      },
57    },
58    config = function() require('nvim_cmp') end
59  },
60  { -- Debug Adapter Protocol
61    'mfussenegger/nvim-dap',
62    lazy = true,
63    event = { 'BufRead', 'BufNewFile' },
64    dependencies = {
65      {
66        'leoluz/nvim-dap-go',
67        lazy = true,
68        event = { 'BufRead', 'BufNewFile' }
69      },
70    },
71    config = function() require('nvim_dap') end
72  },
73  -- GitHub Copilot
74  'github/copilot.vim'
75}

packer.nvimとlazy.nvimではプラグインを設定する際のフィールド名が異なるため、書き換えが必要でした。

ドキュメントにはMigration Guideがあるのでそれを参考にしました。

私は利用しているプラグインが10個程度と少ないため大変な作業ではありませんでしたが、プラグインが多い場合はchatgptに任せるのが良さそうです。

ちなみにlazy = trueというのは遅延読み込みを行うための設定です。

まとめ

Packer.nvimからlazy.nvimに置き換えることで、Neovimのプラグインマネージャーを最新のものに更新することができました。dap-goも正常に動作するようになり、快適な開発環境を取り戻すことができました🙂