diff --git a/7.4.783 b/7.4.783
new file mode 100644
index 0000000..82ee889
--- /dev/null
+++ b/7.4.783
@@ -0,0 +1,365 @@
+To: vim_dev@googlegroups.com
+Subject: Patch 7.4.783
+Fcc: outbox
+From: Bram Moolenaar <Bram@moolenaar.net>
+Mime-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+------------
+
+Patch 7.4.783
+Problem:    copy_chars() and copy_spaces() are inefficient.
+Solution:   Use memset() instead. (Dominique Pelle)
+Files:      src/ex_getln.c, src/misc2.c, src/ops.c, src/proto/misc2.pro,
+            src/screen.c
+
+
+*** ../vim-7.4.782/src/ex_getln.c	2015-07-17 13:03:42.100357542 +0200
+--- src/ex_getln.c	2015-07-17 13:11:12.608078272 +0200
+***************
+*** 250,256 ****
+      /* autoindent for :insert and :append */
+      if (firstc <= 0)
+      {
+! 	copy_spaces(ccline.cmdbuff, indent);
+  	ccline.cmdbuff[indent] = NUL;
+  	ccline.cmdpos = indent;
+  	ccline.cmdspos = indent;
+--- 250,256 ----
+      /* autoindent for :insert and :append */
+      if (firstc <= 0)
+      {
+! 	vim_memset(ccline.cmdbuff, ' ', indent);
+  	ccline.cmdbuff[indent] = NUL;
+  	ccline.cmdpos = indent;
+  	ccline.cmdspos = indent;
+*** ../vim-7.4.782/src/misc2.c	2015-07-17 13:03:42.104357503 +0200
+--- src/misc2.c	2015-07-17 13:11:12.608078272 +0200
+***************
+*** 1600,1639 ****
+  #endif
+  
+  /*
+-  * copy a space a number of times
+-  */
+-     void
+- copy_spaces(ptr, count)
+-     char_u	*ptr;
+-     size_t	count;
+- {
+-     size_t	i = count;
+-     char_u	*p = ptr;
+- 
+-     while (i--)
+- 	*p++ = ' ';
+- }
+- 
+- #if defined(FEAT_VISUALEXTRA) || defined(PROTO)
+- /*
+-  * Copy a character a number of times.
+-  * Does not work for multi-byte characters!
+-  */
+-     void
+- copy_chars(ptr, count, c)
+-     char_u	*ptr;
+-     size_t	count;
+-     int		c;
+- {
+-     size_t	i = count;
+-     char_u	*p = ptr;
+- 
+-     while (i--)
+- 	*p++ = c;
+- }
+- #endif
+- 
+- /*
+   * delete spaces at the end of a string
+   */
+      void
+--- 1600,1605 ----
+*** ../vim-7.4.782/src/ops.c	2015-07-17 13:03:42.108357465 +0200
+--- src/ops.c	2015-07-17 13:11:12.612078233 +0200
+***************
+*** 442,449 ****
+  	    return;
+  	vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + len));
+  	mch_memmove(newp, oldp, (size_t)bd.textcol);
+! 	copy_chars(newp + bd.textcol, (size_t)i, TAB);
+! 	copy_spaces(newp + bd.textcol + i, (size_t)j);
+  	/* the end */
+  	mch_memmove(newp + bd.textcol + i + j, bd.textstart, (size_t)len);
+      }
+--- 442,449 ----
+  	    return;
+  	vim_memset(newp, NUL, (size_t)(bd.textcol + i + j + len));
+  	mch_memmove(newp, oldp, (size_t)bd.textcol);
+! 	vim_memset(newp + bd.textcol, TAB, (size_t)i);
+! 	vim_memset(newp + bd.textcol + i, ' ', (size_t)j);
+  	/* the end */
+  	mch_memmove(newp + bd.textcol + i + j, bd.textstart, (size_t)len);
+      }
+***************
+*** 535,541 ****
+  	if (newp == NULL)
+  	    return;
+  	mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp));
+! 	copy_spaces(newp + (verbatim_copy_end - oldp), (size_t)fill);
+  	STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white);
+      }
+      /* replace the line */
+--- 535,541 ----
+  	if (newp == NULL)
+  	    return;
+  	mch_memmove(newp, oldp, (size_t)(verbatim_copy_end - oldp));
+! 	vim_memset(newp + (verbatim_copy_end - oldp), ' ', (size_t)fill);
+  	STRMOVE(newp + (verbatim_copy_end - oldp) + fill, non_white);
+      }
+      /* replace the line */
+***************
+*** 638,644 ****
+  	oldp += offset;
+  
+  	/* insert pre-padding */
+! 	copy_spaces(newp + offset, (size_t)spaces);
+  
+  	/* copy the new text */
+  	mch_memmove(newp + offset + spaces, s, (size_t)s_len);
+--- 638,644 ----
+  	oldp += offset;
+  
+  	/* insert pre-padding */
+! 	vim_memset(newp + offset, ' ', (size_t)spaces);
+  
+  	/* copy the new text */
+  	mch_memmove(newp + offset + spaces, s, (size_t)s_len);
+***************
+*** 647,653 ****
+  	if (spaces && !bdp->is_short)
+  	{
+  	    /* insert post-padding */
+! 	    copy_spaces(newp + offset + spaces, (size_t)(p_ts - spaces));
+  	    /* We're splitting a TAB, don't copy it. */
+  	    oldp++;
+  	    /* We allowed for that TAB, remember this now */
+--- 647,653 ----
+  	if (spaces && !bdp->is_short)
+  	{
+  	    /* insert post-padding */
+! 	    vim_memset(newp + offset + spaces, ' ', (size_t)(p_ts - spaces));
+  	    /* We're splitting a TAB, don't copy it. */
+  	    oldp++;
+  	    /* We allowed for that TAB, remember this now */
+***************
+*** 1831,1837 ****
+  	    /* copy up to deleted part */
+  	    mch_memmove(newp, oldp, (size_t)bd.textcol);
+  	    /* insert spaces */
+! 	    copy_spaces(newp + bd.textcol,
+  				     (size_t)(bd.startspaces + bd.endspaces));
+  	    /* copy the part after the deleted part */
+  	    oldp += bd.textcol + bd.textlen;
+--- 1831,1837 ----
+  	    /* copy up to deleted part */
+  	    mch_memmove(newp, oldp, (size_t)bd.textcol);
+  	    /* insert spaces */
+! 	    vim_memset(newp + bd.textcol, ' ',
+  				     (size_t)(bd.startspaces + bd.endspaces));
+  	    /* copy the part after the deleted part */
+  	    oldp += bd.textcol + bd.textlen;
+***************
+*** 2132,2138 ****
+  	    mch_memmove(newp, oldp, (size_t)bd.textcol);
+  	    oldp += bd.textcol + bd.textlen;
+  	    /* insert pre-spaces */
+! 	    copy_spaces(newp + bd.textcol, (size_t)bd.startspaces);
+  	    /* insert replacement chars CHECK FOR ALLOCATED SPACE */
+  	    /* -1/-2 is used for entering CR literally. */
+  	    if (had_ctrl_v_cr || (c != '\r' && c != '\n'))
+--- 2132,2138 ----
+  	    mch_memmove(newp, oldp, (size_t)bd.textcol);
+  	    oldp += bd.textcol + bd.textlen;
+  	    /* insert pre-spaces */
+! 	    vim_memset(newp + bd.textcol, ' ', (size_t)bd.startspaces);
+  	    /* insert replacement chars CHECK FOR ALLOCATED SPACE */
+  	    /* -1/-2 is used for entering CR literally. */
+  	    if (had_ctrl_v_cr || (c != '\r' && c != '\n'))
+***************
+*** 2146,2156 ****
+  		}
+  		else
+  #endif
+! 		    copy_chars(newp + STRLEN(newp), (size_t)numc, c);
+  		if (!bd.is_short)
+  		{
+  		    /* insert post-spaces */
+! 		    copy_spaces(newp + STRLEN(newp), (size_t)bd.endspaces);
+  		    /* copy the part after the changed part */
+  		    STRMOVE(newp + STRLEN(newp), oldp);
+  		}
+--- 2146,2156 ----
+  		}
+  		else
+  #endif
+! 		    vim_memset(newp + STRLEN(newp), c, (size_t)numc);
+  		if (!bd.is_short)
+  		{
+  		    /* insert post-spaces */
+! 		    vim_memset(newp + STRLEN(newp), ' ', (size_t)bd.endspaces);
+  		    /* copy the part after the changed part */
+  		    STRMOVE(newp + STRLEN(newp), oldp);
+  		}
+***************
+*** 2831,2837 ****
+  			mch_memmove(newp, oldp, (size_t)bd.textcol);
+  			offset = bd.textcol;
+  # ifdef FEAT_VIRTUALEDIT
+! 			copy_spaces(newp + offset, (size_t)vpos.coladd);
+  			offset += vpos.coladd;
+  # endif
+  			mch_memmove(newp + offset, ins_text, (size_t)ins_len);
+--- 2831,2837 ----
+  			mch_memmove(newp, oldp, (size_t)bd.textcol);
+  			offset = bd.textcol;
+  # ifdef FEAT_VIRTUALEDIT
+! 			vim_memset(newp + offset, ' ', (size_t)vpos.coladd);
+  			offset += vpos.coladd;
+  # endif
+  			mch_memmove(newp + offset, ins_text, (size_t)ins_len);
+***************
+*** 3272,3282 ****
+  								      == NULL)
+  	return FAIL;
+      y_current->y_array[y_idx] = pnew;
+!     copy_spaces(pnew, (size_t)bd->startspaces);
+      pnew += bd->startspaces;
+      mch_memmove(pnew, bd->textstart, (size_t)bd->textlen);
+      pnew += bd->textlen;
+!     copy_spaces(pnew, (size_t)bd->endspaces);
+      pnew += bd->endspaces;
+      *pnew = NUL;
+      return OK;
+--- 3272,3282 ----
+  								      == NULL)
+  	return FAIL;
+      y_current->y_array[y_idx] = pnew;
+!     vim_memset(pnew, ' ', (size_t)bd->startspaces);
+      pnew += bd->startspaces;
+      mch_memmove(pnew, bd->textstart, (size_t)bd->textlen);
+      pnew += bd->textlen;
+!     vim_memset(pnew, ' ', (size_t)bd->endspaces);
+      pnew += bd->endspaces;
+      *pnew = NUL;
+      return OK;
+***************
+*** 3690,3696 ****
+  	    mch_memmove(ptr, oldp, (size_t)bd.textcol);
+  	    ptr += bd.textcol;
+  	    /* may insert some spaces before the new text */
+! 	    copy_spaces(ptr, (size_t)bd.startspaces);
+  	    ptr += bd.startspaces;
+  	    /* insert the new text */
+  	    for (j = 0; j < count; ++j)
+--- 3690,3696 ----
+  	    mch_memmove(ptr, oldp, (size_t)bd.textcol);
+  	    ptr += bd.textcol;
+  	    /* may insert some spaces before the new text */
+! 	    vim_memset(ptr, ' ', (size_t)bd.startspaces);
+  	    ptr += bd.startspaces;
+  	    /* insert the new text */
+  	    for (j = 0; j < count; ++j)
+***************
+*** 3701,3712 ****
+  		/* insert block's trailing spaces only if there's text behind */
+  		if ((j < count - 1 || !shortline) && spaces)
+  		{
+! 		    copy_spaces(ptr, (size_t)spaces);
+  		    ptr += spaces;
+  		}
+  	    }
+  	    /* may insert some spaces after the new text */
+! 	    copy_spaces(ptr, (size_t)bd.endspaces);
+  	    ptr += bd.endspaces;
+  	    /* move the text after the cursor to the end of the line. */
+  	    mch_memmove(ptr, oldp + bd.textcol + delcount,
+--- 3701,3712 ----
+  		/* insert block's trailing spaces only if there's text behind */
+  		if ((j < count - 1 || !shortline) && spaces)
+  		{
+! 		    vim_memset(ptr, ' ', (size_t)spaces);
+  		    ptr += spaces;
+  		}
+  	    }
+  	    /* may insert some spaces after the new text */
+! 	    vim_memset(ptr, ' ', (size_t)bd.endspaces);
+  	    ptr += bd.endspaces;
+  	    /* move the text after the cursor to the end of the line. */
+  	    mch_memmove(ptr, oldp + bd.textcol + delcount,
+***************
+*** 4522,4528 ****
+  	if (spaces[t] > 0)
+  	{
+  	    cend -= spaces[t];
+! 	    copy_spaces(cend, (size_t)(spaces[t]));
+  	}
+  	mark_col_adjust(curwin->w_cursor.lnum + t, (colnr_T)0, (linenr_T)-t,
+  			 (long)(cend - newp + spaces[t] - (curr - curr_start)));
+--- 4522,4528 ----
+  	if (spaces[t] > 0)
+  	{
+  	    cend -= spaces[t];
+! 	    vim_memset(cend, ' ', (size_t)(spaces[t]));
+  	}
+  	mark_col_adjust(curwin->w_cursor.lnum + t, (colnr_T)0, (linenr_T)-t,
+  			 (long)(cend - newp + spaces[t] - (curr - curr_start)));
+*** ../vim-7.4.782/src/proto/misc2.pro	2014-08-10 13:34:59.064785459 +0200
+--- src/proto/misc2.pro	2015-07-17 13:11:12.612078233 +0200
+***************
+*** 37,44 ****
+  char_u *vim_strnsave_up __ARGS((char_u *string, int len));
+  void vim_strup __ARGS((char_u *p));
+  char_u *strup_save __ARGS((char_u *orig));
+- void copy_spaces __ARGS((char_u *ptr, size_t count));
+- void copy_chars __ARGS((char_u *ptr, size_t count, int c));
+  void del_trailing_spaces __ARGS((char_u *ptr));
+  void vim_strncpy __ARGS((char_u *to, char_u *from, size_t len));
+  void vim_strcat __ARGS((char_u *to, char_u *from, size_t tosize));
+--- 37,42 ----
+*** ../vim-7.4.782/src/screen.c	2015-06-10 12:16:41.926648740 +0200
+--- src/screen.c	2015-07-17 13:11:12.612078233 +0200
+***************
+*** 2833,2839 ****
+      int		fdc = compute_foldcolumn(wp, 0);
+  
+      /* Init to all spaces. */
+!     copy_spaces(p, (size_t)fdc);
+  
+      level = win_foldinfo.fi_level;
+      if (level > 0)
+--- 2833,2839 ----
+      int		fdc = compute_foldcolumn(wp, 0);
+  
+      /* Init to all spaces. */
+!     vim_memset(p, ' ', (size_t)fdc);
+  
+      level = win_foldinfo.fi_level;
+      if (level > 0)
+*** ../vim-7.4.782/src/version.c	2015-07-17 13:03:42.108357465 +0200
+--- src/version.c	2015-07-17 13:06:43.742631736 +0200
+***************
+*** 743,744 ****
+--- 743,746 ----
+  {   /* Add new patch number below this line */
++ /**/
++     783,
+  /**/
+
+-- 
+hundred-and-one symptoms of being an internet addict:
+228. You spend Saturday night making the counter on your home page
+     pass that 2000 mark.
+
+ /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
+///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
+\\\  an exciting new programming language -- http://www.Zimbu.org        ///
+ \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///