aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c7
-rw-r--r--src/nvim/ex_docmd.c12
-rw-r--r--src/nvim/if_cscope.c3
-rw-r--r--src/nvim/os/env.c4
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])) {