Patch 9.0.0648
Problem: When using powershell input redirection does not work.
Solution: Use a different shell command for powershell. (Yegappan
Lakshmanan, closes #11257)
Files: src/ex_cmds.c, src/testdir/test_shell.vim
*** ../vim-9.0.0647/src/ex_cmds.c 2022-09-19 18:20:03.795886974 +0100
--- src/ex_cmds.c 2022-10-03 16:03:30.737928715 +0100
***************
*** 1531,1586 ****
{
char_u *buf;
long_u len;
!
! #if defined(UNIX)
int is_fish_shell;
! char_u *shell_name = get_isolated_shell_name();
if (shell_name == NULL)
return NULL;
// Account for fish's different syntax for subshells
! is_fish_shell = (fnamecmp(shell_name, "fish") == 0);
! vim_free(shell_name);
if (is_fish_shell)
len = (long_u)STRLEN(cmd) + 13; // "begin; " + "; end" + NUL
else
#endif
! len = (long_u)STRLEN(cmd) + 3; // "()" + NUL
if (itmp != NULL)
! len += (long_u)STRLEN(itmp) + 9; // " { < " + " } "
if (otmp != NULL)
len += (long_u)STRLEN(otmp) + (long_u)STRLEN(p_srr) + 2; // " "
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_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)
- {
- 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 (itmp != NULL || otmp != NULL)
! vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
else
STRCPY(buf, cmd);
if (itmp != NULL)
--- 1531,1598 ----
{
char_u *buf;
long_u len;
! int is_powershell = FALSE;
! #ifdef UNIX
int is_fish_shell;
! #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;
if (is_fish_shell)
len = (long_u)STRLEN(cmd) + 13; // "begin; " + "; end" + NUL
else
#endif
! {
! 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)
! {
! 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 (is_powershell)
{
! if (itmp != NULL)
! vim_snprintf((char *)buf, len, "& { Get-Content %s | & %s }",
! itmp, cmd);
else
! vim_snprintf((char *)buf, len, "(%s)", cmd);
}
else
{
+ #if defined(UNIX)
+ // Put braces around the command (for concatenated commands) when
+ // redirecting input and/or output.
if (itmp != NULL || otmp != NULL)
! {
! 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,1624 ****
STRCAT(buf, " < ");
STRCAT(buf, itmp);
}
! }
! else
! {
! STRCPY(buf, cmd);
! if (itmp != 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)
{
! 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)
{
! STRCAT(buf, " "); // insert a space before the '|' for DOS
! STRCAT(buf, p);
}
}
}
- }
#endif
if (otmp != NULL)
append_redir(buf, (int)len, p_srr, otmp);
--- 1600,1652 ----
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 (itmp != NULL || otmp != NULL)
! vim_snprintf((char *)buf, len, "(%s)", (char *)cmd);
! else
! STRCPY(buf, cmd);
! if (itmp != NULL)
{
! STRCAT(buf, " < ");
! STRCAT(buf, itmp);
}
! }
! else
! {
! STRCPY(buf, cmd);
! if (itmp != 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)
{
! 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);
*** ../vim-9.0.0647/src/testdir/test_shell.vim 2022-09-08 12:27:58.285556514
+0100
--- src/testdir/test_shell.vim 2022-10-03 15:55:06.884066490 +0100
***************
*** 97,102 ****
--- 97,114 ----
finally
bwipe!
endtry
+
+ " filter buffer contents through an external command
+ new
+ call setline(1, ['tom', 'sam', 'andy'])
+ try
+ %!sort
+ call assert_equal(['andy', 'sam', 'tom'], getline(1, '$'), e[0])
+ catch
+ call assert_report($'Failed to filter buffer contents, shell: {e[0]},
caught {v:exception}')
+ finally
+ bwipe!
+ endtry
endif
endfor
set shell& shellcmdflag& shellpipe& shellquote&
*** ../vim-9.0.0647/src/version.c 2022-10-03 15:27:30.070072144 +0100
--- src/version.c 2022-10-03 15:57:22.823807311 +0100
***************
*** 701,702 ****
--- 701,704 ----
{ /* Add new patch number below this line */
+ /**/
+ 648,
/**/
--
hundred-and-one symptoms of being an internet addict:
259. When you enter your name in the AltaVista search engine, the top ten
matches do indeed refer to you.
/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net \\\
/// \\\
\\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
--
--
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php
---
You received this message because you are subscribed to the Google Groups
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/vim_dev/20221003150559.4AAFE1C09A3%40moolenaar.net.