1
0
forked from aniani/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 #3072)
This commit is contained in:
Bram Moolenaar
2018-07-25 21:19:13 +02:00
parent 6f8d2ac6f1
commit 00136dc321
8 changed files with 29 additions and 11 deletions

View File

@@ -9690,11 +9690,12 @@ shortpath_for_partial(
*/ */
int int
modify_fname( modify_fname(
char_u *src, /* string with modifiers */ char_u *src, // string with modifiers
int *usedlen, /* characters after src that are used */ int tilde_file, // "~" is a file name, not $HOME
char_u **fnamep, /* file name so far */ int *usedlen, // characters after src that are used
char_u **bufp, /* buffer for allocated file name or NULL */ char_u **fnamep, // file name so far
int *fnamelen) /* length of fnamep */ char_u **bufp, // buffer for allocated file name or NULL
int *fnamelen) // length of fnamep
{ {
int valid = 0; int valid = 0;
char_u *tail; char_u *tail;
@@ -9724,8 +9725,8 @@ repeat:
|| (*fnamep)[1] == '\\' || (*fnamep)[1] == '\\'
# endif # endif
|| (*fnamep)[1] == NUL) || (*fnamep)[1] == NUL)
#endif #endif
&& !(tilde_file && (*fnamep)[1] == NUL)
) )
{ {
*fnamep = expand_env_save(*fnamep); *fnamep = expand_env_save(*fnamep);

View File

@@ -3801,7 +3801,7 @@ f_fnamemodify(typval_T *argvars, typval_T *rettv)
else else
{ {
len = (int)STRLEN(fname); len = (int)STRLEN(fname);
(void)modify_fname(mods, &usedlen, &fname, &fbuf, &len); (void)modify_fname(mods, FALSE, &usedlen, &fname, &fbuf, &len);
} }
rettv->v_type = VAR_STRING; rettv->v_type = VAR_STRING;

View File

@@ -10654,6 +10654,7 @@ eval_vars(
int resultlen; int resultlen;
buf_T *buf; buf_T *buf;
int valid = VALID_HEAD + VALID_PATH; /* assume valid result */ int valid = VALID_HEAD + VALID_PATH; /* assume valid result */
int tilde_file = FALSE;
int spec_idx; int spec_idx;
#ifdef FEAT_MODIFY_FNAME #ifdef FEAT_MODIFY_FNAME
int skip_mod = FALSE; int skip_mod = FALSE;
@@ -10720,7 +10721,10 @@ eval_vars(
valid = 0; /* Must have ":p:h" to be valid */ valid = 0; /* Must have ":p:h" to be valid */
} }
else else
{
result = curbuf->b_fname; result = curbuf->b_fname;
tilde_file = STRCMP(result, "~") == 0;
}
break; break;
case SPEC_HASH: /* '#' or "#99": alternate file */ case SPEC_HASH: /* '#' or "#99": alternate file */
@@ -10784,7 +10788,10 @@ eval_vars(
valid = 0; /* Must have ":p:h" to be valid */ valid = 0; /* Must have ":p:h" to be valid */
} }
else else
{
result = buf->b_fname; result = buf->b_fname;
tilde_file = STRCMP(result, "~") == 0;
}
} }
break; break;
@@ -10877,7 +10884,7 @@ eval_vars(
#ifdef FEAT_MODIFY_FNAME #ifdef FEAT_MODIFY_FNAME
else if (!skip_mod) else if (!skip_mod)
{ {
valid |= modify_fname(src, usedlen, &result, &resultbuf, valid |= modify_fname(src, tilde_file, usedlen, &result, &resultbuf,
&resultlen); &resultlen);
if (result == NULL) if (result == NULL)
{ {

View File

@@ -519,7 +519,7 @@ cs_add_common(
#ifdef FEAT_MODIFY_FNAME #ifdef FEAT_MODIFY_FNAME
len = (int)STRLEN(fname); len = (int)STRLEN(fname);
fbuf = (char_u *)fname; fbuf = (char_u *)fname;
(void)modify_fname((char_u *)":p", &usedlen, (void)modify_fname((char_u *)":p", FALSE, &usedlen,
(char_u **)&fname, &fbuf, &len); (char_u **)&fname, &fbuf, &len);
if (fname == NULL) if (fname == NULL)
goto add_err; goto add_err;

View File

@@ -4908,7 +4908,7 @@ home_replace(
char_u *fbuf = NULL; char_u *fbuf = NULL;
flen = (int)STRLEN(homedir_env); flen = (int)STRLEN(homedir_env);
(void)modify_fname((char_u *)":p", &usedlen, (void)modify_fname((char_u *)":p", FALSE, &usedlen,
&homedir_env, &fbuf, &flen); &homedir_env, &fbuf, &flen);
flen = (int)STRLEN(homedir_env); flen = (int)STRLEN(homedir_env);
if (flen > 0 && vim_ispathsep(homedir_env[flen - 1])) if (flen > 0 && vim_ispathsep(homedir_env[flen - 1]))

View File

@@ -136,7 +136,7 @@ void fill_assert_error(garray_T *gap, typval_T *opt_msg_tv, char_u *exp_str, typ
int typval_compare(typval_T *typ1, typval_T *typ2, exptype_T type, int type_is, int ic); int typval_compare(typval_T *typ1, typval_T *typ2, exptype_T type, int type_is, int ic);
char_u *typval_tostring(typval_T *arg); char_u *typval_tostring(typval_T *arg);
int var_exists(char_u *var); int var_exists(char_u *var);
int modify_fname(char_u *src, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen); int modify_fname(char_u *src, int tilde_file, int *usedlen, char_u **fnamep, char_u **bufp, int *fnamelen);
char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, typval_T *expr, char_u *flags); char_u *do_string_sub(char_u *str, char_u *pat, char_u *sub, typval_T *expr, char_u *flags);
void filter_map(typval_T *argvars, typval_T *rettv, int map); void filter_map(typval_T *argvars, typval_T *rettv, int map);
/* vim: set ft=c : */ /* vim: set ft=c : */

View File

@@ -39,3 +39,11 @@ func Test_with_tilde()
call delete('Xdir ~ dir', 'd') call delete('Xdir ~ dir', 'd')
call assert_false(isdirectory('Xdir ~ dir')) call assert_false(isdirectory('Xdir ~ dir'))
endfunc endfunc
func Test_expand_tilde_filename()
split ~
call assert_equal('~', expand('%'))
call assert_notequal(expand('%:p'), expand('~/'))
call assert_match('\~', expand('%:p'))
bwipe!
endfunc

View File

@@ -793,6 +793,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
211,
/**/ /**/
210, 210,
/**/ /**/