diff options
author | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-05-25 17:22:19 -0400 |
---|---|---|
committer | Jan Edmund Lazo <jan.lazo@mail.utoronto.ca> | 2019-05-25 20:36:01 -0400 |
commit | 08aa9b00237ab45dadeffdf381e0e3c228337e53 (patch) | |
tree | 957ca9030f1b97b48e8befb38e1bbe185b0251ad /src | |
parent | 55419a6904306c21e6537a3b891df761ac352540 (diff) | |
download | rneovim-08aa9b00237ab45dadeffdf381e0e3c228337e53.tar.gz rneovim-08aa9b00237ab45dadeffdf381e0e3c228337e53.tar.bz2 rneovim-08aa9b00237ab45dadeffdf381e0e3c228337e53.zip |
vim-patch:8.1.0211: expanding a file name "~" results in $HOME
Problem: Expanding a file name "~" results in $HOME. (Aidan Shafran)
Solution: Change "~" to "./~" before expanding. (closes vim/vim#3072)
https://github.com/vim/vim/commit/00136dc321586800986e8f743c2f108f5eecbf92
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/eval.c | 7 | ||||
-rw-r--r-- | src/nvim/ex_docmd.c | 12 | ||||
-rw-r--r-- | src/nvim/if_cscope.c | 3 | ||||
-rw-r--r-- | src/nvim/os/env.c | 4 |
4 files changed, 17 insertions, 9 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c index 12e309bfdc..78a6092fa1 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -8868,8 +8868,8 @@ static void f_fnamemodify(typval_T *argvars, typval_T *rettv, FunPtr fptr) } else { len = strlen(fname); size_t usedlen = 0; - (void)modify_fname((char_u *)mods, &usedlen, (char_u **)&fname, &fbuf, - &len); + (void)modify_fname((char_u *)mods, false, &usedlen, + (char_u **)&fname, &fbuf, &len); } rettv->v_type = VAR_STRING; @@ -22623,6 +22623,7 @@ void reset_v_option_vars(void) int modify_fname( char_u *src, // string with modifiers + bool tilde_file, // "~" is a file name, not $HOME size_t *usedlen, // characters after src that are used char_u **fnamep, // file name so far char_u **bufp, // buffer for allocated file name or NULL @@ -22652,8 +22653,8 @@ repeat: || (*fnamep)[1] == '\\' # endif || (*fnamep)[1] == NUL) - #endif + && !(tilde_file && (*fnamep)[1] == NUL) ) { *fnamep = expand_env_save(*fnamep); xfree(*bufp); /* free any allocated file name */ diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index 979daf24fe..0e73d65432 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -8552,6 +8552,7 @@ eval_vars ( size_t resultlen; buf_T *buf; int valid = VALID_HEAD | VALID_PATH; // Assume valid result. + bool tilde_file = false; int skip_mod = false; char strbuf[30]; @@ -8609,8 +8610,10 @@ eval_vars ( if (curbuf->b_fname == NULL) { result = (char_u *)""; valid = 0; /* Must have ":p:h" to be valid */ - } else + } else { result = curbuf->b_fname; + tilde_file = STRCMP(result, "~") == 0; + } break; case SPEC_HASH: /* '#' or "#99": alternate file */ @@ -8660,8 +8663,10 @@ eval_vars ( if (buf->b_fname == NULL) { result = (char_u *)""; valid = 0; /* Must have ":p:h" to be valid */ - } else + } else { result = buf->b_fname; + tilde_file = STRCMP(result, "~") == 0; + } } break; @@ -8746,7 +8751,8 @@ eval_vars ( resultlen = (size_t)(s - result); } } else if (!skip_mod) { - valid |= modify_fname(src, usedlen, &result, &resultbuf, &resultlen); + valid |= modify_fname(src, tilde_file, usedlen, &result, + &resultbuf, &resultlen); if (result == NULL) { *errormsg = (char_u *)""; return NULL; diff --git a/src/nvim/if_cscope.c b/src/nvim/if_cscope.c index 4cb0c9a4ae..a033546394 100644 --- a/src/nvim/if_cscope.c +++ b/src/nvim/if_cscope.c @@ -425,7 +425,8 @@ cs_add_common( expand_env((char_u *)arg1, (char_u *)fname, MAXPATHL); size_t len = STRLEN(fname); fbuf = (char_u *)fname; - (void)modify_fname((char_u *)":p", &usedlen, (char_u **)&fname, &fbuf, &len); + (void)modify_fname((char_u *)":p", false, &usedlen, + (char_u **)&fname, &fbuf, &len); if (fname == NULL) goto add_err; fname = (char *)vim_strnsave((char_u *)fname, len); diff --git a/src/nvim/os/env.c b/src/nvim/os/env.c index 7d1021962c..b067de608b 100644 --- a/src/nvim/os/env.c +++ b/src/nvim/os/env.c @@ -870,8 +870,8 @@ size_t home_replace(const buf_T *const buf, const char_u *src, size_t usedlen = 0; size_t flen = strlen(homedir_env_mod); char_u *fbuf = NULL; - (void)modify_fname((char_u *)":p", &usedlen, (char_u **)&homedir_env_mod, - &fbuf, &flen); + (void)modify_fname((char_u *)":p", false, &usedlen, + (char_u **)&homedir_env_mod, &fbuf, &flen); flen = strlen(homedir_env_mod); assert(homedir_env_mod != homedir_env); if (vim_ispathsep(homedir_env_mod[flen - 1])) { |