mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.1.0468: MS-Windows: filter command with pipe character fails (#9101)
Problem: MS-Windows: Filter command with pipe character fails. (Johannes
Riecken)
Solution: Find the pipe character outside of quotes. (Yasuhiro Matsumoto,
closes vim/vim#1743, closes vim/vim#3523)
0664089ecc
This commit is contained in:
parent
8c7c8f5962
commit
e17e21e4cf
@ -1353,6 +1353,25 @@ do_shell(
|
|||||||
apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf);
|
apply_autocmds(EVENT_SHELLCMDPOST, NULL, NULL, FALSE, curbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if !defined(UNIX)
|
||||||
|
static char *find_pipe(const char *cmd)
|
||||||
|
{
|
||||||
|
bool inquote = false;
|
||||||
|
|
||||||
|
for (const char *p = cmd; *p != NUL; p++) {
|
||||||
|
if (!inquote && *p == '|') {
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
if (*p == '"') {
|
||||||
|
inquote = !inquote;
|
||||||
|
} else if (rem_backslash((const char_u *)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.
|
||||||
///
|
///
|
||||||
@ -1406,7 +1425,7 @@ char_u *make_filter_cmd(char_u *cmd, char_u *itmp, char_u *otmp)
|
|||||||
// Don't do this when 'shellquote' is not empty, otherwise the
|
// Don't do this when 'shellquote' is not empty, otherwise the
|
||||||
// redirection would be inside the quotes.
|
// redirection would be inside the quotes.
|
||||||
if (*p_shq == NUL) {
|
if (*p_shq == NUL) {
|
||||||
char *const p = strchr(buf, '|');
|
char *const p = find_pipe(buf);
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
*p = NUL;
|
*p = NUL;
|
||||||
}
|
}
|
||||||
@ -1414,7 +1433,7 @@ char_u *make_filter_cmd(char_u *cmd, char_u *itmp, char_u *otmp)
|
|||||||
xstrlcat(buf, " < ", len);
|
xstrlcat(buf, " < ", len);
|
||||||
xstrlcat(buf, (const char *)itmp, len);
|
xstrlcat(buf, (const char *)itmp, len);
|
||||||
if (*p_shq == NUL) {
|
if (*p_shq == NUL) {
|
||||||
const char *const p = strchr((const char *)cmd, '|');
|
const char *const p = find_pipe((const char *)cmd);
|
||||||
if (p != NULL) {
|
if (p != NULL) {
|
||||||
xstrlcat(buf, " ", len - 1); // Insert a space before the '|' for DOS
|
xstrlcat(buf, " ", len - 1); // Insert a space before the '|' for DOS
|
||||||
xstrlcat(buf, p, len - 1);
|
xstrlcat(buf, p, len - 1);
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user