aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEnan Ajmain <3nan.ajmain@gmail.com>2023-03-20 03:25:12 +0600
committerGitHub <noreply@github.com>2023-03-19 14:25:12 -0700
commitecc4d0e435d618828b938d78fbded7fbe1314760 (patch)
tree777d1989517b013252a3c577f3e22246f1bf2746
parent5726f33e8caaa5967c4ae93972a9eaec0b9c0c82 (diff)
downloadrneovim-ecc4d0e435d618828b938d78fbded7fbe1314760.tar.gz
rneovim-ecc4d0e435d618828b938d78fbded7fbe1314760.tar.bz2
rneovim-ecc4d0e435d618828b938d78fbded7fbe1314760.zip
fix(shell): on Windows :make does not echo #22728
Problem: On Windows, :make does not display the output of the program it runs. The cause is the default 'shellpipe'. On Linux, nvim uses `tee` to redirect the output to both stdout and the error file. In Windows, for both cmd.exe and powershell, the output is only redirected to the error file. Solution: - On Windows, change the 'shellpipe' default to "2>&1| tee". - Nvim includes `tee` in its Windows package. - Document recommended defaults for powershell. Fixes #12910
-rw-r--r--runtime/doc/options.txt13
-rw-r--r--runtime/doc/quickfix.txt2
-rw-r--r--src/nvim/options.lua2
-rw-r--r--test/functional/ex_cmds/make_spec.lua4
-rw-r--r--test/functional/helpers.lua12
-rw-r--r--test/functional/vimscript/system_spec.lua4
-rw-r--r--test/old/testdir/test_shell.vim2
7 files changed, 20 insertions, 19 deletions
diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt
index 9fff5228f2..36c02fa3cb 100644
--- a/runtime/doc/options.txt
+++ b/runtime/doc/options.txt
@@ -5235,9 +5235,9 @@ A jump table for the options with a short description can be found at |Q_op|.
*shell-powershell*
To use PowerShell: >
let &shell = executable('pwsh') ? 'pwsh' : 'powershell'
- let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;'
- let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
- let &shellpipe = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
+ let &shellcmdflag = '-NoLogo -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.UTF8Encoding]::new();$PSDefaultParameterValues[''Out-File:Encoding'']=''utf8'';'
+ let &shellredir = '2>&1 | %%{ "$_" } | Out-File %s; exit $LastExitCode'
+ let &shellpipe = '2>&1 | %%{ "$_" } | Tee-Object %s; exit $LastExitCode'
set shellquote= shellxquote=
< This option cannot be set from a |modeline| or in the |sandbox|, for
@@ -5259,8 +5259,7 @@ A jump table for the options with a short description can be found at |Q_op|.
security reasons.
*'shellpipe'* *'sp'*
-'shellpipe' 'sp' string (default ">", ">%s 2>&1", "| tee", "|& tee" or
- "2>&1| tee")
+'shellpipe' 'sp' string (default ">", "| tee", "|& tee" or "2>&1| tee")
global
String to be used to put the output of the ":make" command in the
error file. See also |:make_makeprg|. See |option-backslash| about
@@ -5268,8 +5267,8 @@ A jump table for the options with a short description can be found at |Q_op|.
The name of the temporary file can be represented by "%s" if necessary
(the file name is appended automatically if no %s appears in the value
of this option).
- For MS-Windows the default is ">%s 2>&1". The output is directly
- saved in a file and not echoed to the screen.
+ For MS-Windows the default is "2>&1| tee". The stdout and stderr are
+ saved in a file and echoed to the screen.
For Unix the default is "| tee". The stdout of the compiler is saved
in a file and echoed to the screen. If the 'shell' option is "csh" or
"tcsh" after initializations, the default becomes "|& tee". If the
diff --git a/runtime/doc/quickfix.txt b/runtime/doc/quickfix.txt
index f70dbd0913..0b5757d720 100644
--- a/runtime/doc/quickfix.txt
+++ b/runtime/doc/quickfix.txt
@@ -956,7 +956,7 @@ or simpler >
"$*" can be given multiple times, for example: >
:set makeprg=gcc\ -o\ $*\ $*
-The 'shellpipe' option defaults to ">%s 2>&1" for Win32.
+The 'shellpipe' option defaults to "2>&1| tee" for Win32.
This means that the output of the compiler is saved in a file and not shown on
the screen directly. For Unix "| tee" is used. The compiler output is shown
on the screen and saved in a file the same time. Depending on the shell used
diff --git a/src/nvim/options.lua b/src/nvim/options.lua
index bb673a2c58..7be8f568b5 100644
--- a/src/nvim/options.lua
+++ b/src/nvim/options.lua
@@ -2026,7 +2026,7 @@ return {
varname='p_sp',
defaults={
condition='MSWIN',
- if_true=">%s 2>&1",
+ if_true="2>&1| tee",
if_false="| tee",
}
},
diff --git a/test/functional/ex_cmds/make_spec.lua b/test/functional/ex_cmds/make_spec.lua
index bf585ee44c..f42e21e4cb 100644
--- a/test/functional/ex_cmds/make_spec.lua
+++ b/test/functional/ex_cmds/make_spec.lua
@@ -34,8 +34,8 @@ describe(':make', function()
nvim('set_option', 'makeprg', testprg('shell-test'))
local out = eval('execute("make")')
-- Ensure there are no "shell returned X" messages between
- -- command and last line (indicating zero exit)
- matches('LastExitCode%s+[(]', out)
+ -- command and last line (indicating zero exit)
+ matches('LastExitCode%s+ready [$]%s+[(]', out)
matches('\n.*%: ready [$]', out)
end)
diff --git a/test/functional/helpers.lua b/test/functional/helpers.lua
index 43e5b73608..b485352c94 100644
--- a/test/functional/helpers.lua
+++ b/test/functional/helpers.lua
@@ -553,16 +553,18 @@ function module.set_shell_powershell(fake)
assert(found)
end
local shell = found and (is_os('win') and 'powershell' or 'pwsh') or module.testprg('pwsh-test')
- local set_encoding = '[Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.UTF8Encoding]::new();'
- local cmd = set_encoding..'Remove-Item -Force '..table.concat(is_os('win')
+ local cmd = 'Remove-Item -Force '..table.concat(is_os('win')
and {'alias:cat', 'alias:echo', 'alias:sleep', 'alias:sort'}
or {'alias:echo'}, ',')..';'
module.exec([[
let &shell = ']]..shell..[['
set shellquote= shellxquote=
- let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command ]]..cmd..[['
- let &shellpipe = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
- let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
+ let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command '
+ let &shellcmdflag .= '[Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.UTF8Encoding]::new();'
+ let &shellcmdflag .= '$PSDefaultParameterValues[''Out-File:Encoding'']=''utf8'';'
+ let &shellcmdflag .= ']]..cmd..[['
+ let &shellredir = '2>&1 | %%{ "$_" } | Out-File %s; exit $LastExitCode'
+ let &shellpipe = '2>&1 | %%{ "$_" } | Tee-Object %s; exit $LastExitCode'
]])
return found
end
diff --git a/test/functional/vimscript/system_spec.lua b/test/functional/vimscript/system_spec.lua
index 7ada1c4bea..158dfe86d7 100644
--- a/test/functional/vimscript/system_spec.lua
+++ b/test/functional/vimscript/system_spec.lua
@@ -644,12 +644,12 @@ describe('shell :!', function()
if is_os('win') then
feed(':4verbose %!sort /R<cr>')
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 .*; exit $LastExitCode"]]
}
else
feed(':4verbose %!sort -r<cr>')
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 .*; exit $LastExitCode"]]
}
end
feed('<CR>')
diff --git a/test/old/testdir/test_shell.vim b/test/old/testdir/test_shell.vim
index 8b9c7a5b12..3d0056bfc1 100644
--- a/test/old/testdir/test_shell.vim
+++ b/test/old/testdir/test_shell.vim
@@ -22,7 +22,7 @@ func Test_shell_options()
\ ['tcsh', '-c', '|& tee', '', '>&', '', '']]
endif
if has('win32')
- let shells += [['cmd', '/s /c', '>%s 2>&1', '', '>%s 2>&1', '', '"']]
+ let shells += [['cmd', '/s /c', '2>&1| tee', '', '>%s 2>&1', '', '"']]
endif
" start a new Vim instance with 'shell' set to each of the supported shells