---
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.

Reply via email to