neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

commit c0f10d3fe018990b68cfa47bd84693449100f449
parent 240c41e1af556cd17329d5c46d26a3ca91be2db8
Author: zeertzjq <zeertzjq@outlook.com>
Date:   Tue, 18 Apr 2023 14:09:29 +0800

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)

https://github.com/vim/vim/commit/8107a2a8af80a53a61734b600539c5beb4782991

Co-authored-by: Bram Moolenaar <Bram@vim.org>

Diffstat:
Mruntime/doc/various.txt | 1+
Msrc/nvim/ex_cmds.c | 6++++++
Mtest/old/testdir/test_shell.vim | 31+++++++++++++++++++++++++++++++
3 files changed, 38 insertions(+), 0 deletions(-)

diff --git a/runtime/doc/various.txt b/runtime/doc/various.txt @@ -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 diff --git a/src/nvim/ex_cmds.c b/src/nvim/ex_cmds.c @@ -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; diff --git a/test/old/testdir/test_shell.vim b/test/old/testdir/test_shell.vim @@ -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