diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/testdir/test_vim9_cmd.vim | 34 | ||||
-rw-r--r-- | src/version.c | 2 | ||||
-rw-r--r-- | src/vim9compile.c | 32 |
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; } /* |