commit bfe007a1872aa5700cd330eeebe5587b47b0450d
parent ac3e2ca6756598a0c9b342dfb3a8b25d9775ca9f
Author: zeertzjq <zeertzjq@outlook.com>
Date: Thu, 4 Dec 2025 11:28:44 +0800
vim-patch:9.1.1948: Windows: Vim adds current directory to search path
Problem: Windows: Vim always adds the current directory to search path.
This should only happen when using cmd.exe as 'shell'. For
example, powershell won't run binaries from the current
directory.
Solution: Only add current directory to system path, when using cmd.exe
as 'shell'.
related: vim/vim#10341
related: 083ec6d9a3b7
https://github.com/vim/vim/commit/4d87c9742a544a58c05cb34d4fbaac47e410b369
Co-authored-by: Christian Brabandt <cb@256bit.org>
Diffstat:
5 files changed, 22 insertions(+), 15 deletions(-)
diff --git a/runtime/doc/vimfn.txt b/runtime/doc/vimfn.txt
@@ -1875,10 +1875,12 @@ executable({expr}) *executable()*
On MS-Windows an executable in the same directory as the Vim
executable is always found (it's added to $PATH at |startup|).
*NoDefaultCurrentDirectoryInExePath*
- On MS-Windows an executable in Vim's current working directory
- is also normally found, but this can be disabled by setting
- the `$NoDefaultCurrentDirectoryInExePath` environment variable.
- This is always done for |:!| commands, for security reasons.
+ On MS-Windows when using cmd.exe as 'shell' an executable in
+ Vim's current working directory is also normally found, which
+ can be disabled by setting the
+ `$NoDefaultCurrentDirectoryInExePath` environment variable.
+ This is always done when executing external commands using
+ e.g. |:!|, |:make|, |system()| for security reasons.
The result is a Number:
1 exists
diff --git a/runtime/lua/vim/_meta/vimfn.lua b/runtime/lua/vim/_meta/vimfn.lua
@@ -1650,10 +1650,12 @@ function vim.fn.eventhandler() end
--- On MS-Windows an executable in the same directory as the Vim
--- executable is always found (it's added to $PATH at |startup|).
--- *NoDefaultCurrentDirectoryInExePath*
---- On MS-Windows an executable in Vim's current working directory
---- is also normally found, but this can be disabled by setting
---- the `$NoDefaultCurrentDirectoryInExePath` environment variable.
---- This is always done for |:!| commands, for security reasons.
+--- On MS-Windows when using cmd.exe as 'shell' an executable in
+--- Vim's current working directory is also normally found, which
+--- can be disabled by setting the
+--- `$NoDefaultCurrentDirectoryInExePath` environment variable.
+--- This is always done when executing external commands using
+--- e.g. |:!|, |:make|, |system()| for security reasons.
---
--- The result is a Number:
--- 1 exists
diff --git a/src/nvim/eval.lua b/src/nvim/eval.lua
@@ -2161,10 +2161,12 @@ M.funcs = {
On MS-Windows an executable in the same directory as the Vim
executable is always found (it's added to $PATH at |startup|).
*NoDefaultCurrentDirectoryInExePath*
- On MS-Windows an executable in Vim's current working directory
- is also normally found, but this can be disabled by setting
- the `$NoDefaultCurrentDirectoryInExePath` environment variable.
- This is always done for |:!| commands, for security reasons.
+ On MS-Windows when using cmd.exe as 'shell' an executable in
+ Vim's current working directory is also normally found, which
+ can be disabled by setting the
+ `$NoDefaultCurrentDirectoryInExePath` environment variable.
+ This is always done when executing external commands using
+ e.g. |:!|, |:make|, |system()| for security reasons.
The result is a Number:
1 exists
diff --git a/src/nvim/os/fs.c b/src/nvim/os/fs.c
@@ -355,7 +355,8 @@ static bool is_executable_in_path(const char *name, char **abspath)
#ifdef MSWIN
char *path = NULL;
- if (!os_env_exists("NoDefaultCurrentDirectoryInExePath", false)) {
+ if (!os_env_exists("NoDefaultCurrentDirectoryInExePath", false)
+ && strstr(path_tail(p_sh), "cmd.exe") != NULL) {
// Prepend ".;" to $PATH.
size_t pathlen = strlen(path_env);
path = xmallocz(pathlen + 2);
diff --git a/test/functional/vimscript/executable_spec.lua b/test/functional/vimscript/executable_spec.lua
@@ -202,9 +202,9 @@ describe('executable() (Windows)', function()
clear({ env = { PATHEXT = '' } })
command('set shell=sh')
for _, ext in ipairs(exts) do
- eq(1, call('executable', 'test_executable_' .. ext .. '.' .. ext))
+ eq(0, call('executable', 'test_executable_' .. ext .. '.' .. ext))
end
- eq(1, call('executable', 'test_executable_zzz.zzz'))
+ eq(0, call('executable', 'test_executable_zzz.zzz'))
end)
it("relative path, Unix-style 'shell' (backslashes)", function()