vim-patch:9.0.0783: ":!" doesn't do anything but does update the previous command

Problem:    ":!" doesn't do anything but does update the previous command.
Solution:   Do not have ":!" change the previous command. (Martin Tournoij,
            closes vim/vim#11372)

8107a2a8af

Co-authored-by: Bram Moolenaar <Bram@vim.org>
This commit is contained in:
zeertzjq 2023-04-18 14:09:29 +08:00
parent 240c41e1af
commit c0f10d3fe0
3 changed files with 38 additions and 0 deletions

View File

@ -248,6 +248,7 @@ g8 Print the hex values of the bytes used in the
<
*:!cmd* *:!*
:!{cmd} Execute {cmd} with 'shell'. See also |:terminal|.
`:!` without a {cmd} is a no-op, it does nothing.
The command runs in a non-interactive shell connected
to a pipe (not a terminal). Use |:terminal| to run an

View File

@ -1012,6 +1012,12 @@ void do_bang(int addr_count, exarg_T *eap, bool forceit, bool do_in, bool do_out
}
} while (trailarg != NULL);
// Don't do anything if there is no command as there isn't really anything
// useful in running "sh -c ''". Avoids changing "prevcmd".
if (strlen(newcmd) == 0) {
return;
}
xfree(prevcmd);
prevcmd = newcmd;

View File

@ -206,4 +206,35 @@ func Test_set_shell()
call delete('Xtestout')
endfunc
func Test_shell_repeat()
CheckUnix
let save_shell = &shell
call writefile(['#!/bin/sh', 'echo "Cmd: [$*]" > Xlog'], 'Xtestshell', 'D')
call setfperm('Xtestshell', "r-x------")
set shell=./Xtestshell
defer delete('Xlog')
call feedkeys(":!echo coconut\<CR>", 'xt') " Run command
call assert_equal(['Cmd: [-c echo coconut]'], readfile('Xlog'))
call feedkeys(":!!\<CR>", 'xt') " Re-run previous
call assert_equal(['Cmd: [-c echo coconut]'], readfile('Xlog'))
call writefile(['empty'], 'Xlog')
call feedkeys(":!\<CR>", 'xt') " :! is a no-op
call assert_equal(['empty'], readfile('Xlog'))
call feedkeys(":!!\<CR>", 'xt') " :! doesn't clear previous command
call assert_equal(['Cmd: [-c echo coconut]'], readfile('Xlog'))
call feedkeys(":!echo banana\<CR>", 'xt') " Make sure setting previous command keeps working after a :! no-op
call assert_equal(['Cmd: [-c echo banana]'], readfile('Xlog'))
call feedkeys(":!!\<CR>", 'xt')
call assert_equal(['Cmd: [-c echo banana]'], readfile('Xlog'))
let &shell = save_shell
endfunc
" vim: shiftwidth=2 sts=2 expandtab