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".
diff --git a/runtime/doc/eval.txt b/runtime/doc/eval.txt
index 9aa97b7..688fc38 100644
--- a/runtime/doc/eval.txt
+++ b/runtime/doc/eval.txt
@@ -6093,6 +6093,12 @@
 		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.  
diff --git a/src/eval.c b/src/eval.c
index a8e9463..7bf52c5 100644
--- a/src/eval.c
+++ b/src/eval.c
@@ -18594,6 +18594,7 @@
     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 @@
 	}
     }
 
+    /* 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 @@
 	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 @@
     }
     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)
diff --git a/src/version.c b/src/version.c
index 0d569f7..d43534a 100644
--- a/src/version.c
+++ b/src/version.c
@@ -742,6 +742,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    427,
+/**/
     426,
 /**/
     425,