diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-08-15 08:28:20 +0800 |
---|---|---|
committer | zeertzjq <zeertzjq@outlook.com> | 2022-08-15 10:14:53 +0800 |
commit | 9ab9eb1220113d247dd1eb089cb6576a135b8699 (patch) | |
tree | d3b03ad0d09022a99f2adc006881a93ed0ebe670 | |
parent | d6a6adf7082909d555914d85cac0a47d218d7b64 (diff) | |
download | rneovim-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.c | 2 | ||||
-rw-r--r-- | src/nvim/runtime.c | 13 | ||||
-rw-r--r-- | test/functional/ex_cmds/source_spec.lua | 28 |
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, ¤t_sctx); + si = get_current_script_id(&fname_exp, ¤t_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 |