changeset 6183:fca35aa9380a v7.4.427

updated for version 7.4.427 Problem: When an InsertCharPre autocommand executes system() typeahead may be echoed and messes up the display. (Jacob Niehus) Solution: Do not set cooked mode when invoked from ":silent".
author Bram Moolenaar <bram@vim.org>
date Fri, 29 Aug 2014 15:53:52 +0200
parents cef6c428930f
children af7e1f8a52d3
files runtime/doc/eval.txt src/eval.c src/version.c
diffstat 3 files changed, 16 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -6093,6 +6093,12 @@ system({expr} [, {input}])				*system()*
 		list items converted to NULs).  
 		Pipes are not used.
 
+		When prepended by |:silent| the shell will not be set to
+		cooked mode.  This is meant to be used for commands that do
+		not need the user to type.  It avoids stray characters showing
+		up on the screen which require |CTRL-L| to remove. >
+			:silent let f = system('ls *.vim')
+<
 		Note: Use |shellescape()| or |::S| with |expand()| or 
 		|fnamemodify()| to escape special characters in a command 
 		argument.  Newlines in {expr} may cause the command to fail.  
--- a/src/eval.c
+++ b/src/eval.c
@@ -18594,6 +18594,7 @@ get_cmd_output_as_rettv(argvars, rettv, 
     int		err = FALSE;
     FILE	*fd;
     list_T	*list = NULL;
+    int		flags = SHELL_SILENT;
 
     rettv->v_type = VAR_STRING;
     rettv->vval.v_string = NULL;
@@ -18643,6 +18644,11 @@ get_cmd_output_as_rettv(argvars, rettv, 
 	}
     }
 
+    /* Omit SHELL_COOKED when invoked with ":silent".  Avoids that the shell
+     * echoes typeahead, that messes up the display. */
+    if (!msg_silent)
+	flags += SHELL_COOKED;
+
     if (retlist)
     {
 	int		len;
@@ -18652,8 +18658,7 @@ get_cmd_output_as_rettv(argvars, rettv, 
 	char_u		*end;
 	int		i;
 
-	res = get_cmd_output(get_tv_string(&argvars[0]), infile,
-					   SHELL_SILENT | SHELL_COOKED, &len);
+	res = get_cmd_output(get_tv_string(&argvars[0]), infile, flags, &len);
 	if (res == NULL)
 	    goto errret;
 
@@ -18694,8 +18699,7 @@ get_cmd_output_as_rettv(argvars, rettv, 
     }
     else
     {
-	res = get_cmd_output(get_tv_string(&argvars[0]), infile,
-					   SHELL_SILENT | SHELL_COOKED, NULL);
+	res = get_cmd_output(get_tv_string(&argvars[0]), infile, flags, NULL);
 #ifdef USE_CR
 	/* translate <CR> into <NL> */
 	if (res != NULL)
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    427,
+/**/
     426,
 /**/
     425,