スタートアップCTOによるITエンジニアのためのブログ

PackerからLazy.nvimへNeovimプラグインマネージャを移行する手順

Neovimのプラグイン管理マネージャをPacker.nvimからLazy.nvimに移行したので、手順をステップ・バイ・ステップで共有します。

目次

  • 移行の目的
  • Packer使用時のディレクトリ構造
  • Neovim自体の設定ファイルの移動
  • Lazy.nvimのインストール
  • 個別プラグイン設定の移行
  • まとめ

移行の目的

最大の理由は、Packer.nvimのレポジトリが現在メンテナンスされていないことです。Packer自身のレポジトリでもLazy.nvimへの移行を推奨していることから、今後の安定性のために移行を決めました。また、Lazy.nvimは遅延読み込みが強力で、起動速度の向上も期待できます。

Packer使用時のディレクトリ構造

移行前(Packer使用時)のディレクトリ構造は以下の通りです。

# Plaintext
# ~/.config/nvim
.
├── init.lua
├── lua
│   └── user
│       ├── cmp.lua
│       ├── colorscheme.lua
│       ├── keymaps.lua
│       ├── lsp.lua
│       ├── options.lua
│       └── plugins.lua
└── plugin
    └── packer_compiled.lua

init.lualua/user ディレクトリ内の各ファイルを require し、lua/user/plugins.lua 内でPackerの設定やプラグインの追加を行っていました。

Neovim自体の設定ファイルの移動

設定の整理を兼ねて、Neovim自体の設定ファイルを格納する config ディレクトリを作成し、ファイルを移動します。

# Bash
mkdir -p lua/config
git mv lua/user/options.lua lua/config/
git mv lua/user/keymaps.lua lua/config/

Lazy.nvimのインストール

Lazy.nvimの設定ファイル ~/.config/nvim/lua/config/lazy.lua を新規作成します。ここでは、Lazy.nvim自体の自動インストールと基本設定を記述します。

-- Lua
-- ~/.config/nvim/lua/config/lazy.lua

-- lazy.nvim自体の自動インストール処理
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
if not (vim.uv or vim.loop).fs_stat(lazypath) then
  local lazyrepo = "https://github.com/folke/lazy.nvim.git"
  local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
  if vim.v.shell_error ~= 0 then
    vim.api.nvim_echo({
      { "Failed to clone lazy.nvim:\n", "ErrorMsg" },
      { out, "WarningMsg" },
      { "\nPress any key to exit..." },
    }, true, {})
    vim.fn.getchar()
    os.exit(1)
  end
end
vim.opt.rtp:prepend(lazypath)

-- Leaderキーの設定(lazy.nvimのセットアップ前に設定するのが必須)
vim.g.mapleader = " "
vim.g.maplocalleader = "\\"

-- lazy.nvimの設定
require("lazy").setup({
  spec = {
    -- lua/plugins ディレクトリ配下の設定を自動でインポート
    { import = "plugins" },
  },
  install = { colorscheme = { "habamax" } },
  checker = { enabled = true }, -- アップデートの自動チェック
})

次に、init.lua を書き換えて、新しい設定ファイルを読み込むようにします。Packer関連の読み込みはすべて削除します。

# Diff
-require 'user.options'
-require 'user.keymaps'
-require 'user.plugins'
-require 'user.colorscheme'
-require 'user.cmp'
-require 'user.lsp'
+require 'config.options'
+require 'config.keymaps'
+require 'config.lazy'

Packer関連ファイルの削除

不要になったPackerのキャッシュファイルを削除します。

# Bash
# コンパイル済み設定ファイルの削除
rm ~/.config/nvim/plugin/packer_compiled.lua

# 旧プラグイン実体の削除(必要に応じてバックアップを取ってください)
rm -rf ~/.local/share/nvim/site/pack/

個別プラグイン設定の移行

Lazy.nvimでは、lua/plugins/ ディレクトリの中に、プラグインごとの設定ファイルを作成するのが一般的です。

移行の例:tokyonight.lua

Packerで use 'folke/tokyonight.nvim' と記述していたものを、以下のように移行します。

-- Lua
-- ~/.config/nvim/lua/plugins/tokyonight.lua
return {
  "folke/tokyonight.nvim",
  -- カラースキームは起動時に読み込みたいのでfalse
  lazy = false,
  -- 確実に最初に読み込まれるように優先度を上げる
  priority = 1000,
  config = function()
    vim.cmd([[colorscheme tokyonight-night]])
  end,
}

プラグイン移行のポイント

  • ファイル単位で定義: lua/plugins/ 以下の各ファイルは、プラグインの設定テーブルを return する必要があります。
  • configとopts:
    • config キーは、プラグイン読み込み時に実行する処理を記述します。
    • opts キーを使うと、自動的に require('プラグイン名').setup(opts) が実行されるため、コードを簡略化できます。

プラグイン設定は、「【Neovim】 lazy.nvimのインストール・設定方法」という別記事で詳しく解説しています。

全てのプラグイン(cmp, lspconfig等)の移行が完了したら、古い設定ディレクトリを削除します。

# Bash
git rm -r lua/user/

まとめ

移行後の最終的なディレクトリ構造は以下のようになります。

# Plaintext 
# ~/.config/nvim
.
├── init.lua
├── lazy-lock.json
└── lua
    ├── config
    │   ├── keymaps.lua
    │   ├── lazy.lua
    │   └── options.lua
    └── plugins
        ├── cmp.lua
        ├── lspconfig.lua
        └── tokyonight.lua

Packer.nvimからLazy.nvimへ移行することで、メンテナンスの不安が解消されるだけでなく、設定の分割管理が容易になり、起動速度も劇的に改善されました。もしまだ移行されていない方は、ぜひこの機会にトライしてみてください!