summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-11-25 20:12:11 +0100
committerBram Moolenaar <Bram@vim.org>2020-11-25 20:12:11 +0100
commit47a2abf0bc3c3dac0433754ad0365ebad152df8c (patch)
treef8062b3e3006cb009b8b578fe0769e7992829283
parent34c54eb6cbda5dbc14376c8b1c62ad11d4852793 (diff)
patch 8.2.2052: Vim9: "edit +4 fname" gives an errorv8.2.2052
Problem: Vim9: "edit +4 fname" gives an error. (Naruhiko Nishino) Solution: Allow using a range in the +cmd argument. (closes #7364)
-rw-r--r--src/ex_cmds.c2
-rw-r--r--src/ex_docmd.c35
-rw-r--r--src/proto/ex_docmd.pro1
-rw-r--r--src/testdir/test_vim9_cmd.vim12
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h1
6 files changed, 41 insertions, 12 deletions
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index aa9fe9b0a0..44d8cd8500 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -3123,7 +3123,7 @@ do_ecmd(
#endif
if (command != NULL)
- do_cmdline(command, NULL, NULL, DOCMD_VERBOSE);
+ do_cmdline(command, NULL, NULL, DOCMD_VERBOSE|DOCMD_RANGEOK);
#ifdef FEAT_KEYMAP
if (curbuf->b_kmap_state & KEYMAP_INIT)
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 44e113d53b..582791af63 100644
--- a/src/ex_docmd.c
+++ b/src/ex_docmd.c
@@ -595,6 +595,17 @@ do_cmdline_cmd(char_u *cmd)
}
/*
+ * Execute the "+cmd" argument of "edit +cmd fname" and the like.
+ * This allows for using a range without ":" in Vim9 script.
+ */
+ int
+do_cmd_argument(char_u *cmd)
+{
+ return do_cmdline(cmd, NULL, NULL,
+ DOCMD_VERBOSE|DOCMD_NOWAIT|DOCMD_KEYTYPED|DOCMD_RANGEOK);
+}
+
+/*
* do_cmdline(): execute one Ex command line
*
* 1. Execute "cmdline" when it is not NULL.
@@ -989,7 +1000,7 @@ do_cmdline(
* "cmdline_copy" can change, e.g. for '%' and '#' expansion.
*/
++recursive;
- next_cmdline = do_one_cmd(&cmdline_copy, flags & DOCMD_VERBOSE,
+ next_cmdline = do_one_cmd(&cmdline_copy, flags,
#ifdef FEAT_EVAL
&cstack,
#endif
@@ -1685,7 +1696,8 @@ comment_start(char_u *p, int starts_with_colon UNUSED)
/*
* Execute one Ex command.
*
- * If 'sourcing' is TRUE, the command will be included in the error message.
+ * If "flags" has DOCMD_VERBOSE, the command will be included in the error
+ * message.
*
* 1. skip comment lines and leading space
* 2. handle command modifiers
@@ -1708,7 +1720,7 @@ comment_start(char_u *p, int starts_with_colon UNUSED)
static char_u *
do_one_cmd(
char_u **cmdlinep,
- int sourcing,
+ int flags,
#ifdef FEAT_EVAL
cstack_T *cstack,
#endif
@@ -1731,6 +1743,7 @@ do_one_cmd(
int vim9script = in_vim9script();
int did_set_expr_line = FALSE;
#endif
+ int sourcing = flags & DOCMD_VERBOSE;
CLEAR_FIELD(ea);
ea.line1 = 1;
@@ -1794,7 +1807,7 @@ do_one_cmd(
#ifdef FEAT_EVAL
// In Vim9 script a colon is required before the range. This may also be
// after command modifiers.
- if (vim9script)
+ if (vim9script && (flags & DOCMD_RANGEOK) == 0)
{
may_have_range = FALSE;
for (p = ea.cmd; p >= *cmdlinep; --p)
@@ -5009,7 +5022,7 @@ ex_buffer(exarg_T *eap)
else
goto_buffer(eap, DOBUF_FIRST, FORWARD, (int)eap->line2);
if (eap->do_ecmd_cmd != NULL)
- do_cmdline_cmd(eap->do_ecmd_cmd);
+ do_cmd_argument(eap->do_ecmd_cmd);
}
}
@@ -5022,7 +5035,7 @@ ex_bmodified(exarg_T *eap)
{
goto_buffer(eap, DOBUF_MOD, FORWARD, (int)eap->line2);
if (eap->do_ecmd_cmd != NULL)
- do_cmdline_cmd(eap->do_ecmd_cmd);
+ do_cmd_argument(eap->do_ecmd_cmd);
}
/*
@@ -5037,7 +5050,7 @@ ex_bnext(exarg_T *eap)
goto_buffer(eap, DOBUF_CURRENT, FORWARD, (int)eap->line2);
if (eap->do_ecmd_cmd != NULL)
- do_cmdline_cmd(eap->do_ecmd_cmd);
+ do_cmd_argument(eap->do_ecmd_cmd);
}
/*
@@ -5054,7 +5067,7 @@ ex_bprevious(exarg_T *eap)
goto_buffer(eap, DOBUF_CURRENT, BACKWARD, (int)eap->line2);
if (eap->do_ecmd_cmd != NULL)
- do_cmdline_cmd(eap->do_ecmd_cmd);
+ do_cmd_argument(eap->do_ecmd_cmd);
}
/*
@@ -5071,7 +5084,7 @@ ex_brewind(exarg_T *eap)
goto_buffer(eap, DOBUF_FIRST, FORWARD, 0);
if (eap->do_ecmd_cmd != NULL)
- do_cmdline_cmd(eap->do_ecmd_cmd);
+ do_cmd_argument(eap->do_ecmd_cmd);
}
/*
@@ -5086,7 +5099,7 @@ ex_blast(exarg_T *eap)
goto_buffer(eap, DOBUF_LAST, BACKWARD, 0);
if (eap->do_ecmd_cmd != NULL)
- do_cmdline_cmd(eap->do_ecmd_cmd);
+ do_cmd_argument(eap->do_ecmd_cmd);
}
/*
@@ -6680,7 +6693,7 @@ do_exedit(
else
{
if (eap->do_ecmd_cmd != NULL)
- do_cmdline_cmd(eap->do_ecmd_cmd);
+ do_cmd_argument(eap->do_ecmd_cmd);
#ifdef FEAT_TITLE
n = curwin->w_arg_idx_invalid;
#endif
diff --git a/src/proto/ex_docmd.pro b/src/proto/ex_docmd.pro
index f8cb7ef68b..374d3996b3 100644
--- a/src/proto/ex_docmd.pro
+++ b/src/proto/ex_docmd.pro
@@ -1,6 +1,7 @@
/* ex_docmd.c */
void do_exmode(int improved);
int do_cmdline_cmd(char_u *cmd);
+int do_cmd_argument(char_u *cmd);
int do_cmdline(char_u *cmdline, char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie, int flags);
int getline_equal(char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie, char_u *(*func)(int, void *, int, getline_opt_T));
void *getline_cookie(char_u *(*fgetline)(int, void *, int, getline_opt_T), void *cookie);
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 97110ce527..d0f9872caa 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -648,5 +648,17 @@ def Test_star_command()
CheckScriptSuccess(lines)
enddef
+def Test_cmd_argument_without_colon()
+ new Xfile
+ setline(1, ['a', 'b', 'c', 'd'])
+ write
+ edit +3 %
+ assert_equal(3, getcurpos()[1])
+ edit +/a %
+ assert_equal(1, getcurpos()[1])
+ bwipe
+ delete('Xfile')
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index 4c54fe5806..c653cdc84f 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 */
/**/
+ 2052,
+/**/
2051,
/**/
2050,
diff --git a/src/vim.h b/src/vim.h
index d2e22fef09..6dcc509aa1 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -1043,6 +1043,7 @@ extern int (*dyn_libintl_wputenv)(const wchar_t *envstring);
#define DOCMD_KEYTYPED 0x08 // don't reset KeyTyped
#define DOCMD_EXCRESET 0x10 // reset exception environment (for debugging)
#define DOCMD_KEEPLINE 0x20 // keep typed line for repeating with "."
+#define DOCMD_RANGEOK 0240 // can use a range without ":" in Vim9 script
// flags for beginline()
#define BL_WHITE 1 // cursor on first non-white in the line