# HG changeset patch # User Bram Moolenaar # Date 1593954004 -7200 # Node ID eb6c27af07ddab8af5ecb975a706b86b9e09fcf0 # Parent aae581cf2a1a6ca79a1e7f4c6c02a48134547b7a patch 8.2.1129: Vim9: bar not recognized after not compiled command Commit: https://github.com/vim/vim/commit/e9f262bdff2defa248e5d40b6520251799581ea4 Author: Bram Moolenaar Date: Sun Jul 5 14:57:51 2020 +0200 patch 8.2.1129: Vim9: bar not recognized after not compiled command Problem: Vim9: bar not recognized after not compiled command. Solution: Check for bar for commands where this is possible. (closes https://github.com/vim/vim/issues/6391) diff --git a/src/testdir/test_vim9_cmd.vim b/src/testdir/test_vim9_cmd.vim --- 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 --- 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 --- a/src/vim9compile.c +++ b/src/vim9compile.c @@ -6562,12 +6562,33 @@ compile_exec(char_u *line, exarg_T *eap, { 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, 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; } /*