--- Problem: filtered bang commands with powershell as `:set shell` doesn't work. The command structure followed in `make_filter_cmd` is wrong. Try `:%!sort` on any file to reproduce the bug.
Solution: Fix the command for the powershell in `make_filter_cmd`. This is not a proper patch. It comes originally from my neovim PR. I just wanted to see if it would work in vim. It does. I'm not sending it to [email protected] because it's not a proper patch: I haven't added any tests; haven't changed the docs or the default config sources. I'm hoping someone in the dev team, who at least sometimes works with a Windows machine, will take it up and police it. Here are the configurations for `:set shell=pwsh` this patch worked on: let &shellcmdflag = "-Command" let &shellredir = "2>&1 | Out-File -Encoding default %s; exit $LastExitCode" let &shellpipe = "2>&1 | Out-File -Encoding default %s; exit $LastExitCode" let &shellquote = "" let &shellxquote = "\"" src/ex_cmds.c | 31 +++++++++++++++++++++++++++---- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 265927c4cde7..7d2efb61c3e4 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -1532,9 +1532,12 @@ make_filter_cmd( char_u *buf; long_u len; + char_u *shell_name = get_isolated_shell_name(); + int is_pwsh = (fnamecmp(shell_name, "powershell") == 0 + || fnamecmp(shell_name, "pwsh") == 0); + #if defined(UNIX) int is_fish_shell; - char_u *shell_name = get_isolated_shell_name(); if (shell_name == NULL) return NULL; @@ -1544,17 +1547,36 @@ make_filter_cmd( vim_free(shell_name); if (is_fish_shell) len = (long_u)STRLEN(cmd) + 13; // "begin; " + "; end" + NUL - else + else { #endif + if (is_pwsh) + len = 0; + else len = (long_u)STRLEN(cmd) + 3; // "()" + NUL - if (itmp != NULL) - len += (long_u)STRLEN(itmp) + 9; // " { < " + " } " + if (itmp != NULL) { + if (is_pwsh) + len += (long_u)STRLEN(itmp) + 23; // "& { Get-Content " + " | & " + " }" + else + 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 (is_pwsh) { + if (itmp != NULL) { + vim_snprintf((char *)buf, len, "& { Get-Content "); + STRCAT(buf, (const char *)itmp); + STRCAT(buf, " | & "); + STRCAT(buf, cmd); + STRCAT(buf, " }"); + } else { + STRCPY(buf, cmd); + } + } else { + #if defined(UNIX) /* * Put braces around the command (for concatenated commands) when @@ -1619,6 +1641,7 @@ make_filter_cmd( } } #endif + } if (otmp != NULL) append_redir(buf, (int)len, p_srr, otmp); -- 2.37.2.windows.2 -- -- You received this message from the "vim_use" 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_use" 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_use/20221001120836.91-1-3nan.ajmain%40gmail.com.
