Merge pull request #26313 from zeertzjq/backport

Backport to release-0.9
This commit is contained in:
zeertzjq
2023-11-30 08:20:37 +08:00
committed by GitHub
2 changed files with 22 additions and 5 deletions

View File

@@ -7296,7 +7296,9 @@ static void ex_terminal(exarg_T *eap)
char shell_argv[512] = { 0 }; char shell_argv[512] = { 0 };
while (*p != NULL) { while (*p != NULL) {
snprintf(tempstring, sizeof(tempstring), ",\"%s\"", *p); char *escaped = vim_strsave_escaped(*p, "\"\\");
snprintf(tempstring, sizeof(tempstring), ",\"%s\"", escaped);
xfree(escaped);
xstrlcat(shell_argv, tempstring, sizeof(shell_argv)); xstrlcat(shell_argv, tempstring, sizeof(shell_argv));
p++; p++;
} }

View File

@@ -141,7 +141,13 @@ describe(':terminal', function()
end) end)
end) end)
describe(':terminal (with fake shell)', function() local function test_terminal_with_fake_shell(backslash)
-- shell-test.c is a fake shell that prints its arguments and exits.
local shell_path = testprg('shell-test')
if backslash then
shell_path = shell_path:gsub('/', [[\]])
end
local screen local screen
before_each(function() before_each(function()
@@ -149,7 +155,7 @@ describe(':terminal (with fake shell)', function()
screen = Screen.new(50, 4) screen = Screen.new(50, 4)
screen:attach({rgb=false}) screen:attach({rgb=false})
-- shell-test.c is a fake shell that prints its arguments and exits. -- shell-test.c is a fake shell that prints its arguments and exits.
nvim('set_option', 'shell', testprg('shell-test')) nvim('set_option', 'shell', shell_path)
nvim('set_option', 'shellcmdflag', 'EXE') nvim('set_option', 'shellcmdflag', 'EXE')
end) end)
@@ -183,7 +189,7 @@ describe(':terminal (with fake shell)', function()
end) end)
it("with no argument, but 'shell' has arguments, acts like termopen()", function() it("with no argument, but 'shell' has arguments, acts like termopen()", function()
nvim('set_option', 'shell', testprg('shell-test')..' -t jeff') nvim('set_option', 'shell', shell_path ..' -t jeff')
terminal_with_fake_shell() terminal_with_fake_shell()
screen:expect([[ screen:expect([[
^jeff $ | ^jeff $ |
@@ -205,7 +211,7 @@ describe(':terminal (with fake shell)', function()
end) end)
it("executes a given command through the shell, when 'shell' has arguments", function() it("executes a given command through the shell, when 'shell' has arguments", function()
nvim('set_option', 'shell', testprg('shell-test')..' -t jeff') nvim('set_option', 'shell', shell_path ..' -t jeff')
command('set shellxquote=') -- win: avoid extra quotes command('set shellxquote=') -- win: avoid extra quotes
terminal_with_fake_shell('echo hi') terminal_with_fake_shell('echo hi')
screen:expect([[ screen:expect([[
@@ -297,4 +303,13 @@ describe(':terminal (with fake shell)', function()
terminal]]) terminal]])
end end
end) end)
end
describe(':terminal (with fake shell)', function()
test_terminal_with_fake_shell(false)
if is_os('win') then
describe("when 'shell' uses backslashes", function()
test_terminal_with_fake_shell(true)
end)
end
end) end)