From ce422ba763e26313165408ec2aef6bc2be837be1 Mon Sep 17 00:00:00 2001 From: Enan Ajmain <3nan.ajmain@gmail.com> Date: Wed, 20 Jul 2022 20:55:28 +0600 Subject: [PATCH] fix: :! pwsh redirection for `command not found` Problem: If the shell command passed to the filtered bang command isn't found, the error isn't redirected to the temp.out file when shell is set to powershell. Solution: Use anonymous function with Invoke-Command operator (&). (cherry picked from commit f2482b3b533c8ed131a33aaead332c226a9e6aca) --- src/nvim/ex_cmds.c | 5 +++-- test/functional/vimscript/system_spec.lua | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c index a6a4f52323..77feddbbf9 100644 --- a/src/nvim/ex_cmds.c +++ b/src/nvim/ex_cmds.c @@ -1549,7 +1549,7 @@ char *make_filter_cmd(char *cmd, char *itmp, char *otmp) : 0; if (itmp != NULL) { - len += is_pwsh ? strlen(itmp) + sizeof("Get-Content " " | & ") - 1 + len += is_pwsh ? strlen(itmp) + sizeof("& { Get-Content " " | & " " }") - 1 : strlen(itmp) + sizeof(" { " " < " " } ") - 1; } if (otmp != NULL) { @@ -1560,10 +1560,11 @@ char *make_filter_cmd(char *cmd, char *itmp, char *otmp) if (is_pwsh) { if (itmp != NULL) { - xstrlcpy(buf, "Get-Content ", len - 1); // FIXME: should we add "-Encoding utf8"? + xstrlcpy(buf, "& { Get-Content ", len - 1); // FIXME: should we add "-Encoding utf8"? xstrlcat(buf, (const char *)itmp, len - 1); xstrlcat(buf, " | & ", len - 1); // FIXME: add `&` ourself or leave to user? xstrlcat(buf, cmd, len - 1); + xstrlcat(buf, " }", len - 1); } else { xstrlcpy(buf, cmd, len - 1); } diff --git a/test/functional/vimscript/system_spec.lua b/test/functional/vimscript/system_spec.lua index d0061d051e..ed822add72 100644 --- a/test/functional/vimscript/system_spec.lua +++ b/test/functional/vimscript/system_spec.lua @@ -642,12 +642,12 @@ describe('shell :!', function() if iswin() then feed(':4verbose %!sort /R') screen:expect{ - any=[[Executing command: .?Get%-Content .* | & sort /R 2>&1 | Out%-File %-Encoding UTF8 .*; exit $LastExitCode]] + any=[[Executing command: .?& { Get%-Content .* | & sort /R } 2>&1 | Out%-File %-Encoding UTF8 .*; exit $LastExitCode"]] } else feed(':4verbose %!sort -r') screen:expect{ - any=[[Executing command: .?Get%-Content .* | & sort %-r 2>&1 | Out%-File %-Encoding UTF8 .*; exit $LastExitCode]] + any=[[Executing command: .?& { Get%-Content .* | & sort %-r } 2>&1 | Out%-File %-Encoding UTF8 .*; exit $LastExitCode"]] } end feed('')