vim-patch:9.0.0362: expanding ":e %" does not work for remote files

Problem:    Expanding ":e %" does not work for remote files.
Solution:   If the "%" or "#" file does not exist add the expansion anyway.
f5724376ab
This commit is contained in:
zeertzjq 2022-09-03 07:51:51 +08:00
parent 7243b1cbde
commit c62e5b5079
2 changed files with 26 additions and 1 deletions

View File

@ -2106,13 +2106,16 @@ int expand_wildcards_eval(char_u **pat, int *num_file, char ***file, int flags)
char *exp_pat = (char *)(*pat);
char *ignored_msg;
size_t usedlen;
const bool is_cur_alt_file = *exp_pat == '%' || *exp_pat == '#';
bool star_follows = false;
if (*exp_pat == '%' || *exp_pat == '#' || *exp_pat == '<') {
if (is_cur_alt_file || *exp_pat == '<') {
emsg_off++;
eval_pat = eval_vars((char_u *)exp_pat, (char_u *)exp_pat, &usedlen, NULL, &ignored_msg, NULL,
true);
emsg_off--;
if (eval_pat != NULL) {
star_follows = strcmp(exp_pat + usedlen, "*") == 0;
exp_pat = concat_str((char *)eval_pat, exp_pat + usedlen);
}
}
@ -2122,6 +2125,16 @@ int expand_wildcards_eval(char_u **pat, int *num_file, char ***file, int flags)
}
if (eval_pat != NULL) {
if (*num_file == 0 && is_cur_alt_file && star_follows) {
// Expanding "%" or "#" and the file does not exist: Add the
// pattern anyway (without the star) so that this works for remote
// files and non-file buffer names.
*file = xmalloc(sizeof(char *));
**file = (char *)eval_pat;
eval_pat = NULL;
*num_file = 1;
ret = OK;
}
xfree(exp_pat);
xfree(eval_pat);
}

View File

@ -1055,6 +1055,18 @@ func Test_cmdline_write_alternatefile()
bw!
endfunc
func Test_cmdline_expand_cur_alt_file()
enew
file http://some.com/file.txt
call feedkeys(":e %\<Tab>\<C-B>\"\<CR>", 'xt')
call assert_equal('"e http://some.com/file.txt', @:)
edit another
call feedkeys(":e #\<Tab>\<C-B>\"\<CR>", 'xt')
call assert_equal('"e http://some.com/file.txt', @:)
bwipe
bwipe http://some.com/file.txt
endfunc
" using a leading backslash here
set cpo+=C