mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 9.0.0648: when using powershell input redirection does not work
Problem: When using powershell input redirection does not work. Solution: Use a different shell command for powershell. (Yegappan Lakshmanan, closes #11257)
This commit is contained in:
committed by
Bram Moolenaar
parent
13ece2ae1d
commit
0a016671b9
126
src/ex_cmds.c
126
src/ex_cmds.c
@@ -1531,56 +1531,68 @@ make_filter_cmd(
|
||||
{
|
||||
char_u *buf;
|
||||
long_u len;
|
||||
|
||||
#if defined(UNIX)
|
||||
int is_powershell = FALSE;
|
||||
#ifdef UNIX
|
||||
int is_fish_shell;
|
||||
char_u *shell_name = get_isolated_shell_name();
|
||||
#endif
|
||||
|
||||
char_u *shell_name = get_isolated_shell_name();
|
||||
if (shell_name == NULL)
|
||||
return NULL;
|
||||
|
||||
#if defined(UNIX)
|
||||
// Account for fish's different syntax for subshells
|
||||
is_fish_shell = (fnamecmp(shell_name, "fish") == 0);
|
||||
vim_free(shell_name);
|
||||
is_fish_shell = fnamecmp(shell_name, "fish") == 0;
|
||||
if (is_fish_shell)
|
||||
len = (long_u)STRLEN(cmd) + 13; // "begin; " + "; end" + NUL
|
||||
else
|
||||
#endif
|
||||
len = (long_u)STRLEN(cmd) + 3; // "()" + NUL
|
||||
{
|
||||
is_powershell = (shell_name[0] == 'p')
|
||||
&& (fnamecmp(shell_name, "powershell") == 0
|
||||
|| fnamecmp(shell_name, "powershell.exe") == 0
|
||||
|| fnamecmp(shell_name, "pwsh") == 0
|
||||
|| fnamecmp(shell_name, "pwsh.exe") == 0);
|
||||
len = (long_u)STRLEN(cmd) + 3; // "()" + NUL
|
||||
}
|
||||
|
||||
if (itmp != NULL)
|
||||
len += (long_u)STRLEN(itmp) + 9; // " { < " + " } "
|
||||
{
|
||||
if (is_powershell)
|
||||
// "& { Get-Content " + " | & " + " }"
|
||||
len += (long_u)STRLEN(itmp) + 24;
|
||||
else
|
||||
len += (long_u)STRLEN(itmp) + 9; // " { < " + " } "
|
||||
}
|
||||
if (otmp != NULL)
|
||||
len += (long_u)STRLEN(otmp) + (long_u)STRLEN(p_srr) + 2; // " "
|
||||
|
||||
vim_free(shell_name);
|
||||
|
||||
buf = alloc(len);
|
||||
if (buf == NULL)
|
||||
return NULL;
|
||||
|
||||
#if defined(UNIX)
|
||||
/*
|
||||
* Put braces around the command (for concatenated commands) when
|
||||
* redirecting input and/or output.
|
||||
*/
|
||||
if (itmp != NULL || otmp != NULL)
|
||||
if (is_powershell)
|
||||
{
|
||||
if (is_fish_shell)
|
||||
vim_snprintf((char *)buf, len, "begin; %s; end", (char *)cmd);
|
||||
if (itmp != NULL)
|
||||
vim_snprintf((char *)buf, len, "& { Get-Content %s | & %s }",
|
||||
itmp, cmd);
|
||||
else
|
||||
vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
|
||||
vim_snprintf((char *)buf, len, "(%s)", cmd);
|
||||
}
|
||||
else
|
||||
STRCPY(buf, cmd);
|
||||
if (itmp != NULL)
|
||||
{
|
||||
STRCAT(buf, " < ");
|
||||
STRCAT(buf, itmp);
|
||||
}
|
||||
#else
|
||||
// For shells that don't understand braces around commands, at least allow
|
||||
// the use of commands in a pipe.
|
||||
if (*p_sxe != NUL && *p_sxq == '(')
|
||||
{
|
||||
#if defined(UNIX)
|
||||
// Put braces around the command (for concatenated commands) when
|
||||
// redirecting input and/or output.
|
||||
if (itmp != NULL || otmp != NULL)
|
||||
vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
|
||||
{
|
||||
if (is_fish_shell)
|
||||
vim_snprintf((char *)buf, len, "begin; %s; end", (char *)cmd);
|
||||
else
|
||||
vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
|
||||
}
|
||||
else
|
||||
STRCPY(buf, cmd);
|
||||
if (itmp != NULL)
|
||||
@@ -1588,37 +1600,53 @@ make_filter_cmd(
|
||||
STRCAT(buf, " < ");
|
||||
STRCAT(buf, itmp);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
STRCPY(buf, cmd);
|
||||
if (itmp != NULL)
|
||||
#else
|
||||
// For shells that don't understand braces around commands, at least
|
||||
// allow the use of commands in a pipe.
|
||||
if (*p_sxe != NUL && *p_sxq == '(')
|
||||
{
|
||||
char_u *p;
|
||||
|
||||
// If there is a pipe, we have to put the '<' in front of it.
|
||||
// Don't do this when 'shellquote' is not empty, otherwise the
|
||||
// redirection would be inside the quotes.
|
||||
if (*p_shq == NUL)
|
||||
if (itmp != NULL || otmp != NULL)
|
||||
vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
|
||||
else
|
||||
STRCPY(buf, cmd);
|
||||
if (itmp != NULL)
|
||||
{
|
||||
p = find_pipe(buf);
|
||||
if (p != NULL)
|
||||
*p = NUL;
|
||||
STRCAT(buf, " < ");
|
||||
STRCAT(buf, itmp);
|
||||
}
|
||||
STRCAT(buf, " <"); // " < " causes problems on Amiga
|
||||
STRCAT(buf, itmp);
|
||||
if (*p_shq == NUL)
|
||||
}
|
||||
else
|
||||
{
|
||||
STRCPY(buf, cmd);
|
||||
if (itmp != NULL)
|
||||
{
|
||||
p = find_pipe(cmd);
|
||||
if (p != NULL)
|
||||
char_u *p;
|
||||
|
||||
// If there is a pipe, we have to put the '<' in front of it.
|
||||
// Don't do this when 'shellquote' is not empty, otherwise the
|
||||
// redirection would be inside the quotes.
|
||||
if (*p_shq == NUL)
|
||||
{
|
||||
STRCAT(buf, " "); // insert a space before the '|' for DOS
|
||||
STRCAT(buf, p);
|
||||
p = find_pipe(buf);
|
||||
if (p != NULL)
|
||||
*p = NUL;
|
||||
}
|
||||
STRCAT(buf, " <"); // " < " causes problems on Amiga
|
||||
STRCAT(buf, itmp);
|
||||
if (*p_shq == NUL)
|
||||
{
|
||||
p = find_pipe(cmd);
|
||||
if (p != NULL)
|
||||
{
|
||||
// insert a space before the '|' for DOS
|
||||
STRCAT(buf, " ");
|
||||
STRCAT(buf, p);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
if (otmp != NULL)
|
||||
append_redir(buf, (int)len, p_srr, otmp);
|
||||
|
||||
|
Reference in New Issue
Block a user