forked from aniani/vim
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)
This commit is contained in:
@@ -1676,6 +1676,26 @@ do_shell(
|
|||||||
apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf);
|
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
|
* Create a shell command from a command string, input redirection file and
|
||||||
* output redirection file.
|
* output redirection file.
|
||||||
@@ -1746,7 +1766,7 @@ make_filter_cmd(
|
|||||||
*/
|
*/
|
||||||
if (*p_shq == NUL)
|
if (*p_shq == NUL)
|
||||||
{
|
{
|
||||||
p = vim_strchr(buf, '|');
|
p = find_pipe(buf);
|
||||||
if (p != NULL)
|
if (p != NULL)
|
||||||
*p = NUL;
|
*p = NUL;
|
||||||
}
|
}
|
||||||
@@ -1754,7 +1774,7 @@ make_filter_cmd(
|
|||||||
STRCAT(buf, itmp);
|
STRCAT(buf, itmp);
|
||||||
if (*p_shq == NUL)
|
if (*p_shq == NUL)
|
||||||
{
|
{
|
||||||
p = vim_strchr(cmd, '|');
|
p = find_pipe(cmd);
|
||||||
if (p != NULL)
|
if (p != NULL)
|
||||||
{
|
{
|
||||||
STRCAT(buf, " "); /* insert a space before the '|' for DOS */
|
STRCAT(buf, " "); /* insert a space before the '|' for DOS */
|
||||||
|
@@ -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'))
|
||||||
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
|
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
|
||||||
|
@@ -792,6 +792,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
468,
|
||||||
/**/
|
/**/
|
||||||
467,
|
467,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user