summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-12-27 16:55:11 +0100
committerBram Moolenaar <Bram@vim.org>2020-12-27 16:55:11 +0100
commit4389f9cd00632adc0216d5ead13d859b186bcbf8 (patch)
tree7bbafc23b6102f7ce39e8938d216c5d902db115c
parente462f52db3cab656485a71e4322b6cb18d564a06 (diff)
patch 8.2.2228: Vim9: cannot use ":e #" because # starts a commentv8.2.2228
Problem: Vim9: cannot use ":e #" because # starts a comment. Solution: Support using %% instead of #.
-rw-r--r--src/ex_docmd.c73
-rw-r--r--src/testdir/test_vim9_cmd.vim47
-rw-r--r--src/version.c2
3 files changed, 91 insertions, 31 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 156f0df16a..5e90ad16a3 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -8535,18 +8535,19 @@ find_cmdline_var(char_u *src, int *usedlen)
/*
* Evaluate cmdline variables.
*
- * change '%' to curbuf->b_ffname
- * '#' to curwin->w_alt_fnum
- * '<cword>' to word under the cursor
- * '<cWORD>' to WORD under the cursor
- * '<cexpr>' to C-expression under the cursor
- * '<cfile>' to path name under the cursor
- * '<sfile>' to sourced file name
- * '<stack>' to call stack
- * '<slnum>' to sourced file line number
- * '<afile>' to file name for autocommand
- * '<abuf>' to buffer number for autocommand
- * '<amatch>' to matching name for autocommand
+ * change "%" to curbuf->b_ffname
+ * "#" to curwin->w_alt_fnum
+ * "%%" to curwin->w_alt_fnum in Vim9 script
+ * "<cword>" to word under the cursor
+ * "<cWORD>" to WORD under the cursor
+ * "<cexpr>" to C-expression under the cursor
+ * "<cfile>" to path name under the cursor
+ * "<sfile>" to sourced file name
+ * "<stack>" to call stack
+ * "<slnum>" to sourced file line number
+ * "<afile>" to file name for autocommand
+ * "<abuf>" to buffer number for autocommand
+ * "<amatch>" to matching name for autocommand
*
* When an error is detected, "errormsg" is set to a non-NULL pointer (may be
* "" for error without a message) and NULL is returned.
@@ -8627,47 +8628,57 @@ eval_vars(
*/
else
{
+ int off = 0;
+
switch (spec_idx)
{
- case SPEC_PERC: // '%': current file
- if (curbuf->b_fname == NULL)
- {
- result = (char_u *)"";
- valid = 0; // Must have ":p:h" to be valid
- }
- else
+ case SPEC_PERC:
+ if (!in_vim9script() || src[1] != '%')
{
- result = curbuf->b_fname;
- tilde_file = STRCMP(result, "~") == 0;
+ // '%': current file
+ if (curbuf->b_fname == NULL)
+ {
+ result = (char_u *)"";
+ valid = 0; // Must have ":p:h" to be valid
+ }
+ else
+ {
+ result = curbuf->b_fname;
+ tilde_file = STRCMP(result, "~") == 0;
+ }
+ break;
}
- break;
+ // "%%" alternate file
+ off = 1;
+ // FALLTHROUGH
case SPEC_HASH: // '#' or "#99": alternate file
- if (src[1] == '#') // "##": the argument list
+ if (off == 0 ? src[1] == '#' : src[2] == '%')
{
+ // "##" or "%%%": the argument list
result = arg_all();
resultbuf = result;
- *usedlen = 2;
+ *usedlen = off + 2;
if (escaped != NULL)
*escaped = TRUE;
skip_mod = TRUE;
break;
}
- s = src + 1;
+ s = src + off + 1;
if (*s == '<') // "#<99" uses v:oldfiles
++s;
i = (int)getdigits(&s);
- if (s == src + 2 && src[1] == '-')
+ if (s == src + off + 2 && src[off + 1] == '-')
// just a minus sign, don't skip over it
s--;
*usedlen = (int)(s - src); // length of what we expand
- if (src[1] == '<' && i != 0)
+ if (src[off + 1] == '<' && i != 0)
{
- if (*usedlen < 2)
+ if (*usedlen < off + 2)
{
// Should we give an error message for #<text?
- *usedlen = 1;
+ *usedlen = off + 1;
return NULL;
}
#ifdef FEAT_EVAL
@@ -8685,8 +8696,8 @@ eval_vars(
}
else
{
- if (i == 0 && src[1] == '<' && *usedlen > 1)
- *usedlen = 1;
+ if (i == 0 && src[off + 1] == '<' && *usedlen > off + 1)
+ *usedlen = off + 1;
buf = buflist_findnr(i);
if (buf == NULL)
{
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index f5619b488d..b6644e394b 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -25,6 +25,53 @@ def Test_edit_wildcards()
CheckDefFailure(['edit `="foo"'], 'E1083:')
enddef
+def Test_expand_alternate_file()
+ var lines =<< trim END
+ edit Xfileone
+ var bone = bufnr()
+ edit Xfiletwo
+ var btwo = bufnr()
+ edit Xfilethree
+ var bthree = bufnr()
+
+ edit #
+ assert_equal(bthree, bufnr())
+ edit %%
+ assert_equal(btwo, bufnr())
+ edit %% # comment
+ assert_equal(bthree, bufnr())
+ edit %%yy
+ assert_equal('Xfiletwoyy', bufname())
+
+ exe "edit %%" .. bone
+ assert_equal(bone, bufnr())
+ exe "edit %%" .. btwo .. "xx"
+ assert_equal('Xfiletwoxx', bufname())
+
+ next Xfileone Xfiletwo Xfilethree
+ assert_equal('Xfileone', argv(0))
+ assert_equal('Xfiletwo', argv(1))
+ assert_equal('Xfilethree', argv(2))
+ next %%%zz
+ assert_equal('Xfileone', argv(0))
+ assert_equal('Xfiletwo', argv(1))
+ assert_equal('Xfilethreezz', argv(2))
+
+ v:oldfiles = ['Xonefile', 'Xtwofile']
+ edit %%<1
+ assert_equal('Xonefile', bufname())
+ edit %%<2
+ assert_equal('Xtwofile', bufname())
+ assert_fails('edit %%<3', 'E684:')
+
+ edit Xfileone.vim
+ edit Xfiletwo
+ edit %%:r
+ assert_equal('Xfileone', bufname())
+ END
+ CheckDefAndScriptSuccess(lines)
+enddef
+
def Test_global_backtick_expansion()
new
setline(1, 'xx')
diff --git a/src/version.c b/src/version.c
index f9216ced87..985e48e6b0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -751,6 +751,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 2228,
+/**/
2227,
/**/
2226,