mirror of
https://github.com/neovim/neovim.git
synced 2025-11-10 04:25:22 +00:00
doc(options): Fix recommended PowerShell config (#14349)
Ensure that * Shell uses UTF8 input/output mode * Stderr output is captured, in UTF8 * Program exit codes are correctly captured Update functional test harness and add tests for :make command. Closes #13713
This commit is contained in:
@@ -5238,11 +5238,12 @@ A jump table for the options with a short description can be found at |Q_op|.
|
|||||||
Note that such processing is done after |:set| did its own round of
|
Note that such processing is done after |:set| did its own round of
|
||||||
unescaping, so to keep yourself sane use |:let-&| like shown above.
|
unescaping, so to keep yourself sane use |:let-&| like shown above.
|
||||||
*shell-powershell*
|
*shell-powershell*
|
||||||
To use powershell: >
|
To use PowerShell: >
|
||||||
let &shell = has('win32') ? 'powershell' : 'pwsh'
|
let &shell = has('win32') ? 'powershell' : 'pwsh'
|
||||||
set shellquote= shellpipe=\| shellxquote=
|
let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command [Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;'
|
||||||
set shellcmdflag=-NoLogo\ -NoProfile\ -ExecutionPolicy\ RemoteSigned\ -Command
|
let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
|
||||||
set shellredir=\|\ Out-File\ -Encoding\ UTF8
|
let &shellpipe = '2>&1 | Out-File -Encoding UTF8 %s; exit $LastExitCode'
|
||||||
|
set shellquote= shellxquote=
|
||||||
|
|
||||||
< This option cannot be set from a |modeline| or in the |sandbox|, for
|
< This option cannot be set from a |modeline| or in the |sandbox|, for
|
||||||
security reasons.
|
security reasons.
|
||||||
|
|||||||
@@ -174,6 +174,21 @@ describe('system()', function()
|
|||||||
end)
|
end)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
it('works with powershell w/ UTF-8 text (#13713)', function()
|
||||||
|
if not helpers.has_powershell() then
|
||||||
|
pending("not tested; powershell was not found", function() end)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- Should work with recommended config used in helper
|
||||||
|
helpers.set_shell_powershell()
|
||||||
|
eq('ああ\n', eval([[system('Write-Output "ああ"')]]))
|
||||||
|
-- Sanity test w/ default encoding
|
||||||
|
-- * on Windows, expected to default to Western European enc
|
||||||
|
-- * on Linux, expected to default to UTF8
|
||||||
|
command([[let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command ']])
|
||||||
|
eq(iswin() and '??\n' or 'ああ\n', eval([[system('Write-Output "ああ"')]]))
|
||||||
|
end)
|
||||||
|
|
||||||
it('`echo` and waits for its return', function()
|
it('`echo` and waits for its return', function()
|
||||||
feed(':call system("echo")<cr>')
|
feed(':call system("echo")<cr>')
|
||||||
screen:expect([[
|
screen:expect([[
|
||||||
@@ -554,4 +569,20 @@ describe('systemlist()', function()
|
|||||||
assert(out[1]:sub(0, 5) == 'pid: ', out)
|
assert(out[1]:sub(0, 5) == 'pid: ', out)
|
||||||
os_kill(out[1]:match("%d+"))
|
os_kill(out[1]:match("%d+"))
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('works with powershell w/ UTF-8 text (#13713)', function()
|
||||||
|
if not helpers.has_powershell() then
|
||||||
|
pending("not tested; powershell was not found", function() end)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
-- Should work with recommended config used in helper
|
||||||
|
helpers.set_shell_powershell()
|
||||||
|
eq({iswin() and 'あ\r' or 'あ'}, eval([[systemlist('Write-Output あ')]]))
|
||||||
|
-- Sanity test w/ default encoding
|
||||||
|
-- * on Windows, expected to default to Western European enc
|
||||||
|
-- * on Linux, expected to default to UTF8
|
||||||
|
command([[let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command ']])
|
||||||
|
eq({iswin() and '?\r' or 'あ'}, eval([[systemlist('Write-Output あ')]]))
|
||||||
|
end)
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
|||||||
44
test/functional/ex_cmds/make_spec.lua
Normal file
44
test/functional/ex_cmds/make_spec.lua
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
local helpers = require('test.functional.helpers')(after_each)
|
||||||
|
local clear = helpers.clear
|
||||||
|
local eval = helpers.eval
|
||||||
|
local has_powershell = helpers.has_powershell
|
||||||
|
local matches = helpers.matches
|
||||||
|
local nvim = helpers.nvim
|
||||||
|
local nvim_dir = helpers.nvim_dir
|
||||||
|
|
||||||
|
describe(':make', function()
|
||||||
|
clear()
|
||||||
|
before_each(function ()
|
||||||
|
clear()
|
||||||
|
end)
|
||||||
|
|
||||||
|
describe('with powershell', function()
|
||||||
|
if not has_powershell() then
|
||||||
|
pending("not tested; powershell was not found", function() end)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
before_each(function ()
|
||||||
|
helpers.set_shell_powershell()
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('captures stderr & non zero exit code #14349', function ()
|
||||||
|
nvim('set_option', 'makeprg', nvim_dir..'/shell-test foo')
|
||||||
|
local out = eval('execute("make")')
|
||||||
|
-- Make program exit code correctly captured
|
||||||
|
matches('\nshell returned 3', out)
|
||||||
|
-- Error message is captured in the file and printed in the footer
|
||||||
|
matches('\n.*%: Unknown first argument%: foo', out)
|
||||||
|
end)
|
||||||
|
|
||||||
|
it('captures stderr & zero exit code #14349', function ()
|
||||||
|
nvim('set_option', 'makeprg', nvim_dir..'/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)
|
||||||
|
matches('\n.*%: ready [$]', out)
|
||||||
|
end)
|
||||||
|
|
||||||
|
end)
|
||||||
|
|
||||||
|
end)
|
||||||
@@ -513,13 +513,15 @@ end
|
|||||||
function module.set_shell_powershell()
|
function module.set_shell_powershell()
|
||||||
local shell = iswin() and 'powershell' or 'pwsh'
|
local shell = iswin() and 'powershell' or 'pwsh'
|
||||||
assert(module.has_powershell())
|
assert(module.has_powershell())
|
||||||
local cmd = 'Remove-Item -Force '..table.concat(iswin()
|
local set_encoding = '[Console]::InputEncoding=[Console]::OutputEncoding=[System.Text.Encoding]::UTF8;'
|
||||||
|
local cmd = set_encoding..'Remove-Item -Force '..table.concat(iswin()
|
||||||
and {'alias:cat', 'alias:echo', 'alias:sleep'}
|
and {'alias:cat', 'alias:echo', 'alias:sleep'}
|
||||||
or {'alias:echo'}, ',')..';'
|
or {'alias:echo'}, ',')..';'
|
||||||
module.source([[
|
module.source([[
|
||||||
let &shell = ']]..shell..[['
|
let &shell = ']]..shell..[['
|
||||||
set shellquote= shellpipe=\| shellxquote=
|
set shellquote= shellxquote=
|
||||||
let &shellredir = '| Out-File -Encoding UTF8'
|
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 ]]..cmd..[['
|
let &shellcmdflag = '-NoLogo -NoProfile -ExecutionPolicy RemoteSigned -Command ]]..cmd..[['
|
||||||
]])
|
]])
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user