summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2022-10-17 18:00:23 +0100
committerBram Moolenaar <Bram@vim.org>2022-10-17 18:00:23 +0100
commit8107a2a8af80a53a61734b600539c5beb4782991 (patch)
tree90fd78458a77d1c04ec964419dae7b5889d2f8d0
parent4bf67ec52e938a3edaa4f452adab42a57505f940 (diff)
patch 9.0.0783: ":!" doesn't do anything but does update the previous commandv9.0.0783
Problem: ":!" doesn't do anything but does update the previous command. Solution: Do not have ":!" change the previous command. (Martin Tournoij, closes #11372)
-rw-r--r--.gitignore1
-rw-r--r--runtime/doc/various.txt3
-rw-r--r--src/ex_cmds.c5
-rw-r--r--src/testdir/test_shell.vim31
-rw-r--r--src/version.c2
5 files changed, 41 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
index 72486f0ff2..4a2874928b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt
index 6f24515d7d..1d21e1a9ed 100644
--- a/runtime/doc/various.txt
+++ b/runtime/doc/various.txt
@@ -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
diff --git a/src/ex_cmds.c b/src/ex_cmds.c
index 7f41c7915a..f5271ea426 100644
--- a/src/ex_cmds.c
+++ b/src/ex_cmds.c
@@ -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;
diff --git a/src/testdir/test_shell.vim b/src/testdir/test_shell.vim
index cacb02b1b8..1b4b1f9809 100644
--- a/src/testdir/test_shell.vim
+++ b/src/testdir/test_shell.vim
@@ -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
diff --git a/src/version.c b/src/version.c
index 433152ecf6..0f6b59aa86 100644
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 783,
+/**/
782,
/**/
781,