Lazy.nvim でローカルにあるプラグインを読み込む方法

概要

前置き

拙作のプラグインである extend_word_motion.nvim を開発するため、ローカルにあるプラグインを lazy.nvim で読み込む必要がありましたので、そのための設定を備忘録として残します。

環境

1❯ nvim --version
2NVIM v0.10.2
3Build type: Release
4LuaJIT 2.1.1713773202
5Run "nvim -V1 -v" for more info
1# lazy.nvim
2version 11.16.2
3tag     v11.16.2
4branch  main
5commit  7e6c863
 1~/.config/nvim
 2  ├── init.lua
 3  ├── lazy-lock.json
 4  ├── lua
 5  │  ├── config
 6  │  ├── plugins
 7  │  │  ├── ...
 8  │  │  ├── extend_word_motion-nvim.lua
 9  │  │  └── ...
10  │  └── setting

必要な設定

ローカルプラグインを読み込むための設定は、公式リファレンスの configurationExamples で以下のとおり提示されています。それぞれの設定の説明は、コメントに書かれています。

 1dev = {
 2    -- Directory where you store your local plugin projects. If a function is used,
 3    -- the plugin directory (e.g. `~/projects/plugin-name`) must be returned.
 4    ---@type string | fun(plugin: LazyPlugin): string
 5    path = "~/projects",
 6    -- (拙訳)
 7    -- あなたがローカルプラグインのプロジェクトを保存したディレクトリ。function を使うのであれば、
 8    -- プラグインのディレクトリ(例: `~/projects/plugin-name`)が返される必要がある。
 9    ---@type string | fun(plugin: LazyPlugin): string
10
11    ---@type string[] plugins that match these patterns will use your local versions instead of being fetched from GitHub
12    patterns = {}, -- For example {"folke"}
13    -- (拙訳)
14    ---@type string[] これらのパターンにマッチするプラグインは、Github から取得してくる代わりにローカルにあるものを使います。
15
16    fallback = false, -- Fallback to git when local plugin doesn't exist
17},
 1return {
 2  -- local plugins need to be explicitly configured with dir
 3  { dir = "~/projects/secret.nvim" },
 4  (拙訳)
 5  -- ローカルプラグインは dir オプションを使って明示的に設定される必要があります。
 6
 7  -- local plugins can also be configured with the dev option.
 8  -- This will use {config.dev.path}/noice.nvim/ instead of fetching it from GitHub
 9  -- With the dev option, you can easily switch between the local and installed version of a plugin
10  { "folke/noice.nvim", dev = true },
11  (拙訳)
12  -- ローカルプラグインは、dev オプションを使うことでも設定されます。
13  -- GitHub からフェッチする代わりに {config.dev.path}/noice.nvim/ が使われます。
14  -- dev オプションを使うと、ローカル版とインストール版の間でプラグインのバージョンを簡単に切り替えられます。
15}

この説明と、ローカルプラグインのファイル構造を踏まえて、init.lualua/plugin/extend_word_motion.lua を以下のとおり設定しました。

 1~/my_neovim_plugins
 2  └── extend_word_motion.nvim
 3     ├── doc
 4     │  ├── extend_word_motion.txt
 5     │  └── tags
 6     ├── LICENSE
 7     ├── lua
 8     │  └── extend_word_motion
 9     │     ├── init.lua
10     │     └── util.lua
11     ├── plugin
12     │  └── extend_word_motion.vim
13     └── README.md
1-- init.lua
2require("lazy").setup({
3  dev = {
4    path = "~/my_neovim_plugins",
5  },
6  spec = {
7    import = 'plugins',
8  }
9})
1-- lua/plugins/extend_word_motion.lua
2return {
3  dir = '~/my_neovim_plugins/extend_word_motion.nvim',
4  opts = {},
5  dependencies = {
6    'sirasagi62/tinysegmenter.nvim'
7  },
8}

この設定により、~/my_neovim_plugins/extend_word_motion.nvim で開発しているローカルプラグインを lazy.nvim で読み込むことができました。

ローカル版と GitHub 版の切り替え

開発が一段落すると GitHub にプッシュすると思いますが、init.lualua/plugins/extend_word_motion.lua を以下のとおり変更すると、GitHub 版とローカル版を簡単に切り替えられるようになります。

 1-- init.lua
 2require("lazy").setup({
 3  dev = {
 4    path = "~/my_neovim_plugins",
 5    patterns = { 'extend_word_motion.nvim' },
 6  },
 7  spec = {
 8    import = 'plugins',
 9  }
10})
1-- lua/plugins/extend_word_motion.lua
2return  {
3  's-show/extend_word_motion.nvim',
4  dev = true,
5  opts = {},
6  dependencies = {
7    'sirasagi62/tinysegmenter.nvim'
8  },
9}

devtrue にすればローカル版が読み込まれ、false にすると GitHub 版が読み込まれます。

補足

もし、ローカルプラグインを追加する場合、そのプラグインの設定ファイルを lua/plugins に作成すればOKです。ここでは ~/my_neovim_plugins/test_plugin というプラグインを追加しています。

 1~/my_neovim_plugins
 2  ├── extend_word_motion
 3  │   ├── doc
 4  │   │  ├── extend_word_motion.txt
 5  │   │  └── tags
 6  │   ├── LICENSE
 7  │   ├── lua
 8  │   │  └── extend_word_motion
 9  │   │     ├── init.lua
10  │   │     └── util.lua
11  │   ├── plugin
12  │   │  └── extend_word_motion.vim
13  │   └── README.md
14  └── test_plugin
15      └── plugin
16          └── test_plugin.vim
1-- lua/plugins/test_plugin.lua
2return {
3  dir = '~/my_neovim_plugins/test_plugin',
4}

この設定で ~/my_neovim_plugins/testest_plugin が読み込まれます。