From 0664089eccec1083dd04ef2255856fb34ce62f15 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Tue, 9 Oct 2018 21:49:33 +0200 Subject: [PATCH] patch 8.1.0468: MS-Windows: filter command with pipe character fails Problem: MS-Windows: Filter command with pipe character fails. (Johannes Riecken) Solution: Find the pipe character outside of quotes. (Yasuhiro Matsumoto, closes #1743, closes #3523) --- src/ex_cmds.c | 24 ++++++++++++++++++++++-- src/testdir/test_filter_cmd.vim | 13 +++++++++++++ src/version.c | 2 ++ 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 99c19f913..0a5387c52 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1676,6 +1676,26 @@ do_shell( apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf); } +#if !defined(UNIX) + static char_u * +find_pipe(char_u *cmd) +{ + char_u *p; + int inquote = FALSE; + + for (p = cmd; *p != NUL; ++p) + { + if (!inquote && *p == '|') + return p; + if (*p == '"') + inquote = !inquote; + else if (rem_backslash(p)) + ++p; + } + return NULL; +} +#endif + /* * Create a shell command from a command string, input redirection file and * output redirection file. @@ -1746,7 +1766,7 @@ make_filter_cmd( */ if (*p_shq == NUL) { - p = vim_strchr(buf, '|'); + p = find_pipe(buf); if (p != NULL) *p = NUL; } @@ -1754,7 +1774,7 @@ make_filter_cmd( STRCAT(buf, itmp); if (*p_shq == NUL) { - p = vim_strchr(cmd, '|'); + p = find_pipe(cmd); if (p != NULL) { STRCAT(buf, " "); /* insert a space before the '|' for DOS */ diff --git a/src/testdir/test_filter_cmd.vim b/src/testdir/test_filter_cmd.vim index 5aa5fa64d..86347ab77 100644 --- a/src/testdir/test_filter_cmd.vim +++ b/src/testdir/test_filter_cmd.vim @@ -74,3 +74,16 @@ func Test_filter_cmd_completion() call assert_equal('filter /pat/ print', s:complete_filter_cmd('filter /pat/ pri')) call assert_equal('filter #pat# print', s:complete_filter_cmd('filter #pat# pri')) endfunc + +func Test_filter_cmd_with_filter() + new + set shelltemp + %!echo "a|b" + let out = getline(1) + bw! + if has('win32') + let out = trim(out, '" ') + endif + call assert_equal('a|b', out) + set shelltemp& +endfunction diff --git a/src/version.c b/src/version.c index def449a57..d4cccb941 100644 --- a/src/version.c +++ b/src/version.c @@ -792,6 +792,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 468, /**/ 467, /**/ -- 2.40.0