Mercurial > vim
changeset 30898:2ee5b79038f0 v9.0.0783
patch 9.0.0783: ":!" doesn't do anything but does update the previous command
Commit: https://github.com/vim/vim/commit/8107a2a8af80a53a61734b600539c5beb4782991
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Oct 17 18:00:23 2022 +0100
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 17 Oct 2022 19:15:04 +0200 |
parents | 0e58f1fab65c |
children | 0c2f18e44a54 |
files | .gitignore runtime/doc/various.txt src/ex_cmds.c src/testdir/test_shell.vim src/version.c |
diffstat | 5 files changed, 41 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- a/runtime/doc/various.txt +++ b/runtime/doc/various.txt @@ -249,7 +249,8 @@ 8g8 Find an illegal UTF-8 byte sequenc *:!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
--- 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;
--- 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