vim-patch:9.0.0845: shell command with just space gives strange error (#21029)

Problem:    Shell command with just space gives strange error.
Solution:   Skip white space at start of the argument. (Christian Brabandt,
            Shane-XB-Qian, closes vim/vim#11515, closes vim/vim#11495)

4e7590ec00

Co-authored-by: shane.xb.qian <shane.qian@foxmail.com>
This commit is contained in:
zeertzjq 2022-11-12 12:29:16 +08:00 committed by GitHub
parent 4d2373f5f6
commit 7335a67b57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 52 additions and 3 deletions

View File

@ -1135,10 +1135,12 @@ void do_bang(int addr_count, exarg_T *eap, bool forceit, bool do_in, bool do_out
msg_scroll = scroll_save;
}
// Try to find an embedded bang, like in :!<cmd> ! [args]
// (:!! is indicated by the 'forceit' variable)
// Try to find an embedded bang, like in ":!<cmd> ! [args]"
// ":!!" is indicated by the 'forceit' variable.
bool ins_prevcmd = forceit;
trailarg = arg;
// Skip leading white space to avoid a strange error with some shells.
trailarg = skipwhite(arg);
do {
len = strlen(trailarg) + 1;
if (newcmd != NULL) {

View File

@ -1628,6 +1628,53 @@ func Test_cmd_bang_E135()
%bwipe!
endfunc
func Test_cmd_bang_args()
new
:.!
call assert_equal(0, v:shell_error)
" Note that below there is one space char after the '!'. This caused a
" shell error in the past, see https://github.com/vim/vim/issues/11495.
:.!
call assert_equal(0, v:shell_error)
bwipe!
CheckUnix
:.!pwd
call assert_equal(0, v:shell_error)
:.! pwd
call assert_equal(0, v:shell_error)
" Note there is one space after 'pwd'.
:.! pwd
call assert_equal(0, v:shell_error)
" Note there are two spaces after 'pwd'.
:.! pwd
call assert_equal(0, v:shell_error)
:.!ls ~
call assert_equal(0, v:shell_error)
" Note there is one space char after '~'.
:.!ls ~
call assert_equal(0, v:shell_error)
" Note there are two spaces after '~'.
:.!ls ~
call assert_equal(0, v:shell_error)
:.!echo "foo"
call assert_equal(getline('.'), "foo")
:.!echo "foo "
call assert_equal(getline('.'), "foo ")
:.!echo " foo "
call assert_equal(getline('.'), " foo ")
:.!echo " foo "
call assert_equal(getline('.'), " foo ")
%bwipe!
endfunc
" Test for using ~ for home directory in cmdline completion matches
func Test_cmdline_expand_home()
call mkdir('Xdir')