From dc6fc11b8753111a80f537dc762152d9adad2518 Mon Sep 17 00:00:00 2001 From: Yochem van Rosmalen Date: Mon, 19 May 2025 15:11:45 +0200 Subject: fix(defaults): start exrc search from parent directory Problem: The exrc file in the current directory is executed twice, here and in `do_exrc_initalization()`. Solution: Start search from parent directory. Let core handle exrc in current directory. --- runtime/lua/vim/_defaults.lua | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'runtime/lua') diff --git a/runtime/lua/vim/_defaults.lua b/runtime/lua/vim/_defaults.lua index d0b3fea389..9ae2412350 100644 --- a/runtime/lua/vim/_defaults.lua +++ b/runtime/lua/vim/_defaults.lua @@ -928,13 +928,17 @@ do vim.api.nvim_create_autocmd('VimEnter', { group = vim.api.nvim_create_augroup('nvim.find_exrc', {}), - desc = 'Find project-local configuration', + desc = 'Find exrc files in parent directories', callback = function() if vim.o.exrc then - local files = vim.fs.find( - { '.nvim.lua', '.nvimrc', '.exrc' }, - { type = 'file', upward = true, limit = math.huge } - ) + -- Start from parent directory, as exrc file in the current + -- directory is already loaded in do_exrc_initalization(). + local files = vim.fs.find({ '.nvim.lua', '.nvimrc', '.exrc' }, { + type = 'file', + upward = true, + limit = math.huge, + path = vim.fs.dirname(vim.uv.cwd()), + }) for _, file in ipairs(files) do local trusted = vim.secure.read(file) --[[@as string|nil]] if trusted then -- cgit From 8d397fa458a9f89c8e48fcaa281d2efcd0ef8e69 Mon Sep 17 00:00:00 2001 From: Yochem van Rosmalen Date: Mon, 19 May 2025 16:18:03 +0200 Subject: feat(exrc): stop searching in parent directories by unsetting 'exrc' Problem: No way for a user to limit 'exrc' search in parent directories (compare editorconfig.root). Solution: A configuration file can unset 'exrc', disabling the search for its parent directories. --- runtime/lua/vim/_defaults.lua | 38 +++++++++++++++++++++----------------- runtime/lua/vim/_meta/options.lua | 3 +++ 2 files changed, 24 insertions(+), 17 deletions(-) (limited to 'runtime/lua') diff --git a/runtime/lua/vim/_defaults.lua b/runtime/lua/vim/_defaults.lua index 9ae2412350..52fdfd0aef 100644 --- a/runtime/lua/vim/_defaults.lua +++ b/runtime/lua/vim/_defaults.lua @@ -930,25 +930,29 @@ do group = vim.api.nvim_create_augroup('nvim.find_exrc', {}), desc = 'Find exrc files in parent directories', callback = function() - if vim.o.exrc then - -- Start from parent directory, as exrc file in the current - -- directory is already loaded in do_exrc_initalization(). - local files = vim.fs.find({ '.nvim.lua', '.nvimrc', '.exrc' }, { - type = 'file', - upward = true, - limit = math.huge, - path = vim.fs.dirname(vim.uv.cwd()), - }) - for _, file in ipairs(files) do - local trusted = vim.secure.read(file) --[[@as string|nil]] - if trusted then - if vim.endswith(file, '.lua') then - loadstring(trusted)() - else - vim.api.nvim_exec2(trusted, {}) - end + if not vim.o.exrc then + return + end + local files = vim.fs.find({ '.nvim.lua', '.nvimrc', '.exrc' }, { + type = 'file', + upward = true, + limit = math.huge, + -- exrc in cwd already handled from C, thus start in parent directory. + path = vim.fs.dirname(vim.uv.cwd()), + }) + for _, file in ipairs(files) do + local trusted = vim.secure.read(file) --[[@as string|nil]] + if trusted then + if vim.endswith(file, '.lua') then + loadstring(trusted)() + else + vim.api.nvim_exec2(trusted, {}) end end + -- If the user unset 'exrc' in the current exrc then stop searching + if not vim.o.exrc then + return + end end end, }) diff --git a/runtime/lua/vim/_meta/options.lua b/runtime/lua/vim/_meta/options.lua index b77b135f92..90118cb4a1 100644 --- a/runtime/lua/vim/_meta/options.lua +++ b/runtime/lua/vim/_meta/options.lua @@ -2080,6 +2080,9 @@ vim.bo.et = vim.bo.expandtab --- directories (ordered upwards), if the files are in the `trust` list. --- Use `:trust` to manage trusted files. See also `vim.secure.read()`. --- +--- Unset 'exrc' to stop further searching of 'exrc' files in parent +--- directories, similar to `editorconfig.root`. +--- --- Compare 'exrc' to `editorconfig`: --- - 'exrc' can execute any code; editorconfig only specifies settings. --- - 'exrc' is Nvim-specific; editorconfig works in other editors. -- cgit