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 #11372)
This commit is contained in:
Bram Moolenaar 2022-10-17 18:00:23 +01:00
parent 4bf67ec52e
commit 8107a2a8af
5 changed files with 41 additions and 1 deletions

1
.gitignore vendored
View File

@ -85,6 +85,7 @@ src/testdir/messages
src/testdir/viminfo
src/testdir/opt_test.vim
src/testdir/failed
src/testdir/starttime
runtime/indent/testdir/*.out
runtime/indent/testdir/*.fail
src/memfile_test

View File

@ -249,7 +249,8 @@ g8 Print the hex values of the bytes used in the
*:!cmd* *:!*
:!{cmd} Execute {cmd} with the shell. See also the 'shell'
and 'shelltype' option.
and 'shelltype' option. `:!` without a {cmd} is a no-op,
it does nothing.
*E34*
Any '!' in {cmd} is replaced with the previous
external command (see also 'cpoptions'). But not when

View File

@ -957,6 +957,11 @@ do_bang(
}
} 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;
vim_free(prevcmd);
prevcmd = newcmd;

View File

@ -251,4 +251,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

View File

@ -695,6 +695,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
783,
/**/
782,
/**/