aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-08-15 08:28:20 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-08-15 10:14:53 +0800
commit9ab9eb1220113d247dd1eb089cb6576a135b8699 (patch)
treed3b03ad0d09022a99f2adc006881a93ed0ebe670
parentd6a6adf7082909d555914d85cac0a47d218d7b64 (diff)
downloadrneovim-9ab9eb1220113d247dd1eb089cb6576a135b8699.tar.gz
rneovim-9ab9eb1220113d247dd1eb089cb6576a135b8699.tar.bz2
rneovim-9ab9eb1220113d247dd1eb089cb6576a135b8699.zip
fix(source): make changing 'shellslash' change expand() result
-rw-r--r--src/nvim/lua/executor.c2
-rw-r--r--src/nvim/runtime.c13
-rw-r--r--test/functional/ex_cmds/source_spec.lua28
3 files changed, 36 insertions, 7 deletions
diff --git a/src/nvim/lua/executor.c b/src/nvim/lua/executor.c
index 2e5b411fad..a86f23db8e 100644
--- a/src/nvim/lua/executor.c
+++ b/src/nvim/lua/executor.c
@@ -1906,7 +1906,7 @@ void nlua_set_sctx(sctx_T *current)
break;
}
char *source_path = fix_fname(info->source + 1);
- get_current_script_id((char_u *)source_path, current);
+ get_current_script_id(&source_path, current);
xfree(source_path);
current->sc_lnum = info->currentline;
current->sc_seq = -1;
diff --git a/src/nvim/runtime.c b/src/nvim/runtime.c
index 044294f3b0..4eb38c2c9e 100644
--- a/src/nvim/runtime.c
+++ b/src/nvim/runtime.c
@@ -1964,7 +1964,7 @@ int do_source(char *fname, int check_other, int is_vimrc)
save_funccal(&funccalp_entry);
const sctx_T save_current_sctx = current_sctx;
- si = get_current_script_id((char_u *)fname_exp, &current_sctx);
+ si = get_current_script_id(&fname_exp, &current_sctx);
if (l_do_profiling == PROF_YES) {
bool forceit = false;
@@ -2077,9 +2077,9 @@ theend:
/// Check if fname was sourced before to finds its SID.
/// If it's new, generate a new SID.
///
-/// @param[in] fname file path of script
-/// @param[out] ret_sctx sctx of this script
-scriptitem_T *get_current_script_id(char_u *fname, sctx_T *ret_sctx)
+/// @param[in,out] fnamep pointer to file path of script
+/// @param[out] ret_sctx sctx of this script
+scriptitem_T *get_current_script_id(char **fnamep, sctx_T *ret_sctx)
{
static int last_current_SID_seq = 0;
@@ -2096,13 +2096,14 @@ scriptitem_T *get_current_script_id(char_u *fname, sctx_T *ret_sctx)
// - If a script is deleted and another script is written, with a
// different name, the inode may be re-used.
si = &SCRIPT_ITEM(script_sctx.sc_sid);
- if (si->sn_name != NULL && FNAMECMP(si->sn_name, fname) == 0) {
+ if (si->sn_name != NULL && FNAMECMP(si->sn_name, *fnamep) == 0) {
// Found it!
break;
}
}
if (script_sctx.sc_sid == 0) {
- si = new_script_item((char *)vim_strsave(fname), &script_sctx.sc_sid);
+ si = new_script_item(*fnamep, &script_sctx.sc_sid);
+ *fnamep = xstrdup((char *)si->sn_name);
}
if (ret_sctx != NULL) {
*ret_sctx = script_sctx;
diff --git a/test/functional/ex_cmds/source_spec.lua b/test/functional/ex_cmds/source_spec.lua
index 13a40fcc53..4bc3355e9e 100644
--- a/test/functional/ex_cmds/source_spec.lua
+++ b/test/functional/ex_cmds/source_spec.lua
@@ -13,6 +13,10 @@ local exec_lua = helpers.exec_lua
local eval = helpers.eval
local exec_capture = helpers.exec_capture
local neq = helpers.neq
+local matches = helpers.matches
+local iswin = helpers.iswin
+local mkdir = helpers.mkdir
+local rmdir = helpers.rmdir
describe(':source', function()
before_each(function()
@@ -39,6 +43,30 @@ describe(':source', function()
os.remove(test_file)
end)
+ it("changing 'shellslash' changes the result of expand()", function()
+ if not iswin() then
+ pending("'shellslash' only works on Windows")
+ return
+ end
+ mkdir('Xshellslash')
+ local script = [[
+ let g:result1 = expand('<stack>')
+ set shellslash
+ let g:result2 = expand('<stack>')
+ set noshellslash
+ let g:result3 = expand('<stack>')
+ ]]
+ write_file([[Xshellslash/Xexpand.vim]], script)
+
+ meths.set_option('shellslash', false)
+ command([[source Xshellslash/Xexpand.vim]])
+ matches([[Xshellslash\Xexpand%.vim]], meths.get_var('result1'))
+ matches([[Xshellslash/Xexpand%.vim]], meths.get_var('result2'))
+ matches([[Xshellslash\Xexpand%.vim]], meths.get_var('result3'))
+
+ rmdir('Xshellslash')
+ end)
+
it('current buffer', function()
insert([[
let a = 2