From 8107a2a8af80a53a61734b600539c5beb4782991 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 17 Oct 2022 18:00:23 +0100 Subject: [PATCH] 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) --- .gitignore | 1 + runtime/doc/various.txt | 3 ++- src/ex_cmds.c | 5 +++++ src/testdir/test_shell.vim | 31 +++++++++++++++++++++++++++++++ src/version.c | 2 ++ 5 files changed, 41 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 72486f0ff..4a2874928 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 6f24515d7..1d21e1a9e 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 7f41c7915..f5271ea42 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 cacb02b1b..1b4b1f980 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\", 'xt') " Run command + call assert_equal(['Cmd: [-c echo coconut]'], readfile('Xlog')) + + call feedkeys(":!!\", 'xt') " Re-run previous + call assert_equal(['Cmd: [-c echo coconut]'], readfile('Xlog')) + + call writefile(['empty'], 'Xlog') + call feedkeys(":!\", 'xt') " :! is a no-op + call assert_equal(['empty'], readfile('Xlog')) + + call feedkeys(":!!\", 'xt') " :! doesn't clear previous command + call assert_equal(['Cmd: [-c echo coconut]'], readfile('Xlog')) + + call feedkeys(":!echo banana\", 'xt') " Make sure setting previous command keeps working after a :! no-op + call assert_equal(['Cmd: [-c echo banana]'], readfile('Xlog')) + call feedkeys(":!!\", '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 433152ecf..0f6b59aa8 100644 --- a/src/version.c +++ b/src/version.c @@ -695,6 +695,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 783, /**/ 782, /**/ -- 2.40.0