【Neovim】packerを使っている人にlazyへの移行を勧める（移行手順あり）

## はじめに

neovimのプラグインマネージャって色々ありますが、最近だとlazyってやつが有力らしいですね。

https://github.com/folke/lazy.nvim

というのもここ最近まで有名だったpackerってプラグインマネージャがメンテナンスされなくなったらしく、その影響もあって今lazyが熱いようです。

https://github.com/wbthomason/packer.nvim

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2947418/274b8eea-2450-0886-66a1-15aa5f56b0b5.png)

そこで私もpackerからlazyに移行したのですが、その時の移行手順を紹介したいと思います。

## 移行手順

では実際に移行手順のご紹介です。
先に筆者のneovim設定ファイルを晒しておきます。適宜ご参考ください。
ちなみにpackerからlazyに移行したコミットは`1825dc9f`です。

https://github.com/ysmb-wtsg/nvim

さてまずはlazyのディレクトリ構成について紹介します。

lazyは以下のような構成を取ることが多いです。以下は筆者のディレクトリ構成です。

```~/.config/nvim
lua/
　|- settings/
　|  　|- core/
　|  　|  　|- init.lua
　|  　|  　|- keymaps.lua
　|  　|  　|_ options.lua
　|  　|- plugins/
　|  　|_ lazy.lua
　|- init.lua
　|_ lazy-lock.json
```

まずは`lua/init.lua`からです。

```init.lua
require("settings.core")
require("settings.lazy")
```

`settings`ディレクトリのモジュールを読み込んでいます。
`core`フォルダにはkeymapやoptionsなどのnvim全般の設定を記述しています。

`lazy.lua`は以下のようになっています。最後の行以外はlazyのgithubからコピペしただけです。

```settings/lazy.lua
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", -- latest stable release
		lazypath,
	})
end
vim.opt.rtp:prepend(lazypath)

require("lazy").setup({ { import = "settings.plugins" }, { import = "settings.plugins.lsp" } })
```

最後の行でプラグインディレクトリをimportしています。
筆者はlspのプラグインをサブディレクトリで管理しているので、2つimportしてます。(暗黙的にサブディレクトリも見てくれることはないみたいです)

で、あとはプラグインディレクトリとしてimportしたディレクトリにファイルを追加していくだけです。

### プラグインファイルの記述について

上記のディレクトリ構成の場合、プラグインファイルは必ずobjectをreturnする必要があります。[^1]
noiceというプラグインファイルを掲示します。

```settings/plugins/noice.lua
return {
	"folke/noice.nvim",
	dependencies = {
		"MunifTanjim/nui.nvim",
		"rcarriga/nvim-notify",
	},
	opts = {
		routes = {
			{
				filter = { event = "notify", find = "No information available" },
				opts = { skip = true },
			},
		},
		presets = {
			inc_rename = true,
			lsp_doc_border = true,
		},
	},
}
```

このように`return { }`の形式で記述していくことになります。
よく使うプロパティは以下です。

|プロパティ|説明|
|:--|:--|
|[1]|githubのurlを記述します。localにあるプラグインを読み込む場合を除いて必須の項目です。|
|dependencies|依存プラグインを記述します。packerでいう`requires`です。|
|event[^2]|プラグインのloadタイミングを指定できます。例えば`InsertEnter`と指定すると、インサートモードに入った時に初めてプラグインがloadされます。|
|opts|プラグインの設定を記述します。packerで`require("foo_module").setup({})`の中に書いていた内容をそのまま記述できます。|
|config|たまに`setup`の中で関数を使ったりしないといけない設定がありますが、そのためのプロパティです。`config = function()`と書いて、下に設定内容を書いていきます。|

で、実際の移行手順ですが、基本的には以下の流れでlazy用の構成に組み直せば問題ないかと思います。

1. `init.lua`で`lazy.lua`を読み込む
1. `lazy.lua`でlazyのセットアップスクリプトをコピペして、プラグインディレクトリをimportする
1. プラグインディレクトリに`use`でinstallしていたプラグインたちをファイル分割して入れていく

移行が完了すると、neovimを起動した時にlazyとその他プラグインのinstallが走ります。
![スクリーンショット 2024-06-08 4.45.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2947418/051fc6c0-e4ad-b1cd-ada6-f9c757139518.png)

packerも似たようなUIありますが、lazyの方が若干モダンな感じがして気持ちいです。

## 最後に

packerからlazy移行しないとな〜と一生思ってる方の助けになれば幸いです。。

それでは良いvimライフを！！！

[^1]: lazyのプラグイン読み込みは本来以下のようになります。
    ```lua
    require("lazy").setup({
      "folke/which-key.nvim",
      { "folke/neoconf.nvim", cmd = "Neoconf" },
      "folke/neodev.nvim",
    })
    ```
    今回はこのsetup内を`import`で代替するので、各プラグインファイルはobjectをreturnする必要があります。

[^2]: 指定可能なイベント一覧は[こちら](https://neovim.io/doc/user/autocmd.html#autocmd-events)