# HG changeset patch # User Bram Moolenaar # Date 1662145203 -7200 # Node ID f005dea14c8b0d3bf01f4451393b68b97be75e11 # Parent 2c9fc18e1ffbde2e208b45109dd76e70300d0532 patch 9.0.0362: expanding ":e %" does not work for remote files Commit: https://github.com/vim/vim/commit/f5724376ab7362b5a98eaa8a331d663ef722c2a2 Author: Bram Moolenaar Date: Fri Sep 2 19:45:15 2022 +0100 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. diff --git a/src/filepath.c b/src/filepath.c --- a/src/filepath.c +++ b/src/filepath.c @@ -3088,17 +3088,22 @@ expand_wildcards_eval( int ret = FAIL; char_u *eval_pat = NULL; char_u *exp_pat = *pat; - char *ignored_msg; + char *ignored_msg; int usedlen; - - if (*exp_pat == '%' || *exp_pat == '#' || *exp_pat == '<') + int is_cur_alt_file = *exp_pat == '%' || *exp_pat == '#'; + int star_follows = FALSE; + + if (is_cur_alt_file || *exp_pat == '<') { ++emsg_off; eval_pat = eval_vars(exp_pat, 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(eval_pat, exp_pat + usedlen); + } } if (exp_pat != NULL) @@ -3106,6 +3111,20 @@ expand_wildcards_eval( 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 = ALLOC_ONE(char_u *); + if (*file != NULL) + { + **file = eval_pat; + eval_pat = NULL; + *num_file = 1; + ret = OK; + } + } vim_free(exp_pat); vim_free(eval_pat); } diff --git a/src/testdir/test_cmdline.vim b/src/testdir/test_cmdline.vim --- a/src/testdir/test_cmdline.vim +++ b/src/testdir/test_cmdline.vim @@ -1306,6 +1306,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 %\\\"\", 'xt') + call assert_equal('"e http://some.com/file.txt', @:) + edit another + call feedkeys(":e #\\\"\", '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 diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -708,6 +708,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 362, +/**/ 361, /**/ 360,