diff options
| author | Evgeni Chasnovski <evgeni.chasnovski@gmail.com> | 2025-11-13 15:49:13 +0200 |
|---|---|---|
| committer | Evgeni Chasnovski <evgeni.chasnovski@gmail.com> | 2025-11-16 22:19:10 +0200 |
| commit | a39171f5327e44162aebd17f16d4cb7ffddef1df (patch) | |
| tree | 9b7d8d3e180e62192928555acd6a4b89078fb9cc /test/functional/plugin/pack_spec.lua | |
| parent | e4e6605943665c2f7b3bb9f7e2b065188935bd33 (diff) | |
| download | rneovim-a39171f5327e44162aebd17f16d4cb7ffddef1df.tar.gz rneovim-a39171f5327e44162aebd17f16d4cb7ffddef1df.tar.bz2 rneovim-a39171f5327e44162aebd17f16d4cb7ffddef1df.zip | |
fix(pack)!: make default `opts.load` in `add()` to work inside 'plugin/'
Problem: Plain `vim.pack.add()` calls (with default `opts.load`) does
not fully work if called inside 'plugin/' runtime directory. In
particular, 'plugin/' files of newly added plugins are not sourced.
This is because `opts.load` is `false` during the whole startup, which
means `:packadd!` is used (modify 'runtimepath' but not force source
newly added 'plugin/' files).
This use case is common due to users organizing their config as
separate files in '~/.config/nvim/plugin/'.
Solution: Use newly added `v:vim_did_init` to decide default `opts.load`
value instead of `v:vim_did_enter`.
Diffstat (limited to 'test/functional/plugin/pack_spec.lua')
| -rw-r--r-- | test/functional/plugin/pack_spec.lua | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/test/functional/plugin/pack_spec.lua b/test/functional/plugin/pack_spec.lua index 5662e173d0..82e0277775 100644 --- a/test/functional/plugin/pack_spec.lua +++ b/test/functional/plugin/pack_spec.lua @@ -620,35 +620,42 @@ describe('vim.pack', function() end) describe('startup', function() - local init_lua = '' + local config_dir, pack_add_cmd = '', '' + before_each(function() - init_lua = vim.fs.joinpath(fn.stdpath('config'), 'init.lua') - fn.mkdir(vim.fs.dirname(init_lua), 'p') + config_dir = fn.stdpath('config') + fn.mkdir(vim.fs.joinpath(config_dir, 'plugin'), 'p') + + pack_add_cmd = ('vim.pack.add({ %s })'):format(vim.inspect(repos_src.plugindirs)) end) + after_each(function() - pcall(vim.fs.rm, init_lua, { force = true }) + vim.fs.rm(config_dir, { recursive = true, force = true }) end) - it('works in init.lua', function() - local pack_add_cmd = ('vim.pack.add({ %s })'):format(vim.inspect(repos_src.plugindirs)) - fn.writefile({ pack_add_cmd, '_G.done = true' }, init_lua) - - local function assert_loaded() - eq('plugindirs main', exec_lua('return require("plugindirs")')) + local function assert_loaded() + eq('plugindirs main', exec_lua('return require("plugindirs")')) - -- Should source 'plugin/' and 'after/plugin/' exactly once - eq({ true, true }, n.exec_lua('return { vim.g._plugin, vim.g._after_plugin }')) - eq({ 'p', 'a' }, n.exec_lua('return _G.DL')) - end + -- Should source 'plugin/' and 'after/plugin/' exactly once + eq({ true, true }, n.exec_lua('return { vim.g._plugin, vim.g._after_plugin }')) + eq({ 'p', 'a' }, n.exec_lua('return _G.DL')) + end + local function assert_works() -- Should auto-install but wait before executing code after it n.clear({ args_rm = { '-u' } }) n.exec_lua('vim.wait(500, function() return _G.done end, 50)') assert_loaded() - -- Should only `:packadd!` already installed plugin + -- Should only `:packadd!`/`:packadd` already installed plugin n.clear({ args_rm = { '-u' } }) assert_loaded() + end + + it('works in init.lua', function() + local init_lua = vim.fs.joinpath(config_dir, 'init.lua') + fn.writefile({ pack_add_cmd, '_G.done = true' }, init_lua) + assert_works() -- Should not load plugins if `--noplugin`, only adjust 'runtimepath' n.clear({ args = { '--noplugin' }, args_rm = { '-u' } }) @@ -656,6 +663,13 @@ describe('vim.pack', function() eq({}, n.exec_lua('return { vim.g._plugin, vim.g._after_plugin }')) eq(vim.NIL, n.exec_lua('return _G.DL')) end) + + it('works in plugin/', function() + local plugin_file = vim.fs.joinpath(config_dir, 'plugin', 'mine.lua') + fn.writefile({ pack_add_cmd, '_G.done = true' }, plugin_file) + -- Should source plugin's 'plugin/' files without explicit `load=true` + assert_works() + end) end) it('shows progress report during installation', function() |