aboutsummaryrefslogtreecommitdiff
path: root/test/functional/api/vim_spec.lua
diff options
context:
space:
mode:
authortao <2471314@gmail.com>2026-06-10 19:46:55 +0800
committerGitHub <noreply@github.com>2026-06-10 07:46:55 -0400
commit7bf2ab4b87e08807ca9fa1901ac915427428a928 (patch)
tree22950ac4bfd50bbd0f5533713cfb6d13c2f1af70 /test/functional/api/vim_spec.lua
parent61380c5e0abc202e727df020a9d26684934f504e (diff)
downloadrneovim-7bf2ab4b87e08807ca9fa1901ac915427428a928.tar.gz
rneovim-7bf2ab4b87e08807ca9fa1901ac915427428a928.tar.bz2
rneovim-7bf2ab4b87e08807ca9fa1901ac915427428a928.zip
fix(path): `nvim_get_runtime_file` fails on DOS 8.3 filename #40144
Problem: stdpath() may return a DOS 8.3 "shortened" filename, because Windows truncates some long usernames into `6ch~N` names. Then features such as `nvim_get_runtime_file` fail to find the file. Analysis: When expanding an 8.3 filename path like `C:/Users/ADMINI~1/AppData/*`, we treat `~` as a special character and first check whether a directory named `ADMINI~1` exists under `Users`. Since no such directory actually exists, the expansion fails. Solution: Treat `~` as a literal character in `do_path_expand`. Since the `~/` case is already handled in `gen_expand_wildcards`, any remaining `~` is just a literal character and will later be escaped to `\~` by `file_pat_to_reg_pat` if needed.
Diffstat (limited to 'test/functional/api/vim_spec.lua')
-rw-r--r--test/functional/api/vim_spec.lua17
1 files changed, 17 insertions, 0 deletions
diff --git a/test/functional/api/vim_spec.lua b/test/functional/api/vim_spec.lua
index c900c9cf61..16cd24dd53 100644
--- a/test/functional/api/vim_spec.lua
+++ b/test/functional/api/vim_spec.lua
@@ -3756,6 +3756,23 @@ describe('API', function()
eq(p(val[1]), vimruntime .. '/syntax/vim.vim')
eq(p(val[2]), vimruntime .. '/ftplugin/vim.vim')
end)
+
+ it('finds files via an 8.3 filename path #25019', function()
+ skip(not is_os('win'), 'N/A: 8.3 filenames are only available on Windows')
+ local path = 'Xtest_runtime_path'
+ mkdir_p(('%s/subdir/lua'):format(path))
+ write_file(('%s/subdir/lua/foo.lua'):format(path), '')
+ finally(function()
+ rmdir(path)
+ end)
+ local path_with_shortname =
+ p(fn.system(('for %%I in ("%s") do @echo %%~sI'):format(path), ''):gsub('\n', ''))
+ skip(path == vim.fs.basename(path_with_shortname), 'N/A: 8.3 filenames are disabled')
+ exec_lua(('vim.opt.rtp:prepend("%s/*")'):format(path_with_shortname))
+ local val = api.nvim_get_runtime_file('lua/foo.lua', true)
+ eq(1, #val)
+ eq(('%s/subdir/lua/foo.lua'):format(path_with_shortname), val[1])
+ end)
end)
describe('nvim_get_all_options_info', function()