]> granicus.if.org Git - vim/commitdiff
patch 9.0.0845: shell command with just space gives strange error v9.0.0845
authorshane.xb.qian <shane.qian@foxmail.com>
Tue, 8 Nov 2022 21:40:04 +0000 (21:40 +0000)
committerBram Moolenaar <Bram@vim.org>
Tue, 8 Nov 2022 21:40:04 +0000 (21:40 +0000)
Problem:    Shell command with just space gives strange error.
Solution:   Skip white space at start of the argument. (Christian Brabandt,
            Shane-XB-Qian, closes #11515, closes #11495)

src/ex_cmds.c
src/testdir/test_cmdline.vim
src/version.c

index 7bb7aa0380208fe163f4433b8d3668c7e7c30c44..3cf07e48259deaf9b09f7436dafc47186b98bdd5 100644 (file)
@@ -899,11 +899,13 @@ do_bang(
     }
 
     /*
-     * 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.
      */
     ins_prevcmd = forceit;
-    trailarg = arg;
+
+    // Skip leading white space to avoid a strange error with some shells.
+    trailarg = skipwhite(arg);
     do
     {
        len = (int)STRLEN(trailarg) + 1;
index f27b0918cc805996b4e8410b3fe996d370ad6229..ddc235d1e71128f5550dcf32ffe8ba35c9980fe1 100644 (file)
@@ -1653,6 +1653,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('Xexpdir', 'R')
index 5d4511dcdd321fecfcf288bffd05c7149d3896b0..097fcf6abf74e83eb5b6ec1ecd30102d7ebcf4e6 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    845,
 /**/
     844,
 /**/