summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-05 14:57:51 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-05 14:57:51 +0200
commite9f262bdff2defa248e5d40b6520251799581ea4 (patch)
tree69ddc804a1b5f7be0ee2b07694739d0e0dd10b6a
parent3f40ce78f5c178d15871bd784ed878c78f0b8a44 (diff)
downloadvim-git-e9f262bdff2defa248e5d40b6520251799581ea4.tar.gz
patch 8.2.1129: Vim9: bar not recognized after not compiled commandv8.2.1129
Problem: Vim9: bar not recognized after not compiled command. Solution: Check for bar for commands where this is possible. (closes #6391)
-rw-r--r--src/testdir/test_vim9_cmd.vim34
-rw-r--r--src/version.c2
-rw-r--r--src/vim9compile.c32
3 files changed, 66 insertions, 2 deletions
diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim
index 27d2b3a7c..53d964fa8 100644
--- a/src/testdir/test_vim9_cmd.vim
+++ b/src/testdir/test_vim9_cmd.vim
@@ -2,6 +2,7 @@
source check.vim
source vim9.vim
+source view_util.vim
def Test_edit_wildcards()
let filename = 'Xtest'
@@ -207,5 +208,38 @@ def Test_method_call_linebreak()
CheckScriptSuccess(lines)
enddef
+def Test_bar_after_command()
+ def RedrawAndEcho()
+ let x = 'did redraw'
+ redraw | echo x
+ enddef
+ RedrawAndEcho()
+ assert_match('did redraw', Screenline(&lines))
+
+ if has('unix')
+ # bar in filter write command does not start new command
+ def WriteToShell()
+ new
+ setline(1, 'some text')
+ w !cat | cat > Xoutfile
+ bwipe!
+ enddef
+ WriteToShell()
+ assert_equal(['some text'], readfile('Xoutfile'))
+ delete('Xoutfile')
+
+ # bar in filter read command does not start new command
+ def ReadFromShell()
+ new
+ r! echo hello there | cat > Xoutfile
+ r !echo again | cat >> Xoutfile
+ bwipe!
+ enddef
+ ReadFromShell()
+ assert_equal(['hello there', 'again'], readfile('Xoutfile'))
+ delete('Xoutfile')
+ endif
+enddef
+
" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker
diff --git a/src/version.c b/src/version.c
index 880051efa..d079d2909 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1129,
+/**/
1128,
/**/
1127,
diff --git a/src/vim9compile.c b/src/vim9compile.c
index 9c2eaf432..5c3d08d30 100644
--- a/src/vim9compile.c
+++ b/src/vim9compile.c
@@ -6562,12 +6562,33 @@ compile_exec(char_u *line, exarg_T *eap, cctx_T *cctx)
{
char_u *p;
int has_expr = FALSE;
+ char_u *nextcmd = (char_u *)"";
if (cctx->ctx_skip == SKIP_YES)
goto theend;
if (eap->cmdidx >= 0 && eap->cmdidx < CMD_SIZE)
- has_expr = (excmd_get_argt(eap->cmdidx) & (EX_XFILE | EX_EXPAND));
+ {
+ long argt = excmd_get_argt(eap->cmdidx);
+ int usefilter = FALSE;
+
+ has_expr = argt & (EX_XFILE | EX_EXPAND);
+
+ // If the command can be followed by a bar, find the bar and truncate
+ // it, so that the following command can be compiled.
+ // The '|' is overwritten with a NUL, it is put back below.
+ if ((eap->cmdidx == CMD_write || eap->cmdidx == CMD_read)
+ && *eap->arg == '!')
+ // :w !filter or :r !filter or :r! filter
+ usefilter = TRUE;
+ if ((argt & EX_TRLBAR) && !usefilter)
+ {
+ separate_nextcmd(eap);
+ if (eap->nextcmd != NULL)
+ nextcmd = eap->nextcmd;
+ }
+ }
+
if (eap->cmdidx == CMD_syntax && STRNCMP(eap->arg, "include ", 8) == 0)
{
// expand filename in "syntax include [@group] filename"
@@ -6626,7 +6647,14 @@ compile_exec(char_u *line, exarg_T *eap, cctx_T *cctx)
generate_EXEC(cctx, line);
theend:
- return (char_u *)"";
+ if (*nextcmd != NUL)
+ {
+ // the parser expects a pointer to the bar, put it back
+ --nextcmd;
+ *nextcmd = '|';
+ }
+
+ return nextcmd;
}
/*