diff --git a/src/Make_cyg_ming.mak b/src/Make_cyg_ming.mak
index bc60eb9..3bc57aa 100644
--- a/src/Make_cyg_ming.mak
+++ b/src/Make_cyg_ming.mak
@@ -769,6 +769,7 @@
 	$(OUTDIR)/profiler.o \
 	$(OUTDIR)/quickfix.o \
 	$(OUTDIR)/regexp.o \
+	$(OUTDIR)/register.o \
 	$(OUTDIR)/scriptfile.o \
 	$(OUTDIR)/screen.o \
 	$(OUTDIR)/search.o \
@@ -1186,6 +1187,9 @@
 $(OUTDIR)/regexp.o:	regexp.c regexp_bt.c regexp_nfa.c $(INCL)
 	$(CC) -c $(CFLAGS) regexp.c -o $@
 
+$(OUTDIR)/register.o:	register.c $(INCL)
+	$(CC) -c $(CFLAGS) register.c -o $@
+
 $(OUTDIR)/terminal.o:	terminal.c $(INCL) $(TERM_DEPS)
 	$(CC) -c $(CFLAGS) terminal.c -o $@
 
diff --git a/src/Make_morph.mak b/src/Make_morph.mak
index 6b549df..0f3cd4e 100644
--- a/src/Make_morph.mak
+++ b/src/Make_morph.mak
@@ -85,6 +85,7 @@
 	profiler.c						\
 	quickfix.c						\
 	regexp.c						\
+	register.c						\
 	scriptfile.c						\
 	screen.c						\
 	search.c						\
diff --git a/src/Make_mvc.mak b/src/Make_mvc.mak
index 10c827a..3ad3547 100644
--- a/src/Make_mvc.mak
+++ b/src/Make_mvc.mak
@@ -776,6 +776,7 @@
 	$(OUTDIR)\profiler.obj \
 	$(OUTDIR)\quickfix.obj \
 	$(OUTDIR)\regexp.obj \
+	$(OUTDIR)\register.obj \
 	$(OUTDIR)\scriptfile.obj \
 	$(OUTDIR)\screen.obj \
 	$(OUTDIR)\search.obj \
@@ -1651,6 +1652,8 @@
 
 $(OUTDIR)/regexp.obj:	$(OUTDIR) regexp.c regexp_bt.c regexp_nfa.c  $(INCL)
 
+$(OUTDIR)/register.obj:	$(OUTDIR) register.c $(INCL)
+
 $(OUTDIR)/scriptfile.obj:	$(OUTDIR) scriptfile.c  $(INCL)
 
 $(OUTDIR)/screen.obj:	$(OUTDIR) screen.c  $(INCL)
@@ -1840,6 +1843,7 @@
 	proto/profiler.pro \
 	proto/quickfix.pro \
 	proto/regexp.pro \
+	proto/register.pro \
 	proto/scriptfile.pro \
 	proto/screen.pro \
 	proto/search.pro \
diff --git a/src/Make_vms.mms b/src/Make_vms.mms
index 6c791f1..b8e5085 100644
--- a/src/Make_vms.mms
+++ b/src/Make_vms.mms
@@ -319,7 +319,7 @@
 	memfile.c memline.c message.c misc1.c misc2.c mouse.c move.c normal.c \
 	ops.c \
 	option.c optionstr.c popupmnu.c popupwin.c profiler.c quickfix.c \
-	regexp.c scriptfile.c \
+	regexp.c register.c scriptfile.c \
 	search.c session.c sha256.c sign.c spell.c spellfile.c syntax.c tag.c \
 	term.c termlib.c testing.c textprop.c ui.c undo.c usercmd.c \
 	userfunc.c version.c viminfo.c screen.c window.c os_unix.c os_vms.c \
@@ -340,7 +340,7 @@
 	misc1.obj misc2.obj mouse.obj move.obj mbyte.obj normal.obj ops.obj \
 	option.obj \
 	optionstr.obj popupmnu.obj popupwin.obj profiler.obj quickfix.obj \
-	regexp.obj scriptfile.obj \
+	regexp.obj register.obj scriptfile.obj \
 	search.obj session.obj sha256.obj sign.obj spell.obj spellfile.obj \
 	syntax.obj tag.obj term.obj termlib.obj testing.obj textprop.obj \
 	ui.obj undo.obj usercmd.obj userfunc.obj screen.obj version.obj \
@@ -755,6 +755,10 @@
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
  globals.h
+register.obj : register.c vim.h [.auto]config.h feature.h os_unix.h \
+ ascii.h keymap.h term.h macros.h structs.h regexp.h \
+ gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
+ globals.h
 scriptfile.obj : scriptfile.c vim.h [.auto]config.h feature.h os_unix.h \
  ascii.h keymap.h term.h macros.h structs.h regexp.h \
  gui.h beval.h [.proto]gui_beval.pro option.h ex_cmds.h proto.h \
diff --git a/src/Makefile b/src/Makefile
index eebef25..9462404 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1644,6 +1644,7 @@
 	pty.c \
 	quickfix.c \
 	regexp.c \
+	register.c \
 	scriptfile.c \
 	screen.c \
 	search.c \
@@ -1778,6 +1779,7 @@
 	objects/pty.o \
 	objects/quickfix.o \
 	objects/regexp.o \
+	objects/register.o \
 	objects/scriptfile.o \
 	objects/screen.o \
 	objects/search.o \
@@ -1937,6 +1939,7 @@
 	pty.pro \
 	quickfix.pro \
 	regexp.pro \
+	register.pro \
 	scriptfile.pro \
 	screen.pro \
 	search.pro \
@@ -3353,6 +3356,9 @@
 objects/regexp.o: regexp.c regexp_bt.c regexp_nfa.c
 	$(CCC) -o $@ regexp.c
 
+objects/register.o: register.c
+	$(CCC) -o $@ register.c
+
 objects/scriptfile.o: scriptfile.c
 	$(CCC) -o $@ scriptfile.c
 
@@ -3835,6 +3841,10 @@
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
  proto.h globals.h regexp_bt.c regexp_nfa.c
+objects/register.o: register.c vim.h protodef.h auto/config.h feature.h os_unix.h \
+ auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
+ proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
+ proto.h globals.h
 objects/scriptfile.o: scriptfile.c vim.h protodef.h auto/config.h feature.h os_unix.h \
  auto/osdef.h ascii.h keymap.h term.h macros.h option.h beval.h \
  proto/gui_beval.pro structs.h regexp.h gui.h alloc.h ex_cmds.h spell.h \
diff --git a/src/README.md b/src/README.md
index dcbf408..b5ee8b5 100644
--- a/src/README.md
+++ b/src/README.md
@@ -63,6 +63,7 @@
 profiler.c	| vim script profiler
 quickfix.c	| quickfix commands (":make", ":cn")
 regexp.c	| pattern matching
+register.c	| handling registers
 scriptfile.c	| runtime directory handling and sourcing scripts
 screen.c	| lower level screen functions
 search.c	| pattern searching
diff --git a/src/ops.c b/src/ops.c
index 89a25b1..85a3758 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -14,66 +14,9 @@
 
 #include "vim.h"
 
-/*
- * Number of registers.
- *	0 = unnamed register, for normal yanks and puts
- *   1..9 = registers '1' to '9', for deletes
- * 10..35 = registers 'a' to 'z'
- *     36 = delete register '-'
- *     37 = Selection register '*'. Only if FEAT_CLIPBOARD defined
- *     38 = Clipboard register '+'. Only if FEAT_CLIPBOARD and FEAT_X11 defined
- */
-
-static yankreg_T	y_regs[NUM_REGISTERS];
-
-static yankreg_T	*y_current;	    /* ptr to current yankreg */
-static int		y_append;	    /* TRUE when appending */
-static yankreg_T	*y_previous = NULL; /* ptr to last written yankreg */
-
-/*
- * structure used by block_prep, op_delete and op_yank for blockwise operators
- * also op_change, op_shift, op_insert, op_replace - AKelly
- */
-struct block_def
-{
-    int		startspaces;	/* 'extra' cols before first char */
-    int		endspaces;	/* 'extra' cols after last char */
-    int		textlen;	/* chars in block */
-    char_u	*textstart;	/* pointer to 1st char (partially) in block */
-    colnr_T	textcol;	/* index of chars (partially) in block */
-    colnr_T	start_vcol;	/* start col of 1st char wholly inside block */
-    colnr_T	end_vcol;	/* start col of 1st char wholly after block */
-    int		is_short;	/* TRUE if line is too short to fit in block */
-    int		is_MAX;		/* TRUE if curswant==MAXCOL when starting */
-    int		is_oneChar;	/* TRUE if block within one character */
-    int		pre_whitesp;	/* screen cols of ws before block */
-    int		pre_whitesp_c;	/* chars of ws before block */
-    colnr_T	end_char_vcols;	/* number of vcols of post-block char */
-    colnr_T	start_char_vcols; /* number of vcols of pre-block char */
-};
-
 static void shift_block(oparg_T *oap, int amount);
-static int	stuff_yank(int, char_u *);
-static void	put_reedit_in_typebuf(int silent);
-static int	put_in_typebuf(char_u *s, int esc, int colon,
-								 int silent);
-static void	stuffescaped(char_u *arg, int literally);
 static void	mb_adjust_opend(oparg_T *oap);
-static void	free_yank_all(void);
-static int	yank_copy_line(struct block_def *bd, long y_idx);
-#ifdef FEAT_CLIPBOARD
-static void	copy_yank_reg(yankreg_T *reg);
-static void	may_set_selection(void);
-#endif
-#if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
-static int	preprocs_left(void);
-#endif
-static void	dis_msg(char_u *p, int skip_esc);
-static void	block_prep(oparg_T *oap, struct block_def *, linenr_T, int);
 static int	do_addsub(int op_type, pos_T *pos, int length, linenr_T Prenum1);
-#if defined(FEAT_CLIPBOARD) || defined(FEAT_EVAL)
-static void	str_to_reg(yankreg_T *y_ptr, int yank_type, char_u *str, long len, long blocklen, int str_list);
-#endif
 static int	ends_in_white(linenr_T lnum);
 #ifdef FEAT_COMMENTS
 static int	fmt_check_par(linenr_T, int *, char_u **, int do_comments);
@@ -124,31 +67,6 @@
     {Ctrl_X, NUL, OPF_CHANGE},		// OP_NR_SUB
 };
 
-    yankreg_T *
-get_y_regs(void)
-{
-    return y_regs;
-}
-
-    yankreg_T *
-get_y_current(void)
-{
-    return y_current;
-}
-
-    yankreg_T *
-get_y_previous(void)
-{
-    return y_previous;
-}
-
-    void
-set_y_previous(yankreg_T *yreg)
-{
-    y_previous = yreg;
-}
-
-
 /*
  * Translate a command name into an operator type.
  * Must only be called with a valid operator name!
@@ -760,708 +678,11 @@
 }
 #endif /* defined(FEAT_LISP) || defined(FEAT_CINDENT) */
 
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * Keep the last expression line here, for repeating.
- */
-static char_u	*expr_line = NULL;
-
-/*
- * Get an expression for the "\"=expr1" or "CTRL-R =expr1"
- * Returns '=' when OK, NUL otherwise.
- */
-    int
-get_expr_register(void)
-{
-    char_u	*new_line;
-
-    new_line = getcmdline('=', 0L, 0, TRUE);
-    if (new_line == NULL)
-	return NUL;
-    if (*new_line == NUL)	/* use previous line */
-	vim_free(new_line);
-    else
-	set_expr_line(new_line);
-    return '=';
-}
-
-/*
- * Set the expression for the '=' register.
- * Argument must be an allocated string.
- */
-    void
-set_expr_line(char_u *new_line)
-{
-    vim_free(expr_line);
-    expr_line = new_line;
-}
-
-/*
- * Get the result of the '=' register expression.
- * Returns a pointer to allocated memory, or NULL for failure.
- */
-    char_u *
-get_expr_line(void)
-{
-    char_u	*expr_copy;
-    char_u	*rv;
-    static int	nested = 0;
-
-    if (expr_line == NULL)
-	return NULL;
-
-    /* Make a copy of the expression, because evaluating it may cause it to be
-     * changed. */
-    expr_copy = vim_strsave(expr_line);
-    if (expr_copy == NULL)
-	return NULL;
-
-    /* When we are invoked recursively limit the evaluation to 10 levels.
-     * Then return the string as-is. */
-    if (nested >= 10)
-	return expr_copy;
-
-    ++nested;
-    rv = eval_to_string(expr_copy, NULL, TRUE);
-    --nested;
-    vim_free(expr_copy);
-    return rv;
-}
-
-/*
- * Get the '=' register expression itself, without evaluating it.
- */
-    static char_u *
-get_expr_line_src(void)
-{
-    if (expr_line == NULL)
-	return NULL;
-    return vim_strsave(expr_line);
-}
-#endif /* FEAT_EVAL */
-
-/*
- * Check if 'regname' is a valid name of a yank register.
- * Note: There is no check for 0 (default register), caller should do this
- */
-    int
-valid_yank_reg(
-    int	    regname,
-    int	    writing)	    /* if TRUE check for writable registers */
-{
-    if (       (regname > 0 && ASCII_ISALNUM(regname))
-	    || (!writing && vim_strchr((char_u *)
-#ifdef FEAT_EVAL
-				    "/.%:="
-#else
-				    "/.%:"
-#endif
-					, regname) != NULL)
-	    || regname == '#'
-	    || regname == '"'
-	    || regname == '-'
-	    || regname == '_'
-#ifdef FEAT_CLIPBOARD
-	    || regname == '*'
-	    || regname == '+'
-#endif
-#ifdef FEAT_DND
-	    || (!writing && regname == '~')
-#endif
-							)
-	return TRUE;
-    return FALSE;
-}
-
-/*
- * Set y_current and y_append, according to the value of "regname".
- * Cannot handle the '_' register.
- * Must only be called with a valid register name!
- *
- * If regname is 0 and writing, use register 0
- * If regname is 0 and reading, use previous register
- *
- * Return TRUE when the register should be inserted literally (selection or
- * clipboard).
- */
-    int
-get_yank_register(int regname, int writing)
-{
-    int	    i;
-    int	    ret = FALSE;
-
-    y_append = FALSE;
-    if ((regname == 0 || regname == '"') && !writing && y_previous != NULL)
-    {
-	y_current = y_previous;
-	return ret;
-    }
-    i = regname;
-    if (VIM_ISDIGIT(i))
-	i -= '0';
-    else if (ASCII_ISLOWER(i))
-	i = CharOrdLow(i) + 10;
-    else if (ASCII_ISUPPER(i))
-    {
-	i = CharOrdUp(i) + 10;
-	y_append = TRUE;
-    }
-    else if (regname == '-')
-	i = DELETION_REGISTER;
-#ifdef FEAT_CLIPBOARD
-    /* When selection is not available, use register 0 instead of '*' */
-    else if (clip_star.available && regname == '*')
-    {
-	i = STAR_REGISTER;
-	ret = TRUE;
-    }
-    /* When clipboard is not available, use register 0 instead of '+' */
-    else if (clip_plus.available && regname == '+')
-    {
-	i = PLUS_REGISTER;
-	ret = TRUE;
-    }
-#endif
-#ifdef FEAT_DND
-    else if (!writing && regname == '~')
-	i = TILDE_REGISTER;
-#endif
-    else		/* not 0-9, a-z, A-Z or '-': use register 0 */
-	i = 0;
-    y_current = &(y_regs[i]);
-    if (writing)	/* remember the register we write into for do_put() */
-	y_previous = y_current;
-    return ret;
-}
-
-#if defined(FEAT_CLIPBOARD) || defined(PROTO)
-/*
- * When "regname" is a clipboard register, obtain the selection.  If it's not
- * available return zero, otherwise return "regname".
- */
-    int
-may_get_selection(int regname)
-{
-    if (regname == '*')
-    {
-	if (!clip_star.available)
-	    regname = 0;
-	else
-	    clip_get_selection(&clip_star);
-    }
-    else if (regname == '+')
-    {
-	if (!clip_plus.available)
-	    regname = 0;
-	else
-	    clip_get_selection(&clip_plus);
-    }
-    return regname;
-}
-#endif
-
-/*
- * Obtain the contents of a "normal" register. The register is made empty.
- * The returned pointer has allocated memory, use put_register() later.
- */
-    void *
-get_register(
-    int		name,
-    int		copy)	/* make a copy, if FALSE make register empty. */
-{
-    yankreg_T	*reg;
-    int		i;
-
-#ifdef FEAT_CLIPBOARD
-    /* When Visual area changed, may have to update selection.  Obtain the
-     * selection too. */
-    if (name == '*' && clip_star.available)
-    {
-	if (clip_isautosel_star())
-	    clip_update_selection(&clip_star);
-	may_get_selection(name);
-    }
-    if (name == '+' && clip_plus.available)
-    {
-	if (clip_isautosel_plus())
-	    clip_update_selection(&clip_plus);
-	may_get_selection(name);
-    }
-#endif
-
-    get_yank_register(name, 0);
-    reg = ALLOC_ONE(yankreg_T);
-    if (reg != NULL)
-    {
-	*reg = *y_current;
-	if (copy)
-	{
-	    /* If we run out of memory some or all of the lines are empty. */
-	    if (reg->y_size == 0)
-		reg->y_array = NULL;
-	    else
-		reg->y_array = ALLOC_MULT(char_u *, reg->y_size);
-	    if (reg->y_array != NULL)
-	    {
-		for (i = 0; i < reg->y_size; ++i)
-		    reg->y_array[i] = vim_strsave(y_current->y_array[i]);
-	    }
-	}
-	else
-	    y_current->y_array = NULL;
-    }
-    return (void *)reg;
-}
-
-/*
- * Put "reg" into register "name".  Free any previous contents and "reg".
- */
-    void
-put_register(int name, void *reg)
-{
-    get_yank_register(name, 0);
-    free_yank_all();
-    *y_current = *(yankreg_T *)reg;
-    vim_free(reg);
-
-#ifdef FEAT_CLIPBOARD
-    /* Send text written to clipboard register to the clipboard. */
-    may_set_selection();
-#endif
-}
-
-#if (defined(FEAT_CLIPBOARD) && defined(FEAT_X11) && defined(USE_SYSTEM)) \
-	|| defined(PROTO)
-    void
-free_register(void *reg)
-{
-    yankreg_T tmp;
-
-    tmp = *y_current;
-    *y_current = *(yankreg_T *)reg;
-    free_yank_all();
-    vim_free(reg);
-    *y_current = tmp;
-}
-#endif
-
-#if defined(FEAT_MOUSE) || defined(PROTO)
-/*
- * return TRUE if the current yank register has type MLINE
- */
-    int
-yank_register_mline(int regname)
-{
-    if (regname != 0 && !valid_yank_reg(regname, FALSE))
-	return FALSE;
-    if (regname == '_')		/* black hole is always empty */
-	return FALSE;
-    get_yank_register(regname, FALSE);
-    return (y_current->y_type == MLINE);
-}
-#endif
-
-/*
- * Start or stop recording into a yank register.
- *
- * Return FAIL for failure, OK otherwise.
- */
-    int
-do_record(int c)
-{
-    char_u	    *p;
-    static int	    regname;
-    yankreg_T	    *old_y_previous, *old_y_current;
-    int		    retval;
-
-    if (reg_recording == 0)	    /* start recording */
-    {
-	/* registers 0-9, a-z and " are allowed */
-	if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
-	    retval = FAIL;
-	else
-	{
-	    reg_recording = c;
-	    showmode();
-	    regname = c;
-	    retval = OK;
-	}
-    }
-    else			    /* stop recording */
-    {
-	/*
-	 * Get the recorded key hits.  K_SPECIAL and CSI will be escaped, this
-	 * needs to be removed again to put it in a register.  exec_reg then
-	 * adds the escaping back later.
-	 */
-	reg_recording = 0;
-	msg("");
-	p = get_recorded();
-	if (p == NULL)
-	    retval = FAIL;
-	else
-	{
-	    /* Remove escaping for CSI and K_SPECIAL in multi-byte chars. */
-	    vim_unescape_csi(p);
-
-	    /*
-	     * We don't want to change the default register here, so save and
-	     * restore the current register name.
-	     */
-	    old_y_previous = y_previous;
-	    old_y_current = y_current;
-
-	    retval = stuff_yank(regname, p);
-
-	    y_previous = old_y_previous;
-	    y_current = old_y_current;
-	}
-    }
-    return retval;
-}
-
-/*
- * Stuff string "p" into yank register "regname" as a single line (append if
- * uppercase).	"p" must have been alloced.
- *
- * return FAIL for failure, OK otherwise
- */
-    static int
-stuff_yank(int regname, char_u *p)
-{
-    char_u	*lp;
-    char_u	**pp;
-
-    /* check for read-only register */
-    if (regname != 0 && !valid_yank_reg(regname, TRUE))
-    {
-	vim_free(p);
-	return FAIL;
-    }
-    if (regname == '_')		    /* black hole: don't do anything */
-    {
-	vim_free(p);
-	return OK;
-    }
-    get_yank_register(regname, TRUE);
-    if (y_append && y_current->y_array != NULL)
-    {
-	pp = &(y_current->y_array[y_current->y_size - 1]);
-	lp = alloc(STRLEN(*pp) + STRLEN(p) + 1);
-	if (lp == NULL)
-	{
-	    vim_free(p);
-	    return FAIL;
-	}
-	STRCPY(lp, *pp);
-	STRCAT(lp, p);
-	vim_free(p);
-	vim_free(*pp);
-	*pp = lp;
-    }
-    else
-    {
-	free_yank_all();
-	if ((y_current->y_array = ALLOC_ONE(char_u *)) == NULL)
-	{
-	    vim_free(p);
-	    return FAIL;
-	}
-	y_current->y_array[0] = p;
-	y_current->y_size = 1;
-	y_current->y_type = MCHAR;  /* used to be MLINE, why? */
-#ifdef FEAT_VIMINFO
-	y_current->y_time_set = vim_time();
-#endif
-    }
-    return OK;
-}
-
-static int execreg_lastc = NUL;
-
-    int
-get_execreg_lastc(void)
-{
-    return execreg_lastc;
-}
-
-    void
-set_execreg_lastc(int lastc)
-{
-    execreg_lastc = lastc;
-}
-
-/*
- * Execute a yank register: copy it into the stuff buffer.
- *
- * Return FAIL for failure, OK otherwise.
- */
-    int
-do_execreg(
-    int	    regname,
-    int	    colon,		/* insert ':' before each line */
-    int	    addcr,		/* always add '\n' to end of line */
-    int	    silent)		/* set "silent" flag in typeahead buffer */
-{
-    long	i;
-    char_u	*p;
-    int		retval = OK;
-    int		remap;
-
-    // repeat previous one
-    if (regname == '@')
-    {
-	if (execreg_lastc == NUL)
-	{
-	    emsg(_("E748: No previously used register"));
-	    return FAIL;
-	}
-	regname = execreg_lastc;
-    }
-    // check for valid regname
-    if (regname == '%' || regname == '#' || !valid_yank_reg(regname, FALSE))
-    {
-	emsg_invreg(regname);
-	return FAIL;
-    }
-    execreg_lastc = regname;
-
-#ifdef FEAT_CLIPBOARD
-    regname = may_get_selection(regname);
-#endif
-
-    // black hole: don't stuff anything
-    if (regname == '_')
-	return OK;
-
-    // use last command line
-    if (regname == ':')
-    {
-	if (last_cmdline == NULL)
-	{
-	    emsg(_(e_nolastcmd));
-	    return FAIL;
-	}
-	// don't keep the cmdline containing @:
-	VIM_CLEAR(new_last_cmdline);
-	// Escape all control characters with a CTRL-V
-	p = vim_strsave_escaped_ext(last_cmdline,
-		    (char_u *)"\001\002\003\004\005\006\007"
-			  "\010\011\012\013\014\015\016\017"
-			  "\020\021\022\023\024\025\026\027"
-			  "\030\031\032\033\034\035\036\037",
-		    Ctrl_V, FALSE);
-	if (p != NULL)
-	{
-	    /* When in Visual mode "'<,'>" will be prepended to the command.
-	     * Remove it when it's already there. */
-	    if (VIsual_active && STRNCMP(p, "'<,'>", 5) == 0)
-		retval = put_in_typebuf(p + 5, TRUE, TRUE, silent);
-	    else
-		retval = put_in_typebuf(p, TRUE, TRUE, silent);
-	}
-	vim_free(p);
-    }
-#ifdef FEAT_EVAL
-    else if (regname == '=')
-    {
-	p = get_expr_line();
-	if (p == NULL)
-	    return FAIL;
-	retval = put_in_typebuf(p, TRUE, colon, silent);
-	vim_free(p);
-    }
-#endif
-    else if (regname == '.')		/* use last inserted text */
-    {
-	p = get_last_insert_save();
-	if (p == NULL)
-	{
-	    emsg(_(e_noinstext));
-	    return FAIL;
-	}
-	retval = put_in_typebuf(p, FALSE, colon, silent);
-	vim_free(p);
-    }
-    else
-    {
-	get_yank_register(regname, FALSE);
-	if (y_current->y_array == NULL)
-	    return FAIL;
-
-	/* Disallow remaping for ":@r". */
-	remap = colon ? REMAP_NONE : REMAP_YES;
-
-	/*
-	 * Insert lines into typeahead buffer, from last one to first one.
-	 */
-	put_reedit_in_typebuf(silent);
-	for (i = y_current->y_size; --i >= 0; )
-	{
-	    char_u *escaped;
-
-	    /* insert NL between lines and after last line if type is MLINE */
-	    if (y_current->y_type == MLINE || i < y_current->y_size - 1
-								     || addcr)
-	    {
-		if (ins_typebuf((char_u *)"\n", remap, 0, TRUE, silent) == FAIL)
-		    return FAIL;
-	    }
-	    escaped = vim_strsave_escape_csi(y_current->y_array[i]);
-	    if (escaped == NULL)
-		return FAIL;
-	    retval = ins_typebuf(escaped, remap, 0, TRUE, silent);
-	    vim_free(escaped);
-	    if (retval == FAIL)
-		return FAIL;
-	    if (colon && ins_typebuf((char_u *)":", remap, 0, TRUE, silent)
-								      == FAIL)
-		return FAIL;
-	}
-	reg_executing = regname == 0 ? '"' : regname; // disable "q" command
-    }
-    return retval;
-}
-
-/*
- * If "restart_edit" is not zero, put it in the typeahead buffer, so that it's
- * used only after other typeahead has been processed.
- */
-    static void
-put_reedit_in_typebuf(int silent)
-{
-    char_u	buf[3];
-
-    if (restart_edit != NUL)
-    {
-	if (restart_edit == 'V')
-	{
-	    buf[0] = 'g';
-	    buf[1] = 'R';
-	    buf[2] = NUL;
-	}
-	else
-	{
-	    buf[0] = restart_edit == 'I' ? 'i' : restart_edit;
-	    buf[1] = NUL;
-	}
-	if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
-	    restart_edit = NUL;
-    }
-}
-
-/*
- * Insert register contents "s" into the typeahead buffer, so that it will be
- * executed again.
- * When "esc" is TRUE it is to be taken literally: Escape CSI characters and
- * no remapping.
- */
-    static int
-put_in_typebuf(
-    char_u	*s,
-    int		esc,
-    int		colon,	    /* add ':' before the line */
-    int		silent)
-{
-    int		retval = OK;
-
-    put_reedit_in_typebuf(silent);
-    if (colon)
-	retval = ins_typebuf((char_u *)"\n", REMAP_NONE, 0, TRUE, silent);
-    if (retval == OK)
-    {
-	char_u	*p;
-
-	if (esc)
-	    p = vim_strsave_escape_csi(s);
-	else
-	    p = s;
-	if (p == NULL)
-	    retval = FAIL;
-	else
-	    retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES,
-							     0, TRUE, silent);
-	if (esc)
-	    vim_free(p);
-    }
-    if (colon && retval == OK)
-	retval = ins_typebuf((char_u *)":", REMAP_NONE, 0, TRUE, silent);
-    return retval;
-}
-
-/*
- * Insert a yank register: copy it into the Read buffer.
- * Used by CTRL-R command and middle mouse button in insert mode.
- *
- * return FAIL for failure, OK otherwise
- */
-    int
-insert_reg(
-    int		regname,
-    int		literally_arg)	/* insert literally, not as if typed */
-{
-    long	i;
-    int		retval = OK;
-    char_u	*arg;
-    int		allocated;
-    int		literally = literally_arg;
-
-    /*
-     * It is possible to get into an endless loop by having CTRL-R a in
-     * register a and then, in insert mode, doing CTRL-R a.
-     * If you hit CTRL-C, the loop will be broken here.
-     */
-    ui_breakcheck();
-    if (got_int)
-	return FAIL;
-
-    /* check for valid regname */
-    if (regname != NUL && !valid_yank_reg(regname, FALSE))
-	return FAIL;
-
-#ifdef FEAT_CLIPBOARD
-    regname = may_get_selection(regname);
-#endif
-
-    if (regname == '.')			/* insert last inserted text */
-	retval = stuff_inserted(NUL, 1L, TRUE);
-    else if (get_spec_reg(regname, &arg, &allocated, TRUE))
-    {
-	if (arg == NULL)
-	    return FAIL;
-	stuffescaped(arg, literally);
-	if (allocated)
-	    vim_free(arg);
-    }
-    else				/* name or number register */
-    {
-	if (get_yank_register(regname, FALSE))
-	    literally = TRUE;
-	if (y_current->y_array == NULL)
-	    retval = FAIL;
-	else
-	{
-	    for (i = 0; i < y_current->y_size; ++i)
-	    {
-		stuffescaped(y_current->y_array[i], literally);
-		/*
-		 * Insert a newline between lines and after last line if
-		 * y_type is MLINE.
-		 */
-		if (y_current->y_type == MLINE || i < y_current->y_size - 1)
-		    stuffcharReadbuff('\n');
-	    }
-	}
-    }
-
-    return retval;
-}
-
 /*
  * Stuff a string into the typeahead buffer, such that edit() will insert it
  * literally ("literally" TRUE) or interpret is as typed characters.
  */
-    static void
+    void
 stuffescaped(char_u *arg, int literally)
 {
     int		c;
@@ -1498,242 +719,6 @@
 }
 
 /*
- * If "regname" is a special register, return TRUE and store a pointer to its
- * value in "argp".
- */
-    int
-get_spec_reg(
-    int		regname,
-    char_u	**argp,
-    int		*allocated,	/* return: TRUE when value was allocated */
-    int		errmsg)		/* give error message when failing */
-{
-    int		cnt;
-
-    *argp = NULL;
-    *allocated = FALSE;
-    switch (regname)
-    {
-	case '%':		/* file name */
-	    if (errmsg)
-		check_fname();	/* will give emsg if not set */
-	    *argp = curbuf->b_fname;
-	    return TRUE;
-
-	case '#':		/* alternate file name */
-	    *argp = getaltfname(errmsg);	/* may give emsg if not set */
-	    return TRUE;
-
-#ifdef FEAT_EVAL
-	case '=':		/* result of expression */
-	    *argp = get_expr_line();
-	    *allocated = TRUE;
-	    return TRUE;
-#endif
-
-	case ':':		/* last command line */
-	    if (last_cmdline == NULL && errmsg)
-		emsg(_(e_nolastcmd));
-	    *argp = last_cmdline;
-	    return TRUE;
-
-	case '/':		/* last search-pattern */
-	    if (last_search_pat() == NULL && errmsg)
-		emsg(_(e_noprevre));
-	    *argp = last_search_pat();
-	    return TRUE;
-
-	case '.':		/* last inserted text */
-	    *argp = get_last_insert_save();
-	    *allocated = TRUE;
-	    if (*argp == NULL && errmsg)
-		emsg(_(e_noinstext));
-	    return TRUE;
-
-#ifdef FEAT_SEARCHPATH
-	case Ctrl_F:		/* Filename under cursor */
-	case Ctrl_P:		/* Path under cursor, expand via "path" */
-	    if (!errmsg)
-		return FALSE;
-	    *argp = file_name_at_cursor(FNAME_MESS | FNAME_HYP
-			    | (regname == Ctrl_P ? FNAME_EXP : 0), 1L, NULL);
-	    *allocated = TRUE;
-	    return TRUE;
-#endif
-
-	case Ctrl_W:		/* word under cursor */
-	case Ctrl_A:		/* WORD (mnemonic All) under cursor */
-	    if (!errmsg)
-		return FALSE;
-	    cnt = find_ident_under_cursor(argp, regname == Ctrl_W
-				   ?  (FIND_IDENT|FIND_STRING) : FIND_STRING);
-	    *argp = cnt ? vim_strnsave(*argp, cnt) : NULL;
-	    *allocated = TRUE;
-	    return TRUE;
-
-	case Ctrl_L:		/* Line under cursor */
-	    if (!errmsg)
-		return FALSE;
-
-	    *argp = ml_get_buf(curwin->w_buffer,
-			curwin->w_cursor.lnum, FALSE);
-	    return TRUE;
-
-	case '_':		/* black hole: always empty */
-	    *argp = (char_u *)"";
-	    return TRUE;
-    }
-
-    return FALSE;
-}
-
-/*
- * Paste a yank register into the command line.
- * Only for non-special registers.
- * Used by CTRL-R command in command-line mode
- * insert_reg() can't be used here, because special characters from the
- * register contents will be interpreted as commands.
- *
- * return FAIL for failure, OK otherwise
- */
-    int
-cmdline_paste_reg(
-    int regname,
-    int literally_arg,	/* Insert text literally instead of "as typed" */
-    int remcr)		/* don't add CR characters */
-{
-    long	i;
-    int		literally = literally_arg;
-
-    if (get_yank_register(regname, FALSE))
-	literally = TRUE;
-    if (y_current->y_array == NULL)
-	return FAIL;
-
-    for (i = 0; i < y_current->y_size; ++i)
-    {
-	cmdline_paste_str(y_current->y_array[i], literally);
-
-	/* Insert ^M between lines and after last line if type is MLINE.
-	 * Don't do this when "remcr" is TRUE. */
-	if ((y_current->y_type == MLINE || i < y_current->y_size - 1) && !remcr)
-	    cmdline_paste_str((char_u *)"\r", literally);
-
-	/* Check for CTRL-C, in case someone tries to paste a few thousand
-	 * lines and gets bored. */
-	ui_breakcheck();
-	if (got_int)
-	    return FAIL;
-    }
-    return OK;
-}
-
-#if defined(FEAT_CLIPBOARD) || defined(PROTO)
-/*
- * Adjust the register name pointed to with "rp" for the clipboard being
- * used always and the clipboard being available.
- */
-    void
-adjust_clip_reg(int *rp)
-{
-    /* If no reg. specified, and "unnamed" or "unnamedplus" is in 'clipboard',
-     * use '*' or '+' reg, respectively. "unnamedplus" prevails. */
-    if (*rp == 0 && (clip_unnamed != 0 || clip_unnamed_saved != 0))
-    {
-	if (clip_unnamed != 0)
-	    *rp = ((clip_unnamed & CLIP_UNNAMED_PLUS) && clip_plus.available)
-								  ? '+' : '*';
-	else
-	    *rp = ((clip_unnamed_saved & CLIP_UNNAMED_PLUS) && clip_plus.available)
-								  ? '+' : '*';
-    }
-    if (!clip_star.available && *rp == '*')
-	*rp = 0;
-    if (!clip_plus.available && *rp == '+')
-	*rp = 0;
-}
-#endif
-
-/*
- * Shift the delete registers: "9 is cleared, "8 becomes "9, etc.
- */
-    void
-shift_delete_registers()
-{
-    int		n;
-
-    y_current = &y_regs[9];
-    free_yank_all();			/* free register nine */
-    for (n = 9; n > 1; --n)
-	y_regs[n] = y_regs[n - 1];
-    y_current = &y_regs[1];
-    if (!y_append)
-	y_previous = y_current;
-    y_regs[1].y_array = NULL;		/* set register one to empty */
-}
-
-#if defined(FEAT_EVAL)
-    static void
-yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
-{
-    static int	recursive = FALSE;
-    dict_T	*v_event;
-    list_T	*list;
-    int		n;
-    char_u	buf[NUMBUFLEN + 2];
-    long	reglen = 0;
-
-    if (recursive)
-	return;
-
-    v_event = get_vim_var_dict(VV_EVENT);
-
-    list = list_alloc();
-    if (list == NULL)
-	return;
-    for (n = 0; n < reg->y_size; n++)
-	list_append_string(list, reg->y_array[n], -1);
-    list->lv_lock = VAR_FIXED;
-    dict_add_list(v_event, "regcontents", list);
-
-    buf[0] = (char_u)oap->regname;
-    buf[1] = NUL;
-    dict_add_string(v_event, "regname", buf);
-
-    buf[0] = get_op_char(oap->op_type);
-    buf[1] = get_extra_op_char(oap->op_type);
-    buf[2] = NUL;
-    dict_add_string(v_event, "operator", buf);
-
-    buf[0] = NUL;
-    buf[1] = NUL;
-    switch (get_reg_type(oap->regname, &reglen))
-    {
-	case MLINE: buf[0] = 'V'; break;
-	case MCHAR: buf[0] = 'v'; break;
-	case MBLOCK:
-		vim_snprintf((char *)buf, sizeof(buf), "%c%ld", Ctrl_V,
-			     reglen + 1);
-		break;
-    }
-    dict_add_string(v_event, "regtype", buf);
-
-    /* Lock the dictionary and its keys */
-    dict_set_items_ro(v_event);
-
-    recursive = TRUE;
-    textlock++;
-    apply_autocmds(EVENT_TEXTYANKPOST, NULL, NULL, FALSE, curbuf);
-    textlock--;
-    recursive = FALSE;
-
-    /* Empty the dictionary, v:event is still valid */
-    dict_free_contents(v_event);
-    hash_init(&v_event->dv_hashtab);
-}
-#endif
-
-/*
  * Handle a delete operation.
  *
  * Return FAIL if undo failed, OK otherwise.
@@ -1885,7 +870,7 @@
 
 #if defined(FEAT_EVAL)
 	if (did_yank && has_textyankpost())
-	    yank_do_autocmd(oap, y_current);
+	    yank_do_autocmd(oap, get_y_current());
 #endif
     }
 
@@ -2911,1155 +1896,6 @@
 }
 
 /*
- * set all the yank registers to empty (called from main())
- */
-    void
-init_yank(void)
-{
-    int		i;
-
-    for (i = 0; i < NUM_REGISTERS; ++i)
-	y_regs[i].y_array = NULL;
-}
-
-#if defined(EXITFREE) || defined(PROTO)
-    void
-clear_registers(void)
-{
-    int		i;
-
-    for (i = 0; i < NUM_REGISTERS; ++i)
-    {
-	y_current = &y_regs[i];
-	if (y_current->y_array != NULL)
-	    free_yank_all();
-    }
-}
-#endif
-
-/*
- * Free "n" lines from the current yank register.
- * Called for normal freeing and in case of error.
- */
-    static void
-free_yank(long n)
-{
-    if (y_current->y_array != NULL)
-    {
-	long	    i;
-
-	for (i = n; --i >= 0; )
-	{
-#ifdef AMIGA	    /* only for very slow machines */
-	    if ((i & 1023) == 1023)  /* this may take a while */
-	    {
-		/*
-		 * This message should never cause a hit-return message.
-		 * Overwrite this message with any next message.
-		 */
-		++no_wait_return;
-		smsg(_("freeing %ld lines"), i + 1);
-		--no_wait_return;
-		msg_didout = FALSE;
-		msg_col = 0;
-	    }
-#endif
-	    vim_free(y_current->y_array[i]);
-	}
-	VIM_CLEAR(y_current->y_array);
-#ifdef AMIGA
-	if (n >= 1000)
-	    msg("");
-#endif
-    }
-}
-
-    static void
-free_yank_all(void)
-{
-    free_yank(y_current->y_size);
-}
-
-/*
- * Yank the text between "oap->start" and "oap->end" into a yank register.
- * If we are to append (uppercase register), we first yank into a new yank
- * register and then concatenate the old and the new one (so we keep the old
- * one in case of out-of-memory).
- *
- * Return FAIL for failure, OK otherwise.
- */
-    int
-op_yank(oparg_T *oap, int deleting, int mess)
-{
-    long		y_idx;		/* index in y_array[] */
-    yankreg_T		*curr;		/* copy of y_current */
-    yankreg_T		newreg;		/* new yank register when appending */
-    char_u		**new_ptr;
-    linenr_T		lnum;		/* current line number */
-    long		j;
-    int			yanktype = oap->motion_type;
-    long		yanklines = oap->line_count;
-    linenr_T		yankendlnum = oap->end.lnum;
-    char_u		*p;
-    char_u		*pnew;
-    struct block_def	bd;
-#if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
-    int			did_star = FALSE;
-#endif
-
-				    /* check for read-only register */
-    if (oap->regname != 0 && !valid_yank_reg(oap->regname, TRUE))
-    {
-	beep_flush();
-	return FAIL;
-    }
-    if (oap->regname == '_')	    /* black hole: nothing to do */
-	return OK;
-
-#ifdef FEAT_CLIPBOARD
-    if (!clip_star.available && oap->regname == '*')
-	oap->regname = 0;
-    else if (!clip_plus.available && oap->regname == '+')
-	oap->regname = 0;
-#endif
-
-    if (!deleting)		    /* op_delete() already set y_current */
-	get_yank_register(oap->regname, TRUE);
-
-    curr = y_current;
-				    /* append to existing contents */
-    if (y_append && y_current->y_array != NULL)
-	y_current = &newreg;
-    else
-	free_yank_all();	    /* free previously yanked lines */
-
-    /*
-     * If the cursor was in column 1 before and after the movement, and the
-     * operator is not inclusive, the yank is always linewise.
-     */
-    if (       oap->motion_type == MCHAR
-	    && oap->start.col == 0
-	    && !oap->inclusive
-	    && (!oap->is_VIsual || *p_sel == 'o')
-	    && !oap->block_mode
-	    && oap->end.col == 0
-	    && yanklines > 1)
-    {
-	yanktype = MLINE;
-	--yankendlnum;
-	--yanklines;
-    }
-
-    y_current->y_size = yanklines;
-    y_current->y_type = yanktype;   /* set the yank register type */
-    y_current->y_width = 0;
-    y_current->y_array = lalloc_clear(sizeof(char_u *) * yanklines, TRUE);
-    if (y_current->y_array == NULL)
-    {
-	y_current = curr;
-	return FAIL;
-    }
-#ifdef FEAT_VIMINFO
-    y_current->y_time_set = vim_time();
-#endif
-
-    y_idx = 0;
-    lnum = oap->start.lnum;
-
-    if (oap->block_mode)
-    {
-	/* Visual block mode */
-	y_current->y_type = MBLOCK;	    /* set the yank register type */
-	y_current->y_width = oap->end_vcol - oap->start_vcol;
-
-	if (curwin->w_curswant == MAXCOL && y_current->y_width > 0)
-	    y_current->y_width--;
-    }
-
-    for ( ; lnum <= yankendlnum; lnum++, y_idx++)
-    {
-	switch (y_current->y_type)
-	{
-	    case MBLOCK:
-		block_prep(oap, &bd, lnum, FALSE);
-		if (yank_copy_line(&bd, y_idx) == FAIL)
-		    goto fail;
-		break;
-
-	    case MLINE:
-		if ((y_current->y_array[y_idx] =
-			    vim_strsave(ml_get(lnum))) == NULL)
-		    goto fail;
-		break;
-
-	    case MCHAR:
-		{
-		    colnr_T startcol = 0, endcol = MAXCOL;
-		    int is_oneChar = FALSE;
-		    colnr_T cs, ce;
-
-		    p = ml_get(lnum);
-		    bd.startspaces = 0;
-		    bd.endspaces = 0;
-
-		    if (lnum == oap->start.lnum)
-		    {
-			startcol = oap->start.col;
-			if (virtual_op)
-			{
-			    getvcol(curwin, &oap->start, &cs, NULL, &ce);
-			    if (ce != cs && oap->start.coladd > 0)
-			    {
-				/* Part of a tab selected -- but don't
-				 * double-count it. */
-				bd.startspaces = (ce - cs + 1)
-							  - oap->start.coladd;
-				startcol++;
-			    }
-			}
-		    }
-
-		    if (lnum == oap->end.lnum)
-		    {
-			endcol = oap->end.col;
-			if (virtual_op)
-			{
-			    getvcol(curwin, &oap->end, &cs, NULL, &ce);
-			    if (p[endcol] == NUL || (cs + oap->end.coladd < ce
-					/* Don't add space for double-wide
-					 * char; endcol will be on last byte
-					 * of multi-byte char. */
-					&& (*mb_head_off)(p, p + endcol) == 0))
-			    {
-				if (oap->start.lnum == oap->end.lnum
-					    && oap->start.col == oap->end.col)
-				{
-				    /* Special case: inside a single char */
-				    is_oneChar = TRUE;
-				    bd.startspaces = oap->end.coladd
-					 - oap->start.coladd + oap->inclusive;
-				    endcol = startcol;
-				}
-				else
-				{
-				    bd.endspaces = oap->end.coladd
-							     + oap->inclusive;
-				    endcol -= oap->inclusive;
-				}
-			    }
-			}
-		    }
-		    if (endcol == MAXCOL)
-			endcol = (colnr_T)STRLEN(p);
-		    if (startcol > endcol || is_oneChar)
-			bd.textlen = 0;
-		    else
-			bd.textlen = endcol - startcol + oap->inclusive;
-		    bd.textstart = p + startcol;
-		    if (yank_copy_line(&bd, y_idx) == FAIL)
-			goto fail;
-		    break;
-		}
-		/* NOTREACHED */
-	}
-    }
-
-    if (curr != y_current)	/* append the new block to the old block */
-    {
-	new_ptr = ALLOC_MULT(char_u *, curr->y_size + y_current->y_size);
-	if (new_ptr == NULL)
-	    goto fail;
-	for (j = 0; j < curr->y_size; ++j)
-	    new_ptr[j] = curr->y_array[j];
-	vim_free(curr->y_array);
-	curr->y_array = new_ptr;
-#ifdef FEAT_VIMINFO
-	curr->y_time_set = vim_time();
-#endif
-
-	if (yanktype == MLINE)	/* MLINE overrides MCHAR and MBLOCK */
-	    curr->y_type = MLINE;
-
-	/* Concatenate the last line of the old block with the first line of
-	 * the new block, unless being Vi compatible. */
-	if (curr->y_type == MCHAR && vim_strchr(p_cpo, CPO_REGAPPEND) == NULL)
-	{
-	    pnew = alloc(STRLEN(curr->y_array[curr->y_size - 1])
-					  + STRLEN(y_current->y_array[0]) + 1);
-	    if (pnew == NULL)
-	    {
-		y_idx = y_current->y_size - 1;
-		goto fail;
-	    }
-	    STRCPY(pnew, curr->y_array[--j]);
-	    STRCAT(pnew, y_current->y_array[0]);
-	    vim_free(curr->y_array[j]);
-	    vim_free(y_current->y_array[0]);
-	    curr->y_array[j++] = pnew;
-	    y_idx = 1;
-	}
-	else
-	    y_idx = 0;
-	while (y_idx < y_current->y_size)
-	    curr->y_array[j++] = y_current->y_array[y_idx++];
-	curr->y_size = j;
-	vim_free(y_current->y_array);
-	y_current = curr;
-    }
-    if (curwin->w_p_rnu)
-	redraw_later(SOME_VALID);	/* cursor moved to start */
-    if (mess)			/* Display message about yank? */
-    {
-	if (yanktype == MCHAR
-		&& !oap->block_mode
-		&& yanklines == 1)
-	    yanklines = 0;
-	/* Some versions of Vi use ">=" here, some don't...  */
-	if (yanklines > p_report)
-	{
-	    char namebuf[100];
-
-	    if (oap->regname == NUL)
-		*namebuf = NUL;
-	    else
-		vim_snprintf(namebuf, sizeof(namebuf),
-						_(" into \"%c"), oap->regname);
-
-	    /* redisplay now, so message is not deleted */
-	    update_topline_redraw();
-	    if (oap->block_mode)
-	    {
-		smsg(NGETTEXT("block of %ld line yanked%s",
-				     "block of %ld lines yanked%s", yanklines),
-			yanklines, namebuf);
-	    }
-	    else
-	    {
-		smsg(NGETTEXT("%ld line yanked%s",
-					      "%ld lines yanked%s", yanklines),
-			yanklines, namebuf);
-	    }
-	}
-    }
-
-    /*
-     * Set "'[" and "']" marks.
-     */
-    curbuf->b_op_start = oap->start;
-    curbuf->b_op_end = oap->end;
-    if (yanktype == MLINE && !oap->block_mode)
-    {
-	curbuf->b_op_start.col = 0;
-	curbuf->b_op_end.col = MAXCOL;
-    }
-
-#ifdef FEAT_CLIPBOARD
-    /*
-     * If we were yanking to the '*' register, send result to clipboard.
-     * If no register was specified, and "unnamed" in 'clipboard', make a copy
-     * to the '*' register.
-     */
-    if (clip_star.available
-	    && (curr == &(y_regs[STAR_REGISTER])
-		|| (!deleting && oap->regname == 0
-		   && ((clip_unnamed | clip_unnamed_saved) & CLIP_UNNAMED))))
-    {
-	if (curr != &(y_regs[STAR_REGISTER]))
-	    /* Copy the text from register 0 to the clipboard register. */
-	    copy_yank_reg(&(y_regs[STAR_REGISTER]));
-
-	clip_own_selection(&clip_star);
-	clip_gen_set_selection(&clip_star);
-# ifdef FEAT_X11
-	did_star = TRUE;
-# endif
-    }
-
-# ifdef FEAT_X11
-    /*
-     * If we were yanking to the '+' register, send result to selection.
-     * Also copy to the '*' register, in case auto-select is off.
-     */
-    if (clip_plus.available
-	    && (curr == &(y_regs[PLUS_REGISTER])
-		|| (!deleting && oap->regname == 0
-		  && ((clip_unnamed | clip_unnamed_saved) &
-		      CLIP_UNNAMED_PLUS))))
-    {
-	if (curr != &(y_regs[PLUS_REGISTER]))
-	    /* Copy the text from register 0 to the clipboard register. */
-	    copy_yank_reg(&(y_regs[PLUS_REGISTER]));
-
-	clip_own_selection(&clip_plus);
-	clip_gen_set_selection(&clip_plus);
-	if (!clip_isautosel_star() && !clip_isautosel_plus()
-		&& !did_star && curr == &(y_regs[PLUS_REGISTER]))
-	{
-	    copy_yank_reg(&(y_regs[STAR_REGISTER]));
-	    clip_own_selection(&clip_star);
-	    clip_gen_set_selection(&clip_star);
-	}
-    }
-# endif
-#endif
-
-#if defined(FEAT_EVAL)
-    if (!deleting && has_textyankpost())
-	yank_do_autocmd(oap, y_current);
-#endif
-
-    return OK;
-
-fail:		/* free the allocated lines */
-    free_yank(y_idx + 1);
-    y_current = curr;
-    return FAIL;
-}
-
-    static int
-yank_copy_line(struct block_def *bd, long y_idx)
-{
-    char_u	*pnew;
-
-    if ((pnew = alloc(bd->startspaces + bd->endspaces + bd->textlen + 1))
-								      == 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;
-}
-
-#ifdef FEAT_CLIPBOARD
-/*
- * Make a copy of the y_current register to register "reg".
- */
-    static void
-copy_yank_reg(yankreg_T *reg)
-{
-    yankreg_T	*curr = y_current;
-    long	j;
-
-    y_current = reg;
-    free_yank_all();
-    *y_current = *curr;
-    y_current->y_array = lalloc_clear(
-				    sizeof(char_u *) * y_current->y_size, TRUE);
-    if (y_current->y_array == NULL)
-	y_current->y_size = 0;
-    else
-	for (j = 0; j < y_current->y_size; ++j)
-	    if ((y_current->y_array[j] = vim_strsave(curr->y_array[j])) == NULL)
-	    {
-		free_yank(j);
-		y_current->y_size = 0;
-		break;
-	    }
-    y_current = curr;
-}
-#endif
-
-/*
- * Put contents of register "regname" into the text.
- * Caller must check "regname" to be valid!
- * "flags": PUT_FIXINDENT	make indent look nice
- *	    PUT_CURSEND		leave cursor after end of new text
- *	    PUT_LINE		force linewise put (":put")
- */
-    void
-do_put(
-    int		regname,
-    int		dir,		/* BACKWARD for 'P', FORWARD for 'p' */
-    long	count,
-    int		flags)
-{
-    char_u	*ptr;
-    char_u	*newp, *oldp;
-    int		yanklen;
-    int		totlen = 0;		/* init for gcc */
-    linenr_T	lnum;
-    colnr_T	col;
-    long	i;			/* index in y_array[] */
-    int		y_type;
-    long	y_size;
-    int		oldlen;
-    long	y_width = 0;
-    colnr_T	vcol;
-    int		delcount;
-    int		incr = 0;
-    long	j;
-    struct block_def bd;
-    char_u	**y_array = NULL;
-    long	nr_lines = 0;
-    pos_T	new_cursor;
-    int		indent;
-    int		orig_indent = 0;	/* init for gcc */
-    int		indent_diff = 0;	/* init for gcc */
-    int		first_indent = TRUE;
-    int		lendiff = 0;
-    pos_T	old_pos;
-    char_u	*insert_string = NULL;
-    int		allocated = FALSE;
-    long	cnt;
-
-#ifdef FEAT_CLIPBOARD
-    /* Adjust register name for "unnamed" in 'clipboard'. */
-    adjust_clip_reg(&regname);
-    (void)may_get_selection(regname);
-#endif
-
-    if (flags & PUT_FIXINDENT)
-	orig_indent = get_indent();
-
-    curbuf->b_op_start = curwin->w_cursor;	/* default for '[ mark */
-    curbuf->b_op_end = curwin->w_cursor;	/* default for '] mark */
-
-    /*
-     * Using inserted text works differently, because the register includes
-     * special characters (newlines, etc.).
-     */
-    if (regname == '.')
-    {
-	if (VIsual_active)
-	    stuffcharReadbuff(VIsual_mode);
-	(void)stuff_inserted((dir == FORWARD ? (count == -1 ? 'o' : 'a') :
-				    (count == -1 ? 'O' : 'i')), count, FALSE);
-	/* Putting the text is done later, so can't really move the cursor to
-	 * the next character.  Use "l" to simulate it. */
-	if ((flags & PUT_CURSEND) && gchar_cursor() != NUL)
-	    stuffcharReadbuff('l');
-	return;
-    }
-
-    /*
-     * For special registers '%' (file name), '#' (alternate file name) and
-     * ':' (last command line), etc. we have to create a fake yank register.
-     */
-    if (get_spec_reg(regname, &insert_string, &allocated, TRUE))
-    {
-	if (insert_string == NULL)
-	    return;
-    }
-
-    /* Autocommands may be executed when saving lines for undo.  This might
-     * make "y_array" invalid, so we start undo now to avoid that. */
-    if (u_save(curwin->w_cursor.lnum, curwin->w_cursor.lnum + 1) == FAIL)
-	goto end;
-
-    if (insert_string != NULL)
-    {
-	y_type = MCHAR;
-#ifdef FEAT_EVAL
-	if (regname == '=')
-	{
-	    /* For the = register we need to split the string at NL
-	     * characters.
-	     * Loop twice: count the number of lines and save them. */
-	    for (;;)
-	    {
-		y_size = 0;
-		ptr = insert_string;
-		while (ptr != NULL)
-		{
-		    if (y_array != NULL)
-			y_array[y_size] = ptr;
-		    ++y_size;
-		    ptr = vim_strchr(ptr, '\n');
-		    if (ptr != NULL)
-		    {
-			if (y_array != NULL)
-			    *ptr = NUL;
-			++ptr;
-			/* A trailing '\n' makes the register linewise. */
-			if (*ptr == NUL)
-			{
-			    y_type = MLINE;
-			    break;
-			}
-		    }
-		}
-		if (y_array != NULL)
-		    break;
-		y_array = ALLOC_MULT(char_u *, y_size);
-		if (y_array == NULL)
-		    goto end;
-	    }
-	}
-	else
-#endif
-	{
-	    y_size = 1;		/* use fake one-line yank register */
-	    y_array = &insert_string;
-	}
-    }
-    else
-    {
-	get_yank_register(regname, FALSE);
-
-	y_type = y_current->y_type;
-	y_width = y_current->y_width;
-	y_size = y_current->y_size;
-	y_array = y_current->y_array;
-    }
-
-    if (y_type == MLINE)
-    {
-	if (flags & PUT_LINE_SPLIT)
-	{
-	    char_u *p;
-
-	    /* "p" or "P" in Visual mode: split the lines to put the text in
-	     * between. */
-	    if (u_save_cursor() == FAIL)
-		goto end;
-	    p = ml_get_cursor();
-	    if (dir == FORWARD && *p != NUL)
-		MB_PTR_ADV(p);
-	    ptr = vim_strsave(p);
-	    if (ptr == NULL)
-		goto end;
-	    ml_append(curwin->w_cursor.lnum, ptr, (colnr_T)0, FALSE);
-	    vim_free(ptr);
-
-	    oldp = ml_get_curline();
-	    p = oldp + curwin->w_cursor.col;
-	    if (dir == FORWARD && *p != NUL)
-		MB_PTR_ADV(p);
-	    ptr = vim_strnsave(oldp, p - oldp);
-	    if (ptr == NULL)
-		goto end;
-	    ml_replace(curwin->w_cursor.lnum, ptr, FALSE);
-	    ++nr_lines;
-	    dir = FORWARD;
-	}
-	if (flags & PUT_LINE_FORWARD)
-	{
-	    /* Must be "p" for a Visual block, put lines below the block. */
-	    curwin->w_cursor = curbuf->b_visual.vi_end;
-	    dir = FORWARD;
-	}
-	curbuf->b_op_start = curwin->w_cursor;	/* default for '[ mark */
-	curbuf->b_op_end = curwin->w_cursor;	/* default for '] mark */
-    }
-
-    if (flags & PUT_LINE)	/* :put command or "p" in Visual line mode. */
-	y_type = MLINE;
-
-    if (y_size == 0 || y_array == NULL)
-    {
-	semsg(_("E353: Nothing in register %s"),
-		  regname == 0 ? (char_u *)"\"" : transchar(regname));
-	goto end;
-    }
-
-    if (y_type == MBLOCK)
-    {
-	lnum = curwin->w_cursor.lnum + y_size + 1;
-	if (lnum > curbuf->b_ml.ml_line_count)
-	    lnum = curbuf->b_ml.ml_line_count + 1;
-	if (u_save(curwin->w_cursor.lnum - 1, lnum) == FAIL)
-	    goto end;
-    }
-    else if (y_type == MLINE)
-    {
-	lnum = curwin->w_cursor.lnum;
-#ifdef FEAT_FOLDING
-	/* Correct line number for closed fold.  Don't move the cursor yet,
-	 * u_save() uses it. */
-	if (dir == BACKWARD)
-	    (void)hasFolding(lnum, &lnum, NULL);
-	else
-	    (void)hasFolding(lnum, NULL, &lnum);
-#endif
-	if (dir == FORWARD)
-	    ++lnum;
-	/* In an empty buffer the empty line is going to be replaced, include
-	 * it in the saved lines. */
-	if ((BUFEMPTY() ? u_save(0, 2) : u_save(lnum - 1, lnum)) == FAIL)
-	    goto end;
-#ifdef FEAT_FOLDING
-	if (dir == FORWARD)
-	    curwin->w_cursor.lnum = lnum - 1;
-	else
-	    curwin->w_cursor.lnum = lnum;
-	curbuf->b_op_start = curwin->w_cursor;	/* for mark_adjust() */
-#endif
-    }
-    else if (u_save_cursor() == FAIL)
-	goto end;
-
-    yanklen = (int)STRLEN(y_array[0]);
-
-    if (ve_flags == VE_ALL && y_type == MCHAR)
-    {
-	if (gchar_cursor() == TAB)
-	{
-	    /* Don't need to insert spaces when "p" on the last position of a
-	     * tab or "P" on the first position. */
-#ifdef FEAT_VARTABS
-	    int viscol = getviscol();
-	    if (dir == FORWARD
-		    ? tabstop_padding(viscol, curbuf->b_p_ts,
-						    curbuf->b_p_vts_array) != 1
-		    : curwin->w_cursor.coladd > 0)
-		coladvance_force(viscol);
-#else
-	    if (dir == FORWARD
-		    ? (int)curwin->w_cursor.coladd < curbuf->b_p_ts - 1
-						: curwin->w_cursor.coladd > 0)
-		coladvance_force(getviscol());
-#endif
-	    else
-		curwin->w_cursor.coladd = 0;
-	}
-	else if (curwin->w_cursor.coladd > 0 || gchar_cursor() == NUL)
-	    coladvance_force(getviscol() + (dir == FORWARD));
-    }
-
-    lnum = curwin->w_cursor.lnum;
-    col = curwin->w_cursor.col;
-
-    /*
-     * Block mode
-     */
-    if (y_type == MBLOCK)
-    {
-	int	c = gchar_cursor();
-	colnr_T	endcol2 = 0;
-
-	if (dir == FORWARD && c != NUL)
-	{
-	    if (ve_flags == VE_ALL)
-		getvcol(curwin, &curwin->w_cursor, &col, NULL, &endcol2);
-	    else
-		getvcol(curwin, &curwin->w_cursor, NULL, NULL, &col);
-
-	    if (has_mbyte)
-		/* move to start of next multi-byte character */
-		curwin->w_cursor.col += (*mb_ptr2len)(ml_get_cursor());
-	    else
-	    if (c != TAB || ve_flags != VE_ALL)
-		++curwin->w_cursor.col;
-	    ++col;
-	}
-	else
-	    getvcol(curwin, &curwin->w_cursor, &col, NULL, &endcol2);
-
-	col += curwin->w_cursor.coladd;
-	if (ve_flags == VE_ALL
-		&& (curwin->w_cursor.coladd > 0
-		    || endcol2 == curwin->w_cursor.col))
-	{
-	    if (dir == FORWARD && c == NUL)
-		++col;
-	    if (dir != FORWARD && c != NUL)
-		++curwin->w_cursor.col;
-	    if (c == TAB)
-	    {
-		if (dir == BACKWARD && curwin->w_cursor.col)
-		    curwin->w_cursor.col--;
-		if (dir == FORWARD && col - 1 == endcol2)
-		    curwin->w_cursor.col++;
-	    }
-	}
-	curwin->w_cursor.coladd = 0;
-	bd.textcol = 0;
-	for (i = 0; i < y_size; ++i)
-	{
-	    int spaces;
-	    char shortline;
-
-	    bd.startspaces = 0;
-	    bd.endspaces = 0;
-	    vcol = 0;
-	    delcount = 0;
-
-	    /* add a new line */
-	    if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
-	    {
-		if (ml_append(curbuf->b_ml.ml_line_count, (char_u *)"",
-						   (colnr_T)1, FALSE) == FAIL)
-		    break;
-		++nr_lines;
-	    }
-	    /* get the old line and advance to the position to insert at */
-	    oldp = ml_get_curline();
-	    oldlen = (int)STRLEN(oldp);
-	    for (ptr = oldp; vcol < col && *ptr; )
-	    {
-		/* Count a tab for what it's worth (if list mode not on) */
-		incr = lbr_chartabsize_adv(oldp, &ptr, (colnr_T)vcol);
-		vcol += incr;
-	    }
-	    bd.textcol = (colnr_T)(ptr - oldp);
-
-	    shortline = (vcol < col) || (vcol == col && !*ptr) ;
-
-	    if (vcol < col) /* line too short, padd with spaces */
-		bd.startspaces = col - vcol;
-	    else if (vcol > col)
-	    {
-		bd.endspaces = vcol - col;
-		bd.startspaces = incr - bd.endspaces;
-		--bd.textcol;
-		delcount = 1;
-		if (has_mbyte)
-		    bd.textcol -= (*mb_head_off)(oldp, oldp + bd.textcol);
-		if (oldp[bd.textcol] != TAB)
-		{
-		    /* Only a Tab can be split into spaces.  Other
-		     * characters will have to be moved to after the
-		     * block, causing misalignment. */
-		    delcount = 0;
-		    bd.endspaces = 0;
-		}
-	    }
-
-	    yanklen = (int)STRLEN(y_array[i]);
-
-	    /* calculate number of spaces required to fill right side of block*/
-	    spaces = y_width + 1;
-	    for (j = 0; j < yanklen; j++)
-		spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0);
-	    if (spaces < 0)
-		spaces = 0;
-
-	    /* insert the new text */
-	    totlen = count * (yanklen + spaces) + bd.startspaces + bd.endspaces;
-	    newp = alloc(totlen + oldlen + 1);
-	    if (newp == NULL)
-		break;
-	    /* copy part up to cursor to new line */
-	    ptr = newp;
-	    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)
-	    {
-		mch_memmove(ptr, y_array[i], (size_t)yanklen);
-		ptr += yanklen;
-
-		/* 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,
-				(size_t)(oldlen - bd.textcol - delcount + 1));
-	    ml_replace(curwin->w_cursor.lnum, newp, FALSE);
-
-	    ++curwin->w_cursor.lnum;
-	    if (i == 0)
-		curwin->w_cursor.col += bd.startspaces;
-	}
-
-	changed_lines(lnum, 0, curwin->w_cursor.lnum, nr_lines);
-
-	/* Set '[ mark. */
-	curbuf->b_op_start = curwin->w_cursor;
-	curbuf->b_op_start.lnum = lnum;
-
-	/* adjust '] mark */
-	curbuf->b_op_end.lnum = curwin->w_cursor.lnum - 1;
-	curbuf->b_op_end.col = bd.textcol + totlen - 1;
-	curbuf->b_op_end.coladd = 0;
-	if (flags & PUT_CURSEND)
-	{
-	    colnr_T len;
-
-	    curwin->w_cursor = curbuf->b_op_end;
-	    curwin->w_cursor.col++;
-
-	    /* in Insert mode we might be after the NUL, correct for that */
-	    len = (colnr_T)STRLEN(ml_get_curline());
-	    if (curwin->w_cursor.col > len)
-		curwin->w_cursor.col = len;
-	}
-	else
-	    curwin->w_cursor.lnum = lnum;
-    }
-    else
-    {
-	/*
-	 * Character or Line mode
-	 */
-	if (y_type == MCHAR)
-	{
-	    /* if type is MCHAR, FORWARD is the same as BACKWARD on the next
-	     * char */
-	    if (dir == FORWARD && gchar_cursor() != NUL)
-	    {
-		if (has_mbyte)
-		{
-		    int bytelen = (*mb_ptr2len)(ml_get_cursor());
-
-		    /* put it on the next of the multi-byte character. */
-		    col += bytelen;
-		    if (yanklen)
-		    {
-			curwin->w_cursor.col += bytelen;
-			curbuf->b_op_end.col += bytelen;
-		    }
-		}
-		else
-		{
-		    ++col;
-		    if (yanklen)
-		    {
-			++curwin->w_cursor.col;
-			++curbuf->b_op_end.col;
-		    }
-		}
-	    }
-	    curbuf->b_op_start = curwin->w_cursor;
-	}
-	/*
-	 * Line mode: BACKWARD is the same as FORWARD on the previous line
-	 */
-	else if (dir == BACKWARD)
-	    --lnum;
-	new_cursor = curwin->w_cursor;
-
-	/*
-	 * simple case: insert into current line
-	 */
-	if (y_type == MCHAR && y_size == 1)
-	{
-	    linenr_T end_lnum = 0; /* init for gcc */
-
-	    if (VIsual_active)
-	    {
-		end_lnum = curbuf->b_visual.vi_end.lnum;
-		if (end_lnum < curbuf->b_visual.vi_start.lnum)
-		    end_lnum = curbuf->b_visual.vi_start.lnum;
-	    }
-
-	    do {
-		totlen = count * yanklen;
-		if (totlen > 0)
-		{
-		    oldp = ml_get(lnum);
-		    if (VIsual_active && col > (int)STRLEN(oldp))
-		    {
-			lnum++;
-			continue;
-		    }
-		    newp = alloc(STRLEN(oldp) + totlen + 1);
-		    if (newp == NULL)
-			goto end;	/* alloc() gave an error message */
-		    mch_memmove(newp, oldp, (size_t)col);
-		    ptr = newp + col;
-		    for (i = 0; i < count; ++i)
-		    {
-			mch_memmove(ptr, y_array[0], (size_t)yanklen);
-			ptr += yanklen;
-		    }
-		    STRMOVE(ptr, oldp + col);
-		    ml_replace(lnum, newp, FALSE);
-		    /* Place cursor on last putted char. */
-		    if (lnum == curwin->w_cursor.lnum)
-		    {
-			/* make sure curwin->w_virtcol is updated */
-			changed_cline_bef_curs();
-			curwin->w_cursor.col += (colnr_T)(totlen - 1);
-		    }
-		}
-		if (VIsual_active)
-		    lnum++;
-	    } while (VIsual_active && lnum <= end_lnum);
-
-	    if (VIsual_active) /* reset lnum to the last visual line */
-		lnum--;
-
-	    curbuf->b_op_end = curwin->w_cursor;
-	    /* For "CTRL-O p" in Insert mode, put cursor after last char */
-	    if (totlen && (restart_edit != 0 || (flags & PUT_CURSEND)))
-		++curwin->w_cursor.col;
-	    changed_bytes(lnum, col);
-	}
-	else
-	{
-	    /*
-	     * Insert at least one line.  When y_type is MCHAR, break the first
-	     * line in two.
-	     */
-	    for (cnt = 1; cnt <= count; ++cnt)
-	    {
-		i = 0;
-		if (y_type == MCHAR)
-		{
-		    /*
-		     * Split the current line in two at the insert position.
-		     * First insert y_array[size - 1] in front of second line.
-		     * Then append y_array[0] to first line.
-		     */
-		    lnum = new_cursor.lnum;
-		    ptr = ml_get(lnum) + col;
-		    totlen = (int)STRLEN(y_array[y_size - 1]);
-		    newp = alloc(STRLEN(ptr) + totlen + 1);
-		    if (newp == NULL)
-			goto error;
-		    STRCPY(newp, y_array[y_size - 1]);
-		    STRCAT(newp, ptr);
-		    /* insert second line */
-		    ml_append(lnum, newp, (colnr_T)0, FALSE);
-		    vim_free(newp);
-
-		    oldp = ml_get(lnum);
-		    newp = alloc(col + yanklen + 1);
-		    if (newp == NULL)
-			goto error;
-					    /* copy first part of line */
-		    mch_memmove(newp, oldp, (size_t)col);
-					    /* append to first line */
-		    mch_memmove(newp + col, y_array[0], (size_t)(yanklen + 1));
-		    ml_replace(lnum, newp, FALSE);
-
-		    curwin->w_cursor.lnum = lnum;
-		    i = 1;
-		}
-
-		for (; i < y_size; ++i)
-		{
-		    if ((y_type != MCHAR || i < y_size - 1)
-			    && ml_append(lnum, y_array[i], (colnr_T)0, FALSE)
-								      == FAIL)
-			    goto error;
-		    lnum++;
-		    ++nr_lines;
-		    if (flags & PUT_FIXINDENT)
-		    {
-			old_pos = curwin->w_cursor;
-			curwin->w_cursor.lnum = lnum;
-			ptr = ml_get(lnum);
-			if (cnt == count && i == y_size - 1)
-			    lendiff = (int)STRLEN(ptr);
-#if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
-			if (*ptr == '#' && preprocs_left())
-			    indent = 0;     /* Leave # lines at start */
-			else
-#endif
-			     if (*ptr == NUL)
-			    indent = 0;     /* Ignore empty lines */
-			else if (first_indent)
-			{
-			    indent_diff = orig_indent - get_indent();
-			    indent = orig_indent;
-			    first_indent = FALSE;
-			}
-			else if ((indent = get_indent() + indent_diff) < 0)
-			    indent = 0;
-			(void)set_indent(indent, 0);
-			curwin->w_cursor = old_pos;
-			/* remember how many chars were removed */
-			if (cnt == count && i == y_size - 1)
-			    lendiff -= (int)STRLEN(ml_get(lnum));
-		    }
-		}
-	    }
-
-error:
-	    /* Adjust marks. */
-	    if (y_type == MLINE)
-	    {
-		curbuf->b_op_start.col = 0;
-		if (dir == FORWARD)
-		    curbuf->b_op_start.lnum++;
-	    }
-	    /* Skip mark_adjust when adding lines after the last one, there
-	     * can't be marks there. But still needed in diff mode. */
-	    if (curbuf->b_op_start.lnum + (y_type == MCHAR) - 1 + nr_lines
-						 < curbuf->b_ml.ml_line_count
-#ifdef FEAT_DIFF
-						 || curwin->w_p_diff
-#endif
-						 )
-		mark_adjust(curbuf->b_op_start.lnum + (y_type == MCHAR),
-					     (linenr_T)MAXLNUM, nr_lines, 0L);
-
-	    /* note changed text for displaying and folding */
-	    if (y_type == MCHAR)
-		changed_lines(curwin->w_cursor.lnum, col,
-					 curwin->w_cursor.lnum + 1, nr_lines);
-	    else
-		changed_lines(curbuf->b_op_start.lnum, 0,
-					   curbuf->b_op_start.lnum, nr_lines);
-
-	    /* put '] mark at last inserted character */
-	    curbuf->b_op_end.lnum = lnum;
-	    /* correct length for change in indent */
-	    col = (colnr_T)STRLEN(y_array[y_size - 1]) - lendiff;
-	    if (col > 1)
-		curbuf->b_op_end.col = col - 1;
-	    else
-		curbuf->b_op_end.col = 0;
-
-	    if (flags & PUT_CURSLINE)
-	    {
-		/* ":put": put cursor on last inserted line */
-		curwin->w_cursor.lnum = lnum;
-		beginline(BL_WHITE | BL_FIX);
-	    }
-	    else if (flags & PUT_CURSEND)
-	    {
-		/* put cursor after inserted text */
-		if (y_type == MLINE)
-		{
-		    if (lnum >= curbuf->b_ml.ml_line_count)
-			curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
-		    else
-			curwin->w_cursor.lnum = lnum + 1;
-		    curwin->w_cursor.col = 0;
-		}
-		else
-		{
-		    curwin->w_cursor.lnum = lnum;
-		    curwin->w_cursor.col = col;
-		}
-	    }
-	    else if (y_type == MLINE)
-	    {
-		/* put cursor on first non-blank in first inserted line */
-		curwin->w_cursor.col = 0;
-		if (dir == FORWARD)
-		    ++curwin->w_cursor.lnum;
-		beginline(BL_WHITE | BL_FIX);
-	    }
-	    else	/* put cursor on first inserted character */
-		curwin->w_cursor = new_cursor;
-	}
-    }
-
-    msgmore(nr_lines);
-    curwin->w_set_curswant = TRUE;
-
-end:
-    if (allocated)
-	vim_free(insert_string);
-    if (regname == '=')
-	vim_free(y_array);
-
-    VIsual_active = FALSE;
-
-    /* If the cursor is past the end of the line put it at the end. */
-    adjust_cursor_eol();
-}
-
-/*
  * When the cursor is on the NUL past the end of the line and it should not be
  * there move it left.
  */
@@ -4089,7 +1925,7 @@
 /*
  * Return TRUE if lines starting with '#' should be left aligned.
  */
-    static int
+    int
 preprocs_left(void)
 {
     return
@@ -4108,224 +1944,6 @@
 }
 #endif
 
-/*
- * Return the character name of the register with the given number.
- */
-    int
-get_register_name(int num)
-{
-    if (num == -1)
-	return '"';
-    else if (num < 10)
-	return num + '0';
-    else if (num == DELETION_REGISTER)
-	return '-';
-#ifdef FEAT_CLIPBOARD
-    else if (num == STAR_REGISTER)
-	return '*';
-    else if (num == PLUS_REGISTER)
-	return '+';
-#endif
-    else
-    {
-#ifdef EBCDIC
-	int i;
-
-	/* EBCDIC is really braindead ... */
-	i = 'a' + (num - 10);
-	if (i > 'i')
-	    i += 7;
-	if (i > 'r')
-	    i += 8;
-	return i;
-#else
-	return num + 'a' - 10;
-#endif
-    }
-}
-
-/*
- * ":dis" and ":registers": Display the contents of the yank registers.
- */
-    void
-ex_display(exarg_T *eap)
-{
-    int		i, n;
-    long	j;
-    char_u	*p;
-    yankreg_T	*yb;
-    int		name;
-    int		attr;
-    char_u	*arg = eap->arg;
-    int		clen;
-
-    if (arg != NULL && *arg == NUL)
-	arg = NULL;
-    attr = HL_ATTR(HLF_8);
-
-    /* Highlight title */
-    msg_puts_title(_("\n--- Registers ---"));
-    for (i = -1; i < NUM_REGISTERS && !got_int; ++i)
-    {
-	name = get_register_name(i);
-	if (arg != NULL && vim_strchr(arg, name) == NULL
-#ifdef ONE_CLIPBOARD
-	    /* Star register and plus register contain the same thing. */
-		&& (name != '*' || vim_strchr(arg, '+') == NULL)
-#endif
-		)
-	    continue;	    /* did not ask for this register */
-
-#ifdef FEAT_CLIPBOARD
-	/* Adjust register name for "unnamed" in 'clipboard'.
-	 * When it's a clipboard register, fill it with the current contents
-	 * of the clipboard.  */
-	adjust_clip_reg(&name);
-	(void)may_get_selection(name);
-#endif
-
-	if (i == -1)
-	{
-	    if (y_previous != NULL)
-		yb = y_previous;
-	    else
-		yb = &(y_regs[0]);
-	}
-	else
-	    yb = &(y_regs[i]);
-
-#ifdef FEAT_EVAL
-	if (name == MB_TOLOWER(redir_reg)
-		|| (redir_reg == '"' && yb == y_previous))
-	    continue;	    /* do not list register being written to, the
-			     * pointer can be freed */
-#endif
-
-	if (yb->y_array != NULL)
-	{
-	    msg_putchar('\n');
-	    msg_putchar('"');
-	    msg_putchar(name);
-	    msg_puts("   ");
-
-	    n = (int)Columns - 6;
-	    for (j = 0; j < yb->y_size && n > 1; ++j)
-	    {
-		if (j)
-		{
-		    msg_puts_attr("^J", attr);
-		    n -= 2;
-		}
-		for (p = yb->y_array[j]; *p && (n -= ptr2cells(p)) >= 0; ++p)
-		{
-		    clen = (*mb_ptr2len)(p);
-		    msg_outtrans_len(p, clen);
-		    p += clen - 1;
-		}
-	    }
-	    if (n > 1 && yb->y_type == MLINE)
-		msg_puts_attr("^J", attr);
-	    out_flush();		    /* show one line at a time */
-	}
-	ui_breakcheck();
-    }
-
-    /*
-     * display last inserted text
-     */
-    if ((p = get_last_insert()) != NULL
-		 && (arg == NULL || vim_strchr(arg, '.') != NULL) && !got_int)
-    {
-	msg_puts("\n\".   ");
-	dis_msg(p, TRUE);
-    }
-
-    /*
-     * display last command line
-     */
-    if (last_cmdline != NULL && (arg == NULL || vim_strchr(arg, ':') != NULL)
-								  && !got_int)
-    {
-	msg_puts("\n\":   ");
-	dis_msg(last_cmdline, FALSE);
-    }
-
-    /*
-     * display current file name
-     */
-    if (curbuf->b_fname != NULL
-	    && (arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int)
-    {
-	msg_puts("\n\"%   ");
-	dis_msg(curbuf->b_fname, FALSE);
-    }
-
-    /*
-     * display alternate file name
-     */
-    if ((arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int)
-    {
-	char_u	    *fname;
-	linenr_T    dummy;
-
-	if (buflist_name_nr(0, &fname, &dummy) != FAIL)
-	{
-	    msg_puts("\n\"#   ");
-	    dis_msg(fname, FALSE);
-	}
-    }
-
-    /*
-     * display last search pattern
-     */
-    if (last_search_pat() != NULL
-		 && (arg == NULL || vim_strchr(arg, '/') != NULL) && !got_int)
-    {
-	msg_puts("\n\"/   ");
-	dis_msg(last_search_pat(), FALSE);
-    }
-
-#ifdef FEAT_EVAL
-    /*
-     * display last used expression
-     */
-    if (expr_line != NULL && (arg == NULL || vim_strchr(arg, '=') != NULL)
-								  && !got_int)
-    {
-	msg_puts("\n\"=   ");
-	dis_msg(expr_line, FALSE);
-    }
-#endif
-}
-
-/*
- * display a string for do_dis()
- * truncate at end of screen line
- */
-    static void
-dis_msg(
-    char_u	*p,
-    int		skip_esc)	    /* if TRUE, ignore trailing ESC */
-{
-    int		n;
-    int		l;
-
-    n = (int)Columns - 6;
-    while (*p != NUL
-	    && !(*p == ESC && skip_esc && *(p + 1) == NUL)
-	    && (n -= ptr2cells(p)) >= 0)
-    {
-	if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
-	{
-	    msg_outtrans_len(p, l);
-	    p += l;
-	}
-	else
-	    msg_outtrans_len(p++, 1);
-    }
-    ui_breakcheck();
-}
-
 #if defined(FEAT_COMMENTS) || defined(PROTO)
 /*
  * If "process" is TRUE and the line begins with a comment leader (possibly
@@ -5286,7 +2904,7 @@
  * - start/endspaces is the number of columns of the first/last yanked char
  *   that are to be yanked.
  */
-    static void
+    void
 block_prep(
     oparg_T		*oap,
     struct block_def	*bdp,
@@ -6066,715 +3684,8 @@
     vim_free(str);
 }
 #endif
-
-    void
-clip_free_selection(Clipboard_T *cbd)
-{
-    yankreg_T *y_ptr = y_current;
-
-    if (cbd == &clip_plus)
-	y_current = &y_regs[PLUS_REGISTER];
-    else
-	y_current = &y_regs[STAR_REGISTER];
-    free_yank_all();
-    y_current->y_size = 0;
-    y_current = y_ptr;
-}
-
-/*
- * Get the selected text and put it in register '*' or '+'.
- */
-    void
-clip_get_selection(Clipboard_T *cbd)
-{
-    yankreg_T	*old_y_previous, *old_y_current;
-    pos_T	old_cursor;
-    pos_T	old_visual;
-    int		old_visual_mode;
-    colnr_T	old_curswant;
-    int		old_set_curswant;
-    pos_T	old_op_start, old_op_end;
-    oparg_T	oa;
-    cmdarg_T	ca;
-
-    if (cbd->owned)
-    {
-	if ((cbd == &clip_plus && y_regs[PLUS_REGISTER].y_array != NULL)
-		|| (cbd == &clip_star && y_regs[STAR_REGISTER].y_array != NULL))
-	    return;
-
-	/* Get the text between clip_star.start & clip_star.end */
-	old_y_previous = y_previous;
-	old_y_current = y_current;
-	old_cursor = curwin->w_cursor;
-	old_curswant = curwin->w_curswant;
-	old_set_curswant = curwin->w_set_curswant;
-	old_op_start = curbuf->b_op_start;
-	old_op_end = curbuf->b_op_end;
-	old_visual = VIsual;
-	old_visual_mode = VIsual_mode;
-	clear_oparg(&oa);
-	oa.regname = (cbd == &clip_plus ? '+' : '*');
-	oa.op_type = OP_YANK;
-	vim_memset(&ca, 0, sizeof(ca));
-	ca.oap = &oa;
-	ca.cmdchar = 'y';
-	ca.count1 = 1;
-	ca.retval = CA_NO_ADJ_OP_END;
-	do_pending_operator(&ca, 0, TRUE);
-	y_previous = old_y_previous;
-	y_current = old_y_current;
-	curwin->w_cursor = old_cursor;
-	changed_cline_bef_curs();   /* need to update w_virtcol et al */
-	curwin->w_curswant = old_curswant;
-	curwin->w_set_curswant = old_set_curswant;
-	curbuf->b_op_start = old_op_start;
-	curbuf->b_op_end = old_op_end;
-	VIsual = old_visual;
-	VIsual_mode = old_visual_mode;
-    }
-    else if (!is_clipboard_needs_update())
-    {
-	clip_free_selection(cbd);
-
-	/* Try to get selected text from another window */
-	clip_gen_request_selection(cbd);
-    }
-}
-
-/*
- * Convert from the GUI selection string into the '*'/'+' register.
- */
-    void
-clip_yank_selection(
-    int		type,
-    char_u	*str,
-    long	len,
-    Clipboard_T *cbd)
-{
-    yankreg_T *y_ptr;
-
-    if (cbd == &clip_plus)
-	y_ptr = &y_regs[PLUS_REGISTER];
-    else
-	y_ptr = &y_regs[STAR_REGISTER];
-
-    clip_free_selection(cbd);
-
-    str_to_reg(y_ptr, type, str, len, 0L, FALSE);
-}
-
-/*
- * Convert the '*'/'+' register into a GUI selection string returned in *str
- * with length *len.
- * Returns the motion type, or -1 for failure.
- */
-    int
-clip_convert_selection(char_u **str, long_u *len, Clipboard_T *cbd)
-{
-    char_u	*p;
-    int		lnum;
-    int		i, j;
-    int_u	eolsize;
-    yankreg_T	*y_ptr;
-
-    if (cbd == &clip_plus)
-	y_ptr = &y_regs[PLUS_REGISTER];
-    else
-	y_ptr = &y_regs[STAR_REGISTER];
-
-#ifdef USE_CRNL
-    eolsize = 2;
-#else
-    eolsize = 1;
-#endif
-
-    *str = NULL;
-    *len = 0;
-    if (y_ptr->y_array == NULL)
-	return -1;
-
-    for (i = 0; i < y_ptr->y_size; i++)
-	*len += (long_u)STRLEN(y_ptr->y_array[i]) + eolsize;
-
-    /*
-     * Don't want newline character at end of last line if we're in MCHAR mode.
-     */
-    if (y_ptr->y_type == MCHAR && *len >= eolsize)
-	*len -= eolsize;
-
-    p = *str = alloc(*len + 1);	// add one to avoid zero
-    if (p == NULL)
-	return -1;
-    lnum = 0;
-    for (i = 0, j = 0; i < (int)*len; i++, j++)
-    {
-	if (y_ptr->y_array[lnum][j] == '\n')
-	    p[i] = NUL;
-	else if (y_ptr->y_array[lnum][j] == NUL)
-	{
-#ifdef USE_CRNL
-	    p[i++] = '\r';
-#endif
-	    p[i] = '\n';
-	    lnum++;
-	    j = -1;
-	}
-	else
-	    p[i] = y_ptr->y_array[lnum][j];
-    }
-    return y_ptr->y_type;
-}
-
-
-/*
- * If we have written to a clipboard register, send the text to the clipboard.
- */
-    static void
-may_set_selection(void)
-{
-    if (y_current == &(y_regs[STAR_REGISTER]) && clip_star.available)
-    {
-	clip_own_selection(&clip_star);
-	clip_gen_set_selection(&clip_star);
-    }
-    else if (y_current == &(y_regs[PLUS_REGISTER]) && clip_plus.available)
-    {
-	clip_own_selection(&clip_plus);
-	clip_gen_set_selection(&clip_plus);
-    }
-}
-
 #endif /* FEAT_CLIPBOARD || PROTO */
 
-
-#if defined(FEAT_DND) || defined(PROTO)
-/*
- * Replace the contents of the '~' register with str.
- */
-    void
-dnd_yank_drag_data(char_u *str, long len)
-{
-    yankreg_T *curr;
-
-    curr = y_current;
-    y_current = &y_regs[TILDE_REGISTER];
-    free_yank_all();
-    str_to_reg(y_current, MCHAR, str, len, 0L, FALSE);
-    y_current = curr;
-}
-#endif
-
-
-#if defined(FEAT_EVAL) || defined(PROTO)
-/*
- * Return the type of a register.
- * Used for getregtype()
- * Returns MAUTO for error.
- */
-    char_u
-get_reg_type(int regname, long *reglen)
-{
-    switch (regname)
-    {
-	case '%':		/* file name */
-	case '#':		/* alternate file name */
-	case '=':		/* expression */
-	case ':':		/* last command line */
-	case '/':		/* last search-pattern */
-	case '.':		/* last inserted text */
-#ifdef FEAT_SEARCHPATH
-	case Ctrl_F:		/* Filename under cursor */
-	case Ctrl_P:		/* Path under cursor, expand via "path" */
-#endif
-	case Ctrl_W:		/* word under cursor */
-	case Ctrl_A:		/* WORD (mnemonic All) under cursor */
-	case '_':		/* black hole: always empty */
-	    return MCHAR;
-    }
-
-#ifdef FEAT_CLIPBOARD
-    regname = may_get_selection(regname);
-#endif
-
-    if (regname != NUL && !valid_yank_reg(regname, FALSE))
-	return MAUTO;
-
-    get_yank_register(regname, FALSE);
-
-    if (y_current->y_array != NULL)
-    {
-	if (reglen != NULL && y_current->y_type == MBLOCK)
-	    *reglen = y_current->y_width;
-	return y_current->y_type;
-    }
-    return MAUTO;
-}
-
-/*
- * When "flags" has GREG_LIST return a list with text "s".
- * Otherwise just return "s".
- */
-    static char_u *
-getreg_wrap_one_line(char_u *s, int flags)
-{
-    if (flags & GREG_LIST)
-    {
-	list_T *list = list_alloc();
-
-	if (list != NULL)
-	{
-	    if (list_append_string(list, NULL, -1) == FAIL)
-	    {
-		list_free(list);
-		return NULL;
-	    }
-	    list->lv_first->li_tv.vval.v_string = s;
-	}
-	return (char_u *)list;
-    }
-    return s;
-}
-
-/*
- * Return the contents of a register as a single allocated string.
- * Used for "@r" in expressions and for getreg().
- * Returns NULL for error.
- * Flags:
- *	GREG_NO_EXPR	Do not allow expression register
- *	GREG_EXPR_SRC	For the expression register: return expression itself,
- *			not the result of its evaluation.
- *	GREG_LIST	Return a list of lines in place of a single string.
- */
-    char_u *
-get_reg_contents(int regname, int flags)
-{
-    long	i;
-    char_u	*retval;
-    int		allocated;
-    long	len;
-
-    /* Don't allow using an expression register inside an expression */
-    if (regname == '=')
-    {
-	if (flags & GREG_NO_EXPR)
-	    return NULL;
-	if (flags & GREG_EXPR_SRC)
-	    return getreg_wrap_one_line(get_expr_line_src(), flags);
-	return getreg_wrap_one_line(get_expr_line(), flags);
-    }
-
-    if (regname == '@')	    /* "@@" is used for unnamed register */
-	regname = '"';
-
-    /* check for valid regname */
-    if (regname != NUL && !valid_yank_reg(regname, FALSE))
-	return NULL;
-
-#ifdef FEAT_CLIPBOARD
-    regname = may_get_selection(regname);
-#endif
-
-    if (get_spec_reg(regname, &retval, &allocated, FALSE))
-    {
-	if (retval == NULL)
-	    return NULL;
-	if (allocated)
-	    return getreg_wrap_one_line(retval, flags);
-	return getreg_wrap_one_line(vim_strsave(retval), flags);
-    }
-
-    get_yank_register(regname, FALSE);
-    if (y_current->y_array == NULL)
-	return NULL;
-
-    if (flags & GREG_LIST)
-    {
-	list_T	*list = list_alloc();
-	int	error = FALSE;
-
-	if (list == NULL)
-	    return NULL;
-	for (i = 0; i < y_current->y_size; ++i)
-	    if (list_append_string(list, y_current->y_array[i], -1) == FAIL)
-		error = TRUE;
-	if (error)
-	{
-	    list_free(list);
-	    return NULL;
-	}
-	return (char_u *)list;
-    }
-
-    /*
-     * Compute length of resulting string.
-     */
-    len = 0;
-    for (i = 0; i < y_current->y_size; ++i)
-    {
-	len += (long)STRLEN(y_current->y_array[i]);
-	/*
-	 * Insert a newline between lines and after last line if
-	 * y_type is MLINE.
-	 */
-	if (y_current->y_type == MLINE || i < y_current->y_size - 1)
-	    ++len;
-    }
-
-    retval = alloc(len + 1);
-
-    /*
-     * Copy the lines of the yank register into the string.
-     */
-    if (retval != NULL)
-    {
-	len = 0;
-	for (i = 0; i < y_current->y_size; ++i)
-	{
-	    STRCPY(retval + len, y_current->y_array[i]);
-	    len += (long)STRLEN(retval + len);
-
-	    /*
-	     * Insert a NL between lines and after the last line if y_type is
-	     * MLINE.
-	     */
-	    if (y_current->y_type == MLINE || i < y_current->y_size - 1)
-		retval[len++] = '\n';
-	}
-	retval[len] = NUL;
-    }
-
-    return retval;
-}
-
-    static int
-init_write_reg(
-    int		name,
-    yankreg_T	**old_y_previous,
-    yankreg_T	**old_y_current,
-    int		must_append,
-    int		*yank_type UNUSED)
-{
-    if (!valid_yank_reg(name, TRUE))	    /* check for valid reg name */
-    {
-	emsg_invreg(name);
-	return FAIL;
-    }
-
-    /* Don't want to change the current (unnamed) register */
-    *old_y_previous = y_previous;
-    *old_y_current = y_current;
-
-    get_yank_register(name, TRUE);
-    if (!y_append && !must_append)
-	free_yank_all();
-    return OK;
-}
-
-    static void
-finish_write_reg(
-    int		name,
-    yankreg_T	*old_y_previous,
-    yankreg_T	*old_y_current)
-{
-# ifdef FEAT_CLIPBOARD
-    /* Send text of clipboard register to the clipboard. */
-    may_set_selection();
-# endif
-
-    /* ':let @" = "val"' should change the meaning of the "" register */
-    if (name != '"')
-	y_previous = old_y_previous;
-    y_current = old_y_current;
-}
-
-/*
- * Store string "str" in register "name".
- * "maxlen" is the maximum number of bytes to use, -1 for all bytes.
- * If "must_append" is TRUE, always append to the register.  Otherwise append
- * if "name" is an uppercase letter.
- * Note: "maxlen" and "must_append" don't work for the "/" register.
- * Careful: 'str' is modified, you may have to use a copy!
- * If "str" ends in '\n' or '\r', use linewise, otherwise use characterwise.
- */
-    void
-write_reg_contents(
-    int		name,
-    char_u	*str,
-    int		maxlen,
-    int		must_append)
-{
-    write_reg_contents_ex(name, str, maxlen, must_append, MAUTO, 0L);
-}
-
-    void
-write_reg_contents_lst(
-    int		name,
-    char_u	**strings,
-    int		maxlen UNUSED,
-    int		must_append,
-    int		yank_type,
-    long	block_len)
-{
-    yankreg_T  *old_y_previous, *old_y_current;
-
-    if (name == '/'
-#ifdef FEAT_EVAL
-	    || name == '='
-#endif
-	    )
-    {
-	char_u	*s;
-
-	if (strings[0] == NULL)
-	    s = (char_u *)"";
-	else if (strings[1] != NULL)
-	{
-	    emsg(_("E883: search pattern and expression register may not "
-			"contain two or more lines"));
-	    return;
-	}
-	else
-	    s = strings[0];
-	write_reg_contents_ex(name, s, -1, must_append, yank_type, block_len);
-	return;
-    }
-
-    if (name == '_')	    /* black hole: nothing to do */
-	return;
-
-    if (init_write_reg(name, &old_y_previous, &old_y_current, must_append,
-		&yank_type) == FAIL)
-	return;
-
-    str_to_reg(y_current, yank_type, (char_u *) strings, -1, block_len, TRUE);
-
-    finish_write_reg(name, old_y_previous, old_y_current);
-}
-
-    void
-write_reg_contents_ex(
-    int		name,
-    char_u	*str,
-    int		maxlen,
-    int		must_append,
-    int		yank_type,
-    long	block_len)
-{
-    yankreg_T	*old_y_previous, *old_y_current;
-    long	len;
-
-    if (maxlen >= 0)
-	len = maxlen;
-    else
-	len = (long)STRLEN(str);
-
-    /* Special case: '/' search pattern */
-    if (name == '/')
-    {
-	set_last_search_pat(str, RE_SEARCH, TRUE, TRUE);
-	return;
-    }
-
-    if (name == '#')
-    {
-	buf_T	*buf;
-
-	if (VIM_ISDIGIT(*str))
-	{
-	    int	num = atoi((char *)str);
-
-	    buf = buflist_findnr(num);
-	    if (buf == NULL)
-		semsg(_(e_nobufnr), (long)num);
-	}
-	else
-	    buf = buflist_findnr(buflist_findpat(str, str + STRLEN(str),
-							 TRUE, FALSE, FALSE));
-	if (buf == NULL)
-	    return;
-	curwin->w_alt_fnum = buf->b_fnum;
-	return;
-    }
-
-#ifdef FEAT_EVAL
-    if (name == '=')
-    {
-	char_u	    *p, *s;
-
-	p = vim_strnsave(str, (int)len);
-	if (p == NULL)
-	    return;
-	if (must_append)
-	{
-	    s = concat_str(get_expr_line_src(), p);
-	    vim_free(p);
-	    p = s;
-	}
-	set_expr_line(p);
-	return;
-    }
-#endif
-
-    if (name == '_')	    /* black hole: nothing to do */
-	return;
-
-    if (init_write_reg(name, &old_y_previous, &old_y_current, must_append,
-		&yank_type) == FAIL)
-	return;
-
-    str_to_reg(y_current, yank_type, str, len, block_len, FALSE);
-
-    finish_write_reg(name, old_y_previous, old_y_current);
-}
-#endif	/* FEAT_EVAL */
-
-#if defined(FEAT_CLIPBOARD) || defined(FEAT_EVAL)
-/*
- * Put a string into a register.  When the register is not empty, the string
- * is appended.
- */
-    static void
-str_to_reg(
-    yankreg_T	*y_ptr,		/* pointer to yank register */
-    int		yank_type,	/* MCHAR, MLINE, MBLOCK, MAUTO */
-    char_u	*str,		/* string to put in register */
-    long	len,		/* length of string */
-    long	blocklen,	/* width of Visual block */
-    int		str_list)	/* TRUE if str is char_u ** */
-{
-    int		type;			/* MCHAR, MLINE or MBLOCK */
-    int		lnum;
-    long	start;
-    long	i;
-    int		extra;
-    int		newlines;		/* number of lines added */
-    int		extraline = 0;		/* extra line at the end */
-    int		append = FALSE;		/* append to last line in register */
-    char_u	*s;
-    char_u	**ss;
-    char_u	**pp;
-    long	maxlen;
-
-    if (y_ptr->y_array == NULL)		/* NULL means empty register */
-	y_ptr->y_size = 0;
-
-    if (yank_type == MAUTO)
-	type = ((str_list || (len > 0 && (str[len - 1] == NL
-					    || str[len - 1] == CAR)))
-							     ? MLINE : MCHAR);
-    else
-	type = yank_type;
-
-    /*
-     * Count the number of lines within the string
-     */
-    newlines = 0;
-    if (str_list)
-    {
-	for (ss = (char_u **) str; *ss != NULL; ++ss)
-	    ++newlines;
-    }
-    else
-    {
-	for (i = 0; i < len; i++)
-	    if (str[i] == '\n')
-		++newlines;
-	if (type == MCHAR || len == 0 || str[len - 1] != '\n')
-	{
-	    extraline = 1;
-	    ++newlines;	/* count extra newline at the end */
-	}
-	if (y_ptr->y_size > 0 && y_ptr->y_type == MCHAR)
-	{
-	    append = TRUE;
-	    --newlines;	/* uncount newline when appending first line */
-	}
-    }
-
-    /* Without any lines make the register empty. */
-    if (y_ptr->y_size + newlines == 0)
-    {
-	VIM_CLEAR(y_ptr->y_array);
-	return;
-    }
-
-    /*
-     * Allocate an array to hold the pointers to the new register lines.
-     * If the register was not empty, move the existing lines to the new array.
-     */
-    pp = lalloc_clear((y_ptr->y_size + newlines) * sizeof(char_u *), TRUE);
-    if (pp == NULL)	/* out of memory */
-	return;
-    for (lnum = 0; lnum < y_ptr->y_size; ++lnum)
-	pp[lnum] = y_ptr->y_array[lnum];
-    vim_free(y_ptr->y_array);
-    y_ptr->y_array = pp;
-    maxlen = 0;
-
-    /*
-     * Find the end of each line and save it into the array.
-     */
-    if (str_list)
-    {
-	for (ss = (char_u **) str; *ss != NULL; ++ss, ++lnum)
-	{
-	    i = (long)STRLEN(*ss);
-	    pp[lnum] = vim_strnsave(*ss, i);
-	    if (i > maxlen)
-		maxlen = i;
-	}
-    }
-    else
-    {
-	for (start = 0; start < len + extraline; start += i + 1)
-	{
-	    for (i = start; i < len; ++i)	/* find the end of the line */
-		if (str[i] == '\n')
-		    break;
-	    i -= start;			/* i is now length of line */
-	    if (i > maxlen)
-		maxlen = i;
-	    if (append)
-	    {
-		--lnum;
-		extra = (int)STRLEN(y_ptr->y_array[lnum]);
-	    }
-	    else
-		extra = 0;
-	    s = alloc(i + extra + 1);
-	    if (s == NULL)
-		break;
-	    if (extra)
-		mch_memmove(s, y_ptr->y_array[lnum], (size_t)extra);
-	    if (append)
-		vim_free(y_ptr->y_array[lnum]);
-	    if (i)
-		mch_memmove(s + extra, str + start, (size_t)i);
-	    extra += i;
-	    s[extra] = NUL;
-	    y_ptr->y_array[lnum++] = s;
-	    while (--extra >= 0)
-	    {
-		if (*s == NUL)
-		    *s = '\n';	    /* replace NUL with newline */
-		++s;
-	    }
-	    append = FALSE;		    /* only first line is appended */
-	}
-    }
-    y_ptr->y_type = type;
-    y_ptr->y_size = lnum;
-    if (type == MBLOCK)
-	y_ptr->y_width = (blocklen < 0 ? maxlen - 1 : blocklen);
-    else
-	y_ptr->y_width = 0;
-#ifdef FEAT_VIMINFO
-    y_ptr->y_time_set = vim_time();
-#endif
-}
-#endif /* FEAT_CLIPBOARD || FEAT_EVAL || PROTO */
-
     void
 clear_oparg(oparg_T *oap)
 {
diff --git a/src/proto.h b/src/proto.h
index 0081ad0..ae4c63a 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -188,6 +188,7 @@
 # endif
 # include "quickfix.pro"
 # include "regexp.pro"
+# include "register.pro"
 # include "scriptfile.pro"
 # include "screen.pro"
 # include "session.pro"
diff --git a/src/proto/ops.pro b/src/proto/ops.pro
index 8bd82aa..d8e8ad5 100644
--- a/src/proto/ops.pro
+++ b/src/proto/ops.pro
@@ -1,8 +1,4 @@
 /* ops.c */
-yankreg_T *get_y_regs(void);
-yankreg_T *get_y_current(void);
-yankreg_T *get_y_previous(void);
-void set_y_previous(yankreg_T *yreg);
 int get_op_type(int char1, int char2);
 int op_on_lines(int op);
 int op_is_change(int op);
@@ -11,38 +7,15 @@
 void op_shift(oparg_T *oap, int curs_top, int amount);
 void shift_line(int left, int round, int amount, int call_changed_bytes);
 void op_reindent(oparg_T *oap, int (*how)(void));
-int get_expr_register(void);
-void set_expr_line(char_u *new_line);
-char_u *get_expr_line(void);
-int valid_yank_reg(int regname, int writing);
-int get_yank_register(int regname, int writing);
-int may_get_selection(int regname);
-void *get_register(int name, int copy);
-void put_register(int name, void *reg);
-void free_register(void *reg);
-int yank_register_mline(int regname);
-int do_record(int c);
-int get_execreg_lastc(void);
-void set_execreg_lastc(int lastc);
-int do_execreg(int regname, int colon, int addcr, int silent);
-int insert_reg(int regname, int literally_arg);
-int get_spec_reg(int regname, char_u **argp, int *allocated, int errmsg);
-int cmdline_paste_reg(int regname, int literally_arg, int remcr);
-void adjust_clip_reg(int *rp);
-void shift_delete_registers(void);
+void stuffescaped(char_u *arg, int literally);
 int op_delete(oparg_T *oap);
 int op_replace(oparg_T *oap, int c);
 void op_tilde(oparg_T *oap);
 int swapchar(int op_type, pos_T *pos);
 void op_insert(oparg_T *oap, long count1);
 int op_change(oparg_T *oap);
-void init_yank(void);
-void clear_registers(void);
-int op_yank(oparg_T *oap, int deleting, int mess);
-void do_put(int regname, int dir, long count, int flags);
 void adjust_cursor_eol(void);
-int get_register_name(int num);
-void ex_display(exarg_T *eap);
+int preprocs_left(void);
 char_u *skip_comment(char_u *line, int process, int include_space, int *is_comment);
 int do_join(long count, int insert_space, int save_undo, int use_formatoptions, int setmark);
 void op_format(oparg_T *oap, int keep_cursor);
@@ -50,18 +23,9 @@
 int fex_format(linenr_T lnum, long count, int c);
 void format_lines(linenr_T line_count, int avoid_fex);
 int paragraph_start(linenr_T lnum);
+void block_prep(oparg_T *oap, struct block_def *bdp, linenr_T lnum, int is_del);
 void op_addsub(oparg_T *oap, linenr_T Prenum1, int g_cmd);
 void x11_export_final_selection(void);
-void clip_free_selection(Clipboard_T *cbd);
-void clip_get_selection(Clipboard_T *cbd);
-void clip_yank_selection(int type, char_u *str, long len, Clipboard_T *cbd);
-int clip_convert_selection(char_u **str, long_u *len, Clipboard_T *cbd);
-void dnd_yank_drag_data(char_u *str, long len);
-char_u get_reg_type(int regname, long *reglen);
-char_u *get_reg_contents(int regname, int flags);
-void write_reg_contents(int name, char_u *str, int maxlen, int must_append);
-void write_reg_contents_lst(int name, char_u **strings, int maxlen, int must_append, int yank_type, long block_len);
-void write_reg_contents_ex(int name, char_u *str, int maxlen, int must_append, int yank_type, long block_len);
 void clear_oparg(oparg_T *oap);
 void cursor_pos_info(dict_T *dict);
 /* vim: set ft=c : */
diff --git a/src/proto/register.pro b/src/proto/register.pro
new file mode 100644
index 0000000..743e4d6
--- /dev/null
+++ b/src/proto/register.pro
@@ -0,0 +1,42 @@
+/* register.c */
+yankreg_T *get_y_regs(void);
+yankreg_T *get_y_current(void);
+yankreg_T *get_y_previous(void);
+void set_y_previous(yankreg_T *yreg);
+int get_expr_register(void);
+void set_expr_line(char_u *new_line);
+char_u *get_expr_line(void);
+int valid_yank_reg(int regname, int writing);
+int get_yank_register(int regname, int writing);
+int may_get_selection(int regname);
+void *get_register(int name, int copy);
+void put_register(int name, void *reg);
+void free_register(void *reg);
+int yank_register_mline(int regname);
+int do_record(int c);
+int get_execreg_lastc(void);
+void set_execreg_lastc(int lastc);
+int do_execreg(int regname, int colon, int addcr, int silent);
+int insert_reg(int regname, int literally_arg);
+int get_spec_reg(int regname, char_u **argp, int *allocated, int errmsg);
+int cmdline_paste_reg(int regname, int literally_arg, int remcr);
+void adjust_clip_reg(int *rp);
+void shift_delete_registers(void);
+void yank_do_autocmd(oparg_T *oap, yankreg_T *reg);
+void init_yank(void);
+void clear_registers(void);
+int op_yank(oparg_T *oap, int deleting, int mess);
+void do_put(int regname, int dir, long count, int flags);
+int get_register_name(int num);
+void ex_display(exarg_T *eap);
+void clip_free_selection(Clipboard_T *cbd);
+void clip_get_selection(Clipboard_T *cbd);
+void clip_yank_selection(int type, char_u *str, long len, Clipboard_T *cbd);
+int clip_convert_selection(char_u **str, long_u *len, Clipboard_T *cbd);
+void dnd_yank_drag_data(char_u *str, long len);
+char_u get_reg_type(int regname, long *reglen);
+char_u *get_reg_contents(int regname, int flags);
+void write_reg_contents(int name, char_u *str, int maxlen, int must_append);
+void write_reg_contents_lst(int name, char_u **strings, int maxlen, int must_append, int yank_type, long block_len);
+void write_reg_contents_ex(int name, char_u *str, int maxlen, int must_append, int yank_type, long block_len);
+/* vim: set ft=c : */
diff --git a/src/register.c b/src/register.c
new file mode 100644
index 0000000..eb40bba
--- /dev/null
+++ b/src/register.c
@@ -0,0 +1,3007 @@
+/* vi:set ts=8 sts=4 sw=4 noet:
+ *
+ * VIM - Vi IMproved	by Bram Moolenaar
+ *
+ * Do ":help uganda"  in Vim to read copying and usage conditions.
+ * Do ":help credits" in Vim to see a list of people who contributed.
+ * See README.txt for an overview of the Vim source code.
+ */
+
+/*
+ * register.c: functions for managing registers
+ */
+
+#include "vim.h"
+
+/*
+ * Registers:
+ *	0 = unnamed register, for normal yanks and puts
+ *   1..9 = registers '1' to '9', for deletes
+ * 10..35 = registers 'a' to 'z' ('A' to 'Z' for appending)
+ *     36 = delete register '-'
+ *     37 = Selection register '*'. Only if FEAT_CLIPBOARD defined
+ *     38 = Clipboard register '+'. Only if FEAT_CLIPBOARD and FEAT_X11 defined
+ */
+static yankreg_T	y_regs[NUM_REGISTERS];
+
+static yankreg_T	*y_current;	    // ptr to current yankreg
+static int		y_append;	    // TRUE when appending
+static yankreg_T	*y_previous = NULL; // ptr to last written yankreg
+
+static int	stuff_yank(int, char_u *);
+static void	put_reedit_in_typebuf(int silent);
+static int	put_in_typebuf(char_u *s, int esc, int colon,
+								 int silent);
+static void	free_yank_all(void);
+static int	yank_copy_line(struct block_def *bd, long y_idx);
+#ifdef FEAT_CLIPBOARD
+static void	copy_yank_reg(yankreg_T *reg);
+static void	may_set_selection(void);
+#endif
+static void	dis_msg(char_u *p, int skip_esc);
+#if defined(FEAT_CLIPBOARD) || defined(FEAT_EVAL)
+static void	str_to_reg(yankreg_T *y_ptr, int yank_type, char_u *str, long len, long blocklen, int str_list);
+#endif
+
+    yankreg_T *
+get_y_regs(void)
+{
+    return y_regs;
+}
+
+    yankreg_T *
+get_y_current(void)
+{
+    return y_current;
+}
+
+    yankreg_T *
+get_y_previous(void)
+{
+    return y_previous;
+}
+
+    void
+set_y_previous(yankreg_T *yreg)
+{
+    y_previous = yreg;
+}
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Keep the last expression line here, for repeating.
+ */
+static char_u	*expr_line = NULL;
+
+/*
+ * Get an expression for the "\"=expr1" or "CTRL-R =expr1"
+ * Returns '=' when OK, NUL otherwise.
+ */
+    int
+get_expr_register(void)
+{
+    char_u	*new_line;
+
+    new_line = getcmdline('=', 0L, 0, TRUE);
+    if (new_line == NULL)
+	return NUL;
+    if (*new_line == NUL)	// use previous line
+	vim_free(new_line);
+    else
+	set_expr_line(new_line);
+    return '=';
+}
+
+/*
+ * Set the expression for the '=' register.
+ * Argument must be an allocated string.
+ */
+    void
+set_expr_line(char_u *new_line)
+{
+    vim_free(expr_line);
+    expr_line = new_line;
+}
+
+/*
+ * Get the result of the '=' register expression.
+ * Returns a pointer to allocated memory, or NULL for failure.
+ */
+    char_u *
+get_expr_line(void)
+{
+    char_u	*expr_copy;
+    char_u	*rv;
+    static int	nested = 0;
+
+    if (expr_line == NULL)
+	return NULL;
+
+    // Make a copy of the expression, because evaluating it may cause it to be
+    // changed.
+    expr_copy = vim_strsave(expr_line);
+    if (expr_copy == NULL)
+	return NULL;
+
+    // When we are invoked recursively limit the evaluation to 10 levels.
+    // Then return the string as-is.
+    if (nested >= 10)
+	return expr_copy;
+
+    ++nested;
+    rv = eval_to_string(expr_copy, NULL, TRUE);
+    --nested;
+    vim_free(expr_copy);
+    return rv;
+}
+
+/*
+ * Get the '=' register expression itself, without evaluating it.
+ */
+    static char_u *
+get_expr_line_src(void)
+{
+    if (expr_line == NULL)
+	return NULL;
+    return vim_strsave(expr_line);
+}
+#endif // FEAT_EVAL
+
+/*
+ * Check if 'regname' is a valid name of a yank register.
+ * Note: There is no check for 0 (default register), caller should do this
+ */
+    int
+valid_yank_reg(
+    int	    regname,
+    int	    writing)	    // if TRUE check for writable registers
+{
+    if (       (regname > 0 && ASCII_ISALNUM(regname))
+	    || (!writing && vim_strchr((char_u *)
+#ifdef FEAT_EVAL
+				    "/.%:="
+#else
+				    "/.%:"
+#endif
+					, regname) != NULL)
+	    || regname == '#'
+	    || regname == '"'
+	    || regname == '-'
+	    || regname == '_'
+#ifdef FEAT_CLIPBOARD
+	    || regname == '*'
+	    || regname == '+'
+#endif
+#ifdef FEAT_DND
+	    || (!writing && regname == '~')
+#endif
+							)
+	return TRUE;
+    return FALSE;
+}
+
+/*
+ * Set y_current and y_append, according to the value of "regname".
+ * Cannot handle the '_' register.
+ * Must only be called with a valid register name!
+ *
+ * If regname is 0 and writing, use register 0
+ * If regname is 0 and reading, use previous register
+ *
+ * Return TRUE when the register should be inserted literally (selection or
+ * clipboard).
+ */
+    int
+get_yank_register(int regname, int writing)
+{
+    int	    i;
+    int	    ret = FALSE;
+
+    y_append = FALSE;
+    if ((regname == 0 || regname == '"') && !writing && y_previous != NULL)
+    {
+	y_current = y_previous;
+	return ret;
+    }
+    i = regname;
+    if (VIM_ISDIGIT(i))
+	i -= '0';
+    else if (ASCII_ISLOWER(i))
+	i = CharOrdLow(i) + 10;
+    else if (ASCII_ISUPPER(i))
+    {
+	i = CharOrdUp(i) + 10;
+	y_append = TRUE;
+    }
+    else if (regname == '-')
+	i = DELETION_REGISTER;
+#ifdef FEAT_CLIPBOARD
+    // When selection is not available, use register 0 instead of '*'
+    else if (clip_star.available && regname == '*')
+    {
+	i = STAR_REGISTER;
+	ret = TRUE;
+    }
+    // When clipboard is not available, use register 0 instead of '+'
+    else if (clip_plus.available && regname == '+')
+    {
+	i = PLUS_REGISTER;
+	ret = TRUE;
+    }
+#endif
+#ifdef FEAT_DND
+    else if (!writing && regname == '~')
+	i = TILDE_REGISTER;
+#endif
+    else		// not 0-9, a-z, A-Z or '-': use register 0
+	i = 0;
+    y_current = &(y_regs[i]);
+    if (writing)	// remember the register we write into for do_put()
+	y_previous = y_current;
+    return ret;
+}
+
+#if defined(FEAT_CLIPBOARD) || defined(PROTO)
+/*
+ * When "regname" is a clipboard register, obtain the selection.  If it's not
+ * available return zero, otherwise return "regname".
+ */
+    int
+may_get_selection(int regname)
+{
+    if (regname == '*')
+    {
+	if (!clip_star.available)
+	    regname = 0;
+	else
+	    clip_get_selection(&clip_star);
+    }
+    else if (regname == '+')
+    {
+	if (!clip_plus.available)
+	    regname = 0;
+	else
+	    clip_get_selection(&clip_plus);
+    }
+    return regname;
+}
+#endif
+
+/*
+ * Obtain the contents of a "normal" register. The register is made empty.
+ * The returned pointer has allocated memory, use put_register() later.
+ */
+    void *
+get_register(
+    int		name,
+    int		copy)	// make a copy, if FALSE make register empty.
+{
+    yankreg_T	*reg;
+    int		i;
+
+#ifdef FEAT_CLIPBOARD
+    // When Visual area changed, may have to update selection.  Obtain the
+    // selection too.
+    if (name == '*' && clip_star.available)
+    {
+	if (clip_isautosel_star())
+	    clip_update_selection(&clip_star);
+	may_get_selection(name);
+    }
+    if (name == '+' && clip_plus.available)
+    {
+	if (clip_isautosel_plus())
+	    clip_update_selection(&clip_plus);
+	may_get_selection(name);
+    }
+#endif
+
+    get_yank_register(name, 0);
+    reg = ALLOC_ONE(yankreg_T);
+    if (reg != NULL)
+    {
+	*reg = *y_current;
+	if (copy)
+	{
+	    // If we run out of memory some or all of the lines are empty.
+	    if (reg->y_size == 0)
+		reg->y_array = NULL;
+	    else
+		reg->y_array = ALLOC_MULT(char_u *, reg->y_size);
+	    if (reg->y_array != NULL)
+	    {
+		for (i = 0; i < reg->y_size; ++i)
+		    reg->y_array[i] = vim_strsave(y_current->y_array[i]);
+	    }
+	}
+	else
+	    y_current->y_array = NULL;
+    }
+    return (void *)reg;
+}
+
+/*
+ * Put "reg" into register "name".  Free any previous contents and "reg".
+ */
+    void
+put_register(int name, void *reg)
+{
+    get_yank_register(name, 0);
+    free_yank_all();
+    *y_current = *(yankreg_T *)reg;
+    vim_free(reg);
+
+#ifdef FEAT_CLIPBOARD
+    // Send text written to clipboard register to the clipboard.
+    may_set_selection();
+#endif
+}
+
+#if (defined(FEAT_CLIPBOARD) && defined(FEAT_X11) && defined(USE_SYSTEM)) \
+	|| defined(PROTO)
+    void
+free_register(void *reg)
+{
+    yankreg_T tmp;
+
+    tmp = *y_current;
+    *y_current = *(yankreg_T *)reg;
+    free_yank_all();
+    vim_free(reg);
+    *y_current = tmp;
+}
+#endif
+
+#if defined(FEAT_MOUSE) || defined(PROTO)
+/*
+ * return TRUE if the current yank register has type MLINE
+ */
+    int
+yank_register_mline(int regname)
+{
+    if (regname != 0 && !valid_yank_reg(regname, FALSE))
+	return FALSE;
+    if (regname == '_')		// black hole is always empty
+	return FALSE;
+    get_yank_register(regname, FALSE);
+    return (y_current->y_type == MLINE);
+}
+#endif
+
+/*
+ * Start or stop recording into a yank register.
+ *
+ * Return FAIL for failure, OK otherwise.
+ */
+    int
+do_record(int c)
+{
+    char_u	    *p;
+    static int	    regname;
+    yankreg_T	    *old_y_previous, *old_y_current;
+    int		    retval;
+
+    if (reg_recording == 0)	    // start recording
+    {
+	// registers 0-9, a-z and " are allowed
+	if (c < 0 || (!ASCII_ISALNUM(c) && c != '"'))
+	    retval = FAIL;
+	else
+	{
+	    reg_recording = c;
+	    showmode();
+	    regname = c;
+	    retval = OK;
+	}
+    }
+    else			    // stop recording
+    {
+	// Get the recorded key hits.  K_SPECIAL and CSI will be escaped, this
+	// needs to be removed again to put it in a register.  exec_reg then
+	// adds the escaping back later.
+	reg_recording = 0;
+	msg("");
+	p = get_recorded();
+	if (p == NULL)
+	    retval = FAIL;
+	else
+	{
+	    // Remove escaping for CSI and K_SPECIAL in multi-byte chars.
+	    vim_unescape_csi(p);
+
+	    // We don't want to change the default register here, so save and
+	    // restore the current register name.
+	    old_y_previous = y_previous;
+	    old_y_current = y_current;
+
+	    retval = stuff_yank(regname, p);
+
+	    y_previous = old_y_previous;
+	    y_current = old_y_current;
+	}
+    }
+    return retval;
+}
+
+/*
+ * Stuff string "p" into yank register "regname" as a single line (append if
+ * uppercase).	"p" must have been alloced.
+ *
+ * return FAIL for failure, OK otherwise
+ */
+    static int
+stuff_yank(int regname, char_u *p)
+{
+    char_u	*lp;
+    char_u	**pp;
+
+    // check for read-only register
+    if (regname != 0 && !valid_yank_reg(regname, TRUE))
+    {
+	vim_free(p);
+	return FAIL;
+    }
+    if (regname == '_')		    // black hole: don't do anything
+    {
+	vim_free(p);
+	return OK;
+    }
+    get_yank_register(regname, TRUE);
+    if (y_append && y_current->y_array != NULL)
+    {
+	pp = &(y_current->y_array[y_current->y_size - 1]);
+	lp = alloc(STRLEN(*pp) + STRLEN(p) + 1);
+	if (lp == NULL)
+	{
+	    vim_free(p);
+	    return FAIL;
+	}
+	STRCPY(lp, *pp);
+	STRCAT(lp, p);
+	vim_free(p);
+	vim_free(*pp);
+	*pp = lp;
+    }
+    else
+    {
+	free_yank_all();
+	if ((y_current->y_array = ALLOC_ONE(char_u *)) == NULL)
+	{
+	    vim_free(p);
+	    return FAIL;
+	}
+	y_current->y_array[0] = p;
+	y_current->y_size = 1;
+	y_current->y_type = MCHAR;  // used to be MLINE, why?
+#ifdef FEAT_VIMINFO
+	y_current->y_time_set = vim_time();
+#endif
+    }
+    return OK;
+}
+
+static int execreg_lastc = NUL;
+
+    int
+get_execreg_lastc(void)
+{
+    return execreg_lastc;
+}
+
+    void
+set_execreg_lastc(int lastc)
+{
+    execreg_lastc = lastc;
+}
+
+/*
+ * Execute a yank register: copy it into the stuff buffer.
+ *
+ * Return FAIL for failure, OK otherwise.
+ */
+    int
+do_execreg(
+    int	    regname,
+    int	    colon,		// insert ':' before each line
+    int	    addcr,		// always add '\n' to end of line
+    int	    silent)		// set "silent" flag in typeahead buffer
+{
+    long	i;
+    char_u	*p;
+    int		retval = OK;
+    int		remap;
+
+    // repeat previous one
+    if (regname == '@')
+    {
+	if (execreg_lastc == NUL)
+	{
+	    emsg(_("E748: No previously used register"));
+	    return FAIL;
+	}
+	regname = execreg_lastc;
+    }
+    // check for valid regname
+    if (regname == '%' || regname == '#' || !valid_yank_reg(regname, FALSE))
+    {
+	emsg_invreg(regname);
+	return FAIL;
+    }
+    execreg_lastc = regname;
+
+#ifdef FEAT_CLIPBOARD
+    regname = may_get_selection(regname);
+#endif
+
+    // black hole: don't stuff anything
+    if (regname == '_')
+	return OK;
+
+    // use last command line
+    if (regname == ':')
+    {
+	if (last_cmdline == NULL)
+	{
+	    emsg(_(e_nolastcmd));
+	    return FAIL;
+	}
+	// don't keep the cmdline containing @:
+	VIM_CLEAR(new_last_cmdline);
+	// Escape all control characters with a CTRL-V
+	p = vim_strsave_escaped_ext(last_cmdline,
+		    (char_u *)"\001\002\003\004\005\006\007"
+			  "\010\011\012\013\014\015\016\017"
+			  "\020\021\022\023\024\025\026\027"
+			  "\030\031\032\033\034\035\036\037",
+		    Ctrl_V, FALSE);
+	if (p != NULL)
+	{
+	    // When in Visual mode "'<,'>" will be prepended to the command.
+	    // Remove it when it's already there.
+	    if (VIsual_active && STRNCMP(p, "'<,'>", 5) == 0)
+		retval = put_in_typebuf(p + 5, TRUE, TRUE, silent);
+	    else
+		retval = put_in_typebuf(p, TRUE, TRUE, silent);
+	}
+	vim_free(p);
+    }
+#ifdef FEAT_EVAL
+    else if (regname == '=')
+    {
+	p = get_expr_line();
+	if (p == NULL)
+	    return FAIL;
+	retval = put_in_typebuf(p, TRUE, colon, silent);
+	vim_free(p);
+    }
+#endif
+    else if (regname == '.')		// use last inserted text
+    {
+	p = get_last_insert_save();
+	if (p == NULL)
+	{
+	    emsg(_(e_noinstext));
+	    return FAIL;
+	}
+	retval = put_in_typebuf(p, FALSE, colon, silent);
+	vim_free(p);
+    }
+    else
+    {
+	get_yank_register(regname, FALSE);
+	if (y_current->y_array == NULL)
+	    return FAIL;
+
+	// Disallow remaping for ":@r".
+	remap = colon ? REMAP_NONE : REMAP_YES;
+
+	// Insert lines into typeahead buffer, from last one to first one.
+	put_reedit_in_typebuf(silent);
+	for (i = y_current->y_size; --i >= 0; )
+	{
+	    char_u *escaped;
+
+	    // insert NL between lines and after last line if type is MLINE
+	    if (y_current->y_type == MLINE || i < y_current->y_size - 1
+								     || addcr)
+	    {
+		if (ins_typebuf((char_u *)"\n", remap, 0, TRUE, silent) == FAIL)
+		    return FAIL;
+	    }
+	    escaped = vim_strsave_escape_csi(y_current->y_array[i]);
+	    if (escaped == NULL)
+		return FAIL;
+	    retval = ins_typebuf(escaped, remap, 0, TRUE, silent);
+	    vim_free(escaped);
+	    if (retval == FAIL)
+		return FAIL;
+	    if (colon && ins_typebuf((char_u *)":", remap, 0, TRUE, silent)
+								      == FAIL)
+		return FAIL;
+	}
+	reg_executing = regname == 0 ? '"' : regname; // disable "q" command
+    }
+    return retval;
+}
+
+/*
+ * If "restart_edit" is not zero, put it in the typeahead buffer, so that it's
+ * used only after other typeahead has been processed.
+ */
+    static void
+put_reedit_in_typebuf(int silent)
+{
+    char_u	buf[3];
+
+    if (restart_edit != NUL)
+    {
+	if (restart_edit == 'V')
+	{
+	    buf[0] = 'g';
+	    buf[1] = 'R';
+	    buf[2] = NUL;
+	}
+	else
+	{
+	    buf[0] = restart_edit == 'I' ? 'i' : restart_edit;
+	    buf[1] = NUL;
+	}
+	if (ins_typebuf(buf, REMAP_NONE, 0, TRUE, silent) == OK)
+	    restart_edit = NUL;
+    }
+}
+
+/*
+ * Insert register contents "s" into the typeahead buffer, so that it will be
+ * executed again.
+ * When "esc" is TRUE it is to be taken literally: Escape CSI characters and
+ * no remapping.
+ */
+    static int
+put_in_typebuf(
+    char_u	*s,
+    int		esc,
+    int		colon,	    // add ':' before the line
+    int		silent)
+{
+    int		retval = OK;
+
+    put_reedit_in_typebuf(silent);
+    if (colon)
+	retval = ins_typebuf((char_u *)"\n", REMAP_NONE, 0, TRUE, silent);
+    if (retval == OK)
+    {
+	char_u	*p;
+
+	if (esc)
+	    p = vim_strsave_escape_csi(s);
+	else
+	    p = s;
+	if (p == NULL)
+	    retval = FAIL;
+	else
+	    retval = ins_typebuf(p, esc ? REMAP_NONE : REMAP_YES,
+							     0, TRUE, silent);
+	if (esc)
+	    vim_free(p);
+    }
+    if (colon && retval == OK)
+	retval = ins_typebuf((char_u *)":", REMAP_NONE, 0, TRUE, silent);
+    return retval;
+}
+
+/*
+ * Insert a yank register: copy it into the Read buffer.
+ * Used by CTRL-R command and middle mouse button in insert mode.
+ *
+ * return FAIL for failure, OK otherwise
+ */
+    int
+insert_reg(
+    int		regname,
+    int		literally_arg)	// insert literally, not as if typed
+{
+    long	i;
+    int		retval = OK;
+    char_u	*arg;
+    int		allocated;
+    int		literally = literally_arg;
+
+    // It is possible to get into an endless loop by having CTRL-R a in
+    // register a and then, in insert mode, doing CTRL-R a.
+    // If you hit CTRL-C, the loop will be broken here.
+    ui_breakcheck();
+    if (got_int)
+	return FAIL;
+
+    // check for valid regname
+    if (regname != NUL && !valid_yank_reg(regname, FALSE))
+	return FAIL;
+
+#ifdef FEAT_CLIPBOARD
+    regname = may_get_selection(regname);
+#endif
+
+    if (regname == '.')			// insert last inserted text
+	retval = stuff_inserted(NUL, 1L, TRUE);
+    else if (get_spec_reg(regname, &arg, &allocated, TRUE))
+    {
+	if (arg == NULL)
+	    return FAIL;
+	stuffescaped(arg, literally);
+	if (allocated)
+	    vim_free(arg);
+    }
+    else				// name or number register
+    {
+	if (get_yank_register(regname, FALSE))
+	    literally = TRUE;
+	if (y_current->y_array == NULL)
+	    retval = FAIL;
+	else
+	{
+	    for (i = 0; i < y_current->y_size; ++i)
+	    {
+		stuffescaped(y_current->y_array[i], literally);
+		// Insert a newline between lines and after last line if
+		// y_type is MLINE.
+		if (y_current->y_type == MLINE || i < y_current->y_size - 1)
+		    stuffcharReadbuff('\n');
+	    }
+	}
+    }
+
+    return retval;
+}
+
+/*
+ * If "regname" is a special register, return TRUE and store a pointer to its
+ * value in "argp".
+ */
+    int
+get_spec_reg(
+    int		regname,
+    char_u	**argp,
+    int		*allocated,	// return: TRUE when value was allocated
+    int		errmsg)		// give error message when failing
+{
+    int		cnt;
+
+    *argp = NULL;
+    *allocated = FALSE;
+    switch (regname)
+    {
+	case '%':		// file name
+	    if (errmsg)
+		check_fname();	// will give emsg if not set
+	    *argp = curbuf->b_fname;
+	    return TRUE;
+
+	case '#':		// alternate file name
+	    *argp = getaltfname(errmsg);	// may give emsg if not set
+	    return TRUE;
+
+#ifdef FEAT_EVAL
+	case '=':		// result of expression
+	    *argp = get_expr_line();
+	    *allocated = TRUE;
+	    return TRUE;
+#endif
+
+	case ':':		// last command line
+	    if (last_cmdline == NULL && errmsg)
+		emsg(_(e_nolastcmd));
+	    *argp = last_cmdline;
+	    return TRUE;
+
+	case '/':		// last search-pattern
+	    if (last_search_pat() == NULL && errmsg)
+		emsg(_(e_noprevre));
+	    *argp = last_search_pat();
+	    return TRUE;
+
+	case '.':		// last inserted text
+	    *argp = get_last_insert_save();
+	    *allocated = TRUE;
+	    if (*argp == NULL && errmsg)
+		emsg(_(e_noinstext));
+	    return TRUE;
+
+#ifdef FEAT_SEARCHPATH
+	case Ctrl_F:		// Filename under cursor
+	case Ctrl_P:		// Path under cursor, expand via "path"
+	    if (!errmsg)
+		return FALSE;
+	    *argp = file_name_at_cursor(FNAME_MESS | FNAME_HYP
+			    | (regname == Ctrl_P ? FNAME_EXP : 0), 1L, NULL);
+	    *allocated = TRUE;
+	    return TRUE;
+#endif
+
+	case Ctrl_W:		// word under cursor
+	case Ctrl_A:		// WORD (mnemonic All) under cursor
+	    if (!errmsg)
+		return FALSE;
+	    cnt = find_ident_under_cursor(argp, regname == Ctrl_W
+				   ?  (FIND_IDENT|FIND_STRING) : FIND_STRING);
+	    *argp = cnt ? vim_strnsave(*argp, cnt) : NULL;
+	    *allocated = TRUE;
+	    return TRUE;
+
+	case Ctrl_L:		// Line under cursor
+	    if (!errmsg)
+		return FALSE;
+
+	    *argp = ml_get_buf(curwin->w_buffer,
+			curwin->w_cursor.lnum, FALSE);
+	    return TRUE;
+
+	case '_':		// black hole: always empty
+	    *argp = (char_u *)"";
+	    return TRUE;
+    }
+
+    return FALSE;
+}
+
+/*
+ * Paste a yank register into the command line.
+ * Only for non-special registers.
+ * Used by CTRL-R command in command-line mode
+ * insert_reg() can't be used here, because special characters from the
+ * register contents will be interpreted as commands.
+ *
+ * return FAIL for failure, OK otherwise
+ */
+    int
+cmdline_paste_reg(
+    int regname,
+    int literally_arg,	// Insert text literally instead of "as typed"
+    int remcr)		// don't add CR characters
+{
+    long	i;
+    int		literally = literally_arg;
+
+    if (get_yank_register(regname, FALSE))
+	literally = TRUE;
+    if (y_current->y_array == NULL)
+	return FAIL;
+
+    for (i = 0; i < y_current->y_size; ++i)
+    {
+	cmdline_paste_str(y_current->y_array[i], literally);
+
+	// Insert ^M between lines and after last line if type is MLINE.
+	// Don't do this when "remcr" is TRUE.
+	if ((y_current->y_type == MLINE || i < y_current->y_size - 1) && !remcr)
+	    cmdline_paste_str((char_u *)"\r", literally);
+
+	// Check for CTRL-C, in case someone tries to paste a few thousand
+	// lines and gets bored.
+	ui_breakcheck();
+	if (got_int)
+	    return FAIL;
+    }
+    return OK;
+}
+
+#if defined(FEAT_CLIPBOARD) || defined(PROTO)
+/*
+ * Adjust the register name pointed to with "rp" for the clipboard being
+ * used always and the clipboard being available.
+ */
+    void
+adjust_clip_reg(int *rp)
+{
+    // If no reg. specified, and "unnamed" or "unnamedplus" is in 'clipboard',
+    // use '*' or '+' reg, respectively. "unnamedplus" prevails.
+    if (*rp == 0 && (clip_unnamed != 0 || clip_unnamed_saved != 0))
+    {
+	if (clip_unnamed != 0)
+	    *rp = ((clip_unnamed & CLIP_UNNAMED_PLUS) && clip_plus.available)
+								  ? '+' : '*';
+	else
+	    *rp = ((clip_unnamed_saved & CLIP_UNNAMED_PLUS) && clip_plus.available)
+								  ? '+' : '*';
+    }
+    if (!clip_star.available && *rp == '*')
+	*rp = 0;
+    if (!clip_plus.available && *rp == '+')
+	*rp = 0;
+}
+#endif
+
+/*
+ * Shift the delete registers: "9 is cleared, "8 becomes "9, etc.
+ */
+    void
+shift_delete_registers()
+{
+    int		n;
+
+    y_current = &y_regs[9];
+    free_yank_all();			// free register nine
+    for (n = 9; n > 1; --n)
+	y_regs[n] = y_regs[n - 1];
+    y_current = &y_regs[1];
+    if (!y_append)
+	y_previous = y_current;
+    y_regs[1].y_array = NULL;		// set register one to empty
+}
+
+#if defined(FEAT_EVAL)
+    void
+yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
+{
+    static int	recursive = FALSE;
+    dict_T	*v_event;
+    list_T	*list;
+    int		n;
+    char_u	buf[NUMBUFLEN + 2];
+    long	reglen = 0;
+
+    if (recursive)
+	return;
+
+    v_event = get_vim_var_dict(VV_EVENT);
+
+    list = list_alloc();
+    if (list == NULL)
+	return;
+    for (n = 0; n < reg->y_size; n++)
+	list_append_string(list, reg->y_array[n], -1);
+    list->lv_lock = VAR_FIXED;
+    dict_add_list(v_event, "regcontents", list);
+
+    buf[0] = (char_u)oap->regname;
+    buf[1] = NUL;
+    dict_add_string(v_event, "regname", buf);
+
+    buf[0] = get_op_char(oap->op_type);
+    buf[1] = get_extra_op_char(oap->op_type);
+    buf[2] = NUL;
+    dict_add_string(v_event, "operator", buf);
+
+    buf[0] = NUL;
+    buf[1] = NUL;
+    switch (get_reg_type(oap->regname, &reglen))
+    {
+	case MLINE: buf[0] = 'V'; break;
+	case MCHAR: buf[0] = 'v'; break;
+	case MBLOCK:
+		vim_snprintf((char *)buf, sizeof(buf), "%c%ld", Ctrl_V,
+			     reglen + 1);
+		break;
+    }
+    dict_add_string(v_event, "regtype", buf);
+
+    // Lock the dictionary and its keys
+    dict_set_items_ro(v_event);
+
+    recursive = TRUE;
+    textlock++;
+    apply_autocmds(EVENT_TEXTYANKPOST, NULL, NULL, FALSE, curbuf);
+    textlock--;
+    recursive = FALSE;
+
+    // Empty the dictionary, v:event is still valid
+    dict_free_contents(v_event);
+    hash_init(&v_event->dv_hashtab);
+}
+#endif
+
+/*
+ * set all the yank registers to empty (called from main())
+ */
+    void
+init_yank(void)
+{
+    int		i;
+
+    for (i = 0; i < NUM_REGISTERS; ++i)
+	y_regs[i].y_array = NULL;
+}
+
+#if defined(EXITFREE) || defined(PROTO)
+    void
+clear_registers(void)
+{
+    int		i;
+
+    for (i = 0; i < NUM_REGISTERS; ++i)
+    {
+	y_current = &y_regs[i];
+	if (y_current->y_array != NULL)
+	    free_yank_all();
+    }
+}
+#endif
+
+/*
+ * Free "n" lines from the current yank register.
+ * Called for normal freeing and in case of error.
+ */
+    static void
+free_yank(long n)
+{
+    if (y_current->y_array != NULL)
+    {
+	long	    i;
+
+	for (i = n; --i >= 0; )
+	{
+#ifdef AMIGA	    // only for very slow machines
+	    if ((i & 1023) == 1023)  // this may take a while
+	    {
+		// This message should never cause a hit-return message.
+		// Overwrite this message with any next message.
+		++no_wait_return;
+		smsg(_("freeing %ld lines"), i + 1);
+		--no_wait_return;
+		msg_didout = FALSE;
+		msg_col = 0;
+	    }
+#endif
+	    vim_free(y_current->y_array[i]);
+	}
+	VIM_CLEAR(y_current->y_array);
+#ifdef AMIGA
+	if (n >= 1000)
+	    msg("");
+#endif
+    }
+}
+
+    static void
+free_yank_all(void)
+{
+    free_yank(y_current->y_size);
+}
+
+/*
+ * Yank the text between "oap->start" and "oap->end" into a yank register.
+ * If we are to append (uppercase register), we first yank into a new yank
+ * register and then concatenate the old and the new one (so we keep the old
+ * one in case of out-of-memory).
+ *
+ * Return FAIL for failure, OK otherwise.
+ */
+    int
+op_yank(oparg_T *oap, int deleting, int mess)
+{
+    long		y_idx;		// index in y_array[]
+    yankreg_T		*curr;		// copy of y_current
+    yankreg_T		newreg;		// new yank register when appending
+    char_u		**new_ptr;
+    linenr_T		lnum;		// current line number
+    long		j;
+    int			yanktype = oap->motion_type;
+    long		yanklines = oap->line_count;
+    linenr_T		yankendlnum = oap->end.lnum;
+    char_u		*p;
+    char_u		*pnew;
+    struct block_def	bd;
+#if defined(FEAT_CLIPBOARD) && defined(FEAT_X11)
+    int			did_star = FALSE;
+#endif
+
+				    // check for read-only register
+    if (oap->regname != 0 && !valid_yank_reg(oap->regname, TRUE))
+    {
+	beep_flush();
+	return FAIL;
+    }
+    if (oap->regname == '_')	    // black hole: nothing to do
+	return OK;
+
+#ifdef FEAT_CLIPBOARD
+    if (!clip_star.available && oap->regname == '*')
+	oap->regname = 0;
+    else if (!clip_plus.available && oap->regname == '+')
+	oap->regname = 0;
+#endif
+
+    if (!deleting)		    // op_delete() already set y_current
+	get_yank_register(oap->regname, TRUE);
+
+    curr = y_current;
+				    // append to existing contents
+    if (y_append && y_current->y_array != NULL)
+	y_current = &newreg;
+    else
+	free_yank_all();	    // free previously yanked lines
+
+    // If the cursor was in column 1 before and after the movement, and the
+    // operator is not inclusive, the yank is always linewise.
+    if (       oap->motion_type == MCHAR
+	    && oap->start.col == 0
+	    && !oap->inclusive
+	    && (!oap->is_VIsual || *p_sel == 'o')
+	    && !oap->block_mode
+	    && oap->end.col == 0
+	    && yanklines > 1)
+    {
+	yanktype = MLINE;
+	--yankendlnum;
+	--yanklines;
+    }
+
+    y_current->y_size = yanklines;
+    y_current->y_type = yanktype;   // set the yank register type
+    y_current->y_width = 0;
+    y_current->y_array = lalloc_clear(sizeof(char_u *) * yanklines, TRUE);
+    if (y_current->y_array == NULL)
+    {
+	y_current = curr;
+	return FAIL;
+    }
+#ifdef FEAT_VIMINFO
+    y_current->y_time_set = vim_time();
+#endif
+
+    y_idx = 0;
+    lnum = oap->start.lnum;
+
+    if (oap->block_mode)
+    {
+	// Visual block mode
+	y_current->y_type = MBLOCK;	    // set the yank register type
+	y_current->y_width = oap->end_vcol - oap->start_vcol;
+
+	if (curwin->w_curswant == MAXCOL && y_current->y_width > 0)
+	    y_current->y_width--;
+    }
+
+    for ( ; lnum <= yankendlnum; lnum++, y_idx++)
+    {
+	switch (y_current->y_type)
+	{
+	    case MBLOCK:
+		block_prep(oap, &bd, lnum, FALSE);
+		if (yank_copy_line(&bd, y_idx) == FAIL)
+		    goto fail;
+		break;
+
+	    case MLINE:
+		if ((y_current->y_array[y_idx] =
+			    vim_strsave(ml_get(lnum))) == NULL)
+		    goto fail;
+		break;
+
+	    case MCHAR:
+		{
+		    colnr_T startcol = 0, endcol = MAXCOL;
+		    int is_oneChar = FALSE;
+		    colnr_T cs, ce;
+
+		    p = ml_get(lnum);
+		    bd.startspaces = 0;
+		    bd.endspaces = 0;
+
+		    if (lnum == oap->start.lnum)
+		    {
+			startcol = oap->start.col;
+			if (virtual_op)
+			{
+			    getvcol(curwin, &oap->start, &cs, NULL, &ce);
+			    if (ce != cs && oap->start.coladd > 0)
+			    {
+				// Part of a tab selected -- but don't
+				// double-count it.
+				bd.startspaces = (ce - cs + 1)
+							  - oap->start.coladd;
+				startcol++;
+			    }
+			}
+		    }
+
+		    if (lnum == oap->end.lnum)
+		    {
+			endcol = oap->end.col;
+			if (virtual_op)
+			{
+			    getvcol(curwin, &oap->end, &cs, NULL, &ce);
+			    if (p[endcol] == NUL || (cs + oap->end.coladd < ce
+					// Don't add space for double-wide
+					// char; endcol will be on last byte
+					// of multi-byte char.
+					&& (*mb_head_off)(p, p + endcol) == 0))
+			    {
+				if (oap->start.lnum == oap->end.lnum
+					    && oap->start.col == oap->end.col)
+				{
+				    // Special case: inside a single char
+				    is_oneChar = TRUE;
+				    bd.startspaces = oap->end.coladd
+					 - oap->start.coladd + oap->inclusive;
+				    endcol = startcol;
+				}
+				else
+				{
+				    bd.endspaces = oap->end.coladd
+							     + oap->inclusive;
+				    endcol -= oap->inclusive;
+				}
+			    }
+			}
+		    }
+		    if (endcol == MAXCOL)
+			endcol = (colnr_T)STRLEN(p);
+		    if (startcol > endcol || is_oneChar)
+			bd.textlen = 0;
+		    else
+			bd.textlen = endcol - startcol + oap->inclusive;
+		    bd.textstart = p + startcol;
+		    if (yank_copy_line(&bd, y_idx) == FAIL)
+			goto fail;
+		    break;
+		}
+		// NOTREACHED
+	}
+    }
+
+    if (curr != y_current)	// append the new block to the old block
+    {
+	new_ptr = ALLOC_MULT(char_u *, curr->y_size + y_current->y_size);
+	if (new_ptr == NULL)
+	    goto fail;
+	for (j = 0; j < curr->y_size; ++j)
+	    new_ptr[j] = curr->y_array[j];
+	vim_free(curr->y_array);
+	curr->y_array = new_ptr;
+#ifdef FEAT_VIMINFO
+	curr->y_time_set = vim_time();
+#endif
+
+	if (yanktype == MLINE)	// MLINE overrides MCHAR and MBLOCK
+	    curr->y_type = MLINE;
+
+	// Concatenate the last line of the old block with the first line of
+	// the new block, unless being Vi compatible.
+	if (curr->y_type == MCHAR && vim_strchr(p_cpo, CPO_REGAPPEND) == NULL)
+	{
+	    pnew = alloc(STRLEN(curr->y_array[curr->y_size - 1])
+					  + STRLEN(y_current->y_array[0]) + 1);
+	    if (pnew == NULL)
+	    {
+		y_idx = y_current->y_size - 1;
+		goto fail;
+	    }
+	    STRCPY(pnew, curr->y_array[--j]);
+	    STRCAT(pnew, y_current->y_array[0]);
+	    vim_free(curr->y_array[j]);
+	    vim_free(y_current->y_array[0]);
+	    curr->y_array[j++] = pnew;
+	    y_idx = 1;
+	}
+	else
+	    y_idx = 0;
+	while (y_idx < y_current->y_size)
+	    curr->y_array[j++] = y_current->y_array[y_idx++];
+	curr->y_size = j;
+	vim_free(y_current->y_array);
+	y_current = curr;
+    }
+    if (curwin->w_p_rnu)
+	redraw_later(SOME_VALID);	// cursor moved to start
+    if (mess)			// Display message about yank?
+    {
+	if (yanktype == MCHAR
+		&& !oap->block_mode
+		&& yanklines == 1)
+	    yanklines = 0;
+	// Some versions of Vi use ">=" here, some don't... 
+	if (yanklines > p_report)
+	{
+	    char namebuf[100];
+
+	    if (oap->regname == NUL)
+		*namebuf = NUL;
+	    else
+		vim_snprintf(namebuf, sizeof(namebuf),
+						_(" into \"%c"), oap->regname);
+
+	    // redisplay now, so message is not deleted
+	    update_topline_redraw();
+	    if (oap->block_mode)
+	    {
+		smsg(NGETTEXT("block of %ld line yanked%s",
+				     "block of %ld lines yanked%s", yanklines),
+			yanklines, namebuf);
+	    }
+	    else
+	    {
+		smsg(NGETTEXT("%ld line yanked%s",
+					      "%ld lines yanked%s", yanklines),
+			yanklines, namebuf);
+	    }
+	}
+    }
+
+    // Set "'[" and "']" marks.
+    curbuf->b_op_start = oap->start;
+    curbuf->b_op_end = oap->end;
+    if (yanktype == MLINE && !oap->block_mode)
+    {
+	curbuf->b_op_start.col = 0;
+	curbuf->b_op_end.col = MAXCOL;
+    }
+
+#ifdef FEAT_CLIPBOARD
+    // If we were yanking to the '*' register, send result to clipboard.
+    // If no register was specified, and "unnamed" in 'clipboard', make a copy
+    // to the '*' register.
+    if (clip_star.available
+	    && (curr == &(y_regs[STAR_REGISTER])
+		|| (!deleting && oap->regname == 0
+		   && ((clip_unnamed | clip_unnamed_saved) & CLIP_UNNAMED))))
+    {
+	if (curr != &(y_regs[STAR_REGISTER]))
+	    // Copy the text from register 0 to the clipboard register.
+	    copy_yank_reg(&(y_regs[STAR_REGISTER]));
+
+	clip_own_selection(&clip_star);
+	clip_gen_set_selection(&clip_star);
+# ifdef FEAT_X11
+	did_star = TRUE;
+# endif
+    }
+
+# ifdef FEAT_X11
+    // If we were yanking to the '+' register, send result to selection.
+    // Also copy to the '*' register, in case auto-select is off.
+    if (clip_plus.available
+	    && (curr == &(y_regs[PLUS_REGISTER])
+		|| (!deleting && oap->regname == 0
+		  && ((clip_unnamed | clip_unnamed_saved) &
+		      CLIP_UNNAMED_PLUS))))
+    {
+	if (curr != &(y_regs[PLUS_REGISTER]))
+	    // Copy the text from register 0 to the clipboard register.
+	    copy_yank_reg(&(y_regs[PLUS_REGISTER]));
+
+	clip_own_selection(&clip_plus);
+	clip_gen_set_selection(&clip_plus);
+	if (!clip_isautosel_star() && !clip_isautosel_plus()
+		&& !did_star && curr == &(y_regs[PLUS_REGISTER]))
+	{
+	    copy_yank_reg(&(y_regs[STAR_REGISTER]));
+	    clip_own_selection(&clip_star);
+	    clip_gen_set_selection(&clip_star);
+	}
+    }
+# endif
+#endif
+
+#if defined(FEAT_EVAL)
+    if (!deleting && has_textyankpost())
+	yank_do_autocmd(oap, y_current);
+#endif
+
+    return OK;
+
+fail:		// free the allocated lines
+    free_yank(y_idx + 1);
+    y_current = curr;
+    return FAIL;
+}
+
+    static int
+yank_copy_line(struct block_def *bd, long y_idx)
+{
+    char_u	*pnew;
+
+    if ((pnew = alloc(bd->startspaces + bd->endspaces + bd->textlen + 1))
+								      == 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;
+}
+
+#ifdef FEAT_CLIPBOARD
+/*
+ * Make a copy of the y_current register to register "reg".
+ */
+    static void
+copy_yank_reg(yankreg_T *reg)
+{
+    yankreg_T	*curr = y_current;
+    long	j;
+
+    y_current = reg;
+    free_yank_all();
+    *y_current = *curr;
+    y_current->y_array = lalloc_clear(
+				    sizeof(char_u *) * y_current->y_size, TRUE);
+    if (y_current->y_array == NULL)
+	y_current->y_size = 0;
+    else
+	for (j = 0; j < y_current->y_size; ++j)
+	    if ((y_current->y_array[j] = vim_strsave(curr->y_array[j])) == NULL)
+	    {
+		free_yank(j);
+		y_current->y_size = 0;
+		break;
+	    }
+    y_current = curr;
+}
+#endif
+
+/*
+ * Put contents of register "regname" into the text.
+ * Caller must check "regname" to be valid!
+ * "flags": PUT_FIXINDENT	make indent look nice
+ *	    PUT_CURSEND		leave cursor after end of new text
+ *	    PUT_LINE		force linewise put (":put")
+ */
+    void
+do_put(
+    int		regname,
+    int		dir,		// BACKWARD for 'P', FORWARD for 'p'
+    long	count,
+    int		flags)
+{
+    char_u	*ptr;
+    char_u	*newp, *oldp;
+    int		yanklen;
+    int		totlen = 0;		// init for gcc
+    linenr_T	lnum;
+    colnr_T	col;
+    long	i;			// index in y_array[]
+    int		y_type;
+    long	y_size;
+    int		oldlen;
+    long	y_width = 0;
+    colnr_T	vcol;
+    int		delcount;
+    int		incr = 0;
+    long	j;
+    struct block_def bd;
+    char_u	**y_array = NULL;
+    long	nr_lines = 0;
+    pos_T	new_cursor;
+    int		indent;
+    int		orig_indent = 0;	// init for gcc
+    int		indent_diff = 0;	// init for gcc
+    int		first_indent = TRUE;
+    int		lendiff = 0;
+    pos_T	old_pos;
+    char_u	*insert_string = NULL;
+    int		allocated = FALSE;
+    long	cnt;
+
+#ifdef FEAT_CLIPBOARD
+    // Adjust register name for "unnamed" in 'clipboard'.
+    adjust_clip_reg(&regname);
+    (void)may_get_selection(regname);
+#endif
+
+    if (flags & PUT_FIXINDENT)
+	orig_indent = get_indent();
+
+    curbuf->b_op_start = curwin->w_cursor;	// default for '[ mark
+    curbuf->b_op_end = curwin->w_cursor;	// default for '] mark
+
+    // Using inserted text works differently, because the register includes
+    // special characters (newlines, etc.).
+    if (regname == '.')
+    {
+	if (VIsual_active)
+	    stuffcharReadbuff(VIsual_mode);
+	(void)stuff_inserted((dir == FORWARD ? (count == -1 ? 'o' : 'a') :
+				    (count == -1 ? 'O' : 'i')), count, FALSE);
+	// Putting the text is done later, so can't really move the cursor to
+	// the next character.  Use "l" to simulate it.
+	if ((flags & PUT_CURSEND) && gchar_cursor() != NUL)
+	    stuffcharReadbuff('l');
+	return;
+    }
+
+    // For special registers '%' (file name), '#' (alternate file name) and
+    // ':' (last command line), etc. we have to create a fake yank register.
+    if (get_spec_reg(regname, &insert_string, &allocated, TRUE))
+    {
+	if (insert_string == NULL)
+	    return;
+    }
+
+    // Autocommands may be executed when saving lines for undo.  This might
+    // make "y_array" invalid, so we start undo now to avoid that.
+    if (u_save(curwin->w_cursor.lnum, curwin->w_cursor.lnum + 1) == FAIL)
+	goto end;
+
+    if (insert_string != NULL)
+    {
+	y_type = MCHAR;
+#ifdef FEAT_EVAL
+	if (regname == '=')
+	{
+	    // For the = register we need to split the string at NL
+	    // characters.
+	    // Loop twice: count the number of lines and save them.
+	    for (;;)
+	    {
+		y_size = 0;
+		ptr = insert_string;
+		while (ptr != NULL)
+		{
+		    if (y_array != NULL)
+			y_array[y_size] = ptr;
+		    ++y_size;
+		    ptr = vim_strchr(ptr, '\n');
+		    if (ptr != NULL)
+		    {
+			if (y_array != NULL)
+			    *ptr = NUL;
+			++ptr;
+			// A trailing '\n' makes the register linewise.
+			if (*ptr == NUL)
+			{
+			    y_type = MLINE;
+			    break;
+			}
+		    }
+		}
+		if (y_array != NULL)
+		    break;
+		y_array = ALLOC_MULT(char_u *, y_size);
+		if (y_array == NULL)
+		    goto end;
+	    }
+	}
+	else
+#endif
+	{
+	    y_size = 1;		// use fake one-line yank register
+	    y_array = &insert_string;
+	}
+    }
+    else
+    {
+	get_yank_register(regname, FALSE);
+
+	y_type = y_current->y_type;
+	y_width = y_current->y_width;
+	y_size = y_current->y_size;
+	y_array = y_current->y_array;
+    }
+
+    if (y_type == MLINE)
+    {
+	if (flags & PUT_LINE_SPLIT)
+	{
+	    char_u *p;
+
+	    // "p" or "P" in Visual mode: split the lines to put the text in
+	    // between.
+	    if (u_save_cursor() == FAIL)
+		goto end;
+	    p = ml_get_cursor();
+	    if (dir == FORWARD && *p != NUL)
+		MB_PTR_ADV(p);
+	    ptr = vim_strsave(p);
+	    if (ptr == NULL)
+		goto end;
+	    ml_append(curwin->w_cursor.lnum, ptr, (colnr_T)0, FALSE);
+	    vim_free(ptr);
+
+	    oldp = ml_get_curline();
+	    p = oldp + curwin->w_cursor.col;
+	    if (dir == FORWARD && *p != NUL)
+		MB_PTR_ADV(p);
+	    ptr = vim_strnsave(oldp, p - oldp);
+	    if (ptr == NULL)
+		goto end;
+	    ml_replace(curwin->w_cursor.lnum, ptr, FALSE);
+	    ++nr_lines;
+	    dir = FORWARD;
+	}
+	if (flags & PUT_LINE_FORWARD)
+	{
+	    // Must be "p" for a Visual block, put lines below the block.
+	    curwin->w_cursor = curbuf->b_visual.vi_end;
+	    dir = FORWARD;
+	}
+	curbuf->b_op_start = curwin->w_cursor;	// default for '[ mark
+	curbuf->b_op_end = curwin->w_cursor;	// default for '] mark
+    }
+
+    if (flags & PUT_LINE)	// :put command or "p" in Visual line mode.
+	y_type = MLINE;
+
+    if (y_size == 0 || y_array == NULL)
+    {
+	semsg(_("E353: Nothing in register %s"),
+		  regname == 0 ? (char_u *)"\"" : transchar(regname));
+	goto end;
+    }
+
+    if (y_type == MBLOCK)
+    {
+	lnum = curwin->w_cursor.lnum + y_size + 1;
+	if (lnum > curbuf->b_ml.ml_line_count)
+	    lnum = curbuf->b_ml.ml_line_count + 1;
+	if (u_save(curwin->w_cursor.lnum - 1, lnum) == FAIL)
+	    goto end;
+    }
+    else if (y_type == MLINE)
+    {
+	lnum = curwin->w_cursor.lnum;
+#ifdef FEAT_FOLDING
+	// Correct line number for closed fold.  Don't move the cursor yet,
+	// u_save() uses it.
+	if (dir == BACKWARD)
+	    (void)hasFolding(lnum, &lnum, NULL);
+	else
+	    (void)hasFolding(lnum, NULL, &lnum);
+#endif
+	if (dir == FORWARD)
+	    ++lnum;
+	// In an empty buffer the empty line is going to be replaced, include
+	// it in the saved lines.
+	if ((BUFEMPTY() ? u_save(0, 2) : u_save(lnum - 1, lnum)) == FAIL)
+	    goto end;
+#ifdef FEAT_FOLDING
+	if (dir == FORWARD)
+	    curwin->w_cursor.lnum = lnum - 1;
+	else
+	    curwin->w_cursor.lnum = lnum;
+	curbuf->b_op_start = curwin->w_cursor;	// for mark_adjust()
+#endif
+    }
+    else if (u_save_cursor() == FAIL)
+	goto end;
+
+    yanklen = (int)STRLEN(y_array[0]);
+
+    if (ve_flags == VE_ALL && y_type == MCHAR)
+    {
+	if (gchar_cursor() == TAB)
+	{
+	    // Don't need to insert spaces when "p" on the last position of a
+	    // tab or "P" on the first position.
+#ifdef FEAT_VARTABS
+	    int viscol = getviscol();
+	    if (dir == FORWARD
+		    ? tabstop_padding(viscol, curbuf->b_p_ts,
+						    curbuf->b_p_vts_array) != 1
+		    : curwin->w_cursor.coladd > 0)
+		coladvance_force(viscol);
+#else
+	    if (dir == FORWARD
+		    ? (int)curwin->w_cursor.coladd < curbuf->b_p_ts - 1
+						: curwin->w_cursor.coladd > 0)
+		coladvance_force(getviscol());
+#endif
+	    else
+		curwin->w_cursor.coladd = 0;
+	}
+	else if (curwin->w_cursor.coladd > 0 || gchar_cursor() == NUL)
+	    coladvance_force(getviscol() + (dir == FORWARD));
+    }
+
+    lnum = curwin->w_cursor.lnum;
+    col = curwin->w_cursor.col;
+
+    // Block mode
+    if (y_type == MBLOCK)
+    {
+	int	c = gchar_cursor();
+	colnr_T	endcol2 = 0;
+
+	if (dir == FORWARD && c != NUL)
+	{
+	    if (ve_flags == VE_ALL)
+		getvcol(curwin, &curwin->w_cursor, &col, NULL, &endcol2);
+	    else
+		getvcol(curwin, &curwin->w_cursor, NULL, NULL, &col);
+
+	    if (has_mbyte)
+		// move to start of next multi-byte character
+		curwin->w_cursor.col += (*mb_ptr2len)(ml_get_cursor());
+	    else
+	    if (c != TAB || ve_flags != VE_ALL)
+		++curwin->w_cursor.col;
+	    ++col;
+	}
+	else
+	    getvcol(curwin, &curwin->w_cursor, &col, NULL, &endcol2);
+
+	col += curwin->w_cursor.coladd;
+	if (ve_flags == VE_ALL
+		&& (curwin->w_cursor.coladd > 0
+		    || endcol2 == curwin->w_cursor.col))
+	{
+	    if (dir == FORWARD && c == NUL)
+		++col;
+	    if (dir != FORWARD && c != NUL)
+		++curwin->w_cursor.col;
+	    if (c == TAB)
+	    {
+		if (dir == BACKWARD && curwin->w_cursor.col)
+		    curwin->w_cursor.col--;
+		if (dir == FORWARD && col - 1 == endcol2)
+		    curwin->w_cursor.col++;
+	    }
+	}
+	curwin->w_cursor.coladd = 0;
+	bd.textcol = 0;
+	for (i = 0; i < y_size; ++i)
+	{
+	    int spaces;
+	    char shortline;
+
+	    bd.startspaces = 0;
+	    bd.endspaces = 0;
+	    vcol = 0;
+	    delcount = 0;
+
+	    // add a new line
+	    if (curwin->w_cursor.lnum > curbuf->b_ml.ml_line_count)
+	    {
+		if (ml_append(curbuf->b_ml.ml_line_count, (char_u *)"",
+						   (colnr_T)1, FALSE) == FAIL)
+		    break;
+		++nr_lines;
+	    }
+	    // get the old line and advance to the position to insert at
+	    oldp = ml_get_curline();
+	    oldlen = (int)STRLEN(oldp);
+	    for (ptr = oldp; vcol < col && *ptr; )
+	    {
+		// Count a tab for what it's worth (if list mode not on)
+		incr = lbr_chartabsize_adv(oldp, &ptr, (colnr_T)vcol);
+		vcol += incr;
+	    }
+	    bd.textcol = (colnr_T)(ptr - oldp);
+
+	    shortline = (vcol < col) || (vcol == col && !*ptr) ;
+
+	    if (vcol < col) // line too short, padd with spaces
+		bd.startspaces = col - vcol;
+	    else if (vcol > col)
+	    {
+		bd.endspaces = vcol - col;
+		bd.startspaces = incr - bd.endspaces;
+		--bd.textcol;
+		delcount = 1;
+		if (has_mbyte)
+		    bd.textcol -= (*mb_head_off)(oldp, oldp + bd.textcol);
+		if (oldp[bd.textcol] != TAB)
+		{
+		    // Only a Tab can be split into spaces.  Other
+		    // characters will have to be moved to after the
+		    // block, causing misalignment.
+		    delcount = 0;
+		    bd.endspaces = 0;
+		}
+	    }
+
+	    yanklen = (int)STRLEN(y_array[i]);
+
+	    // calculate number of spaces required to fill right side of block
+	    spaces = y_width + 1;
+	    for (j = 0; j < yanklen; j++)
+		spaces -= lbr_chartabsize(NULL, &y_array[i][j], 0);
+	    if (spaces < 0)
+		spaces = 0;
+
+	    // insert the new text
+	    totlen = count * (yanklen + spaces) + bd.startspaces + bd.endspaces;
+	    newp = alloc(totlen + oldlen + 1);
+	    if (newp == NULL)
+		break;
+	    // copy part up to cursor to new line
+	    ptr = newp;
+	    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)
+	    {
+		mch_memmove(ptr, y_array[i], (size_t)yanklen);
+		ptr += yanklen;
+
+		// 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,
+				(size_t)(oldlen - bd.textcol - delcount + 1));
+	    ml_replace(curwin->w_cursor.lnum, newp, FALSE);
+
+	    ++curwin->w_cursor.lnum;
+	    if (i == 0)
+		curwin->w_cursor.col += bd.startspaces;
+	}
+
+	changed_lines(lnum, 0, curwin->w_cursor.lnum, nr_lines);
+
+	// Set '[ mark.
+	curbuf->b_op_start = curwin->w_cursor;
+	curbuf->b_op_start.lnum = lnum;
+
+	// adjust '] mark
+	curbuf->b_op_end.lnum = curwin->w_cursor.lnum - 1;
+	curbuf->b_op_end.col = bd.textcol + totlen - 1;
+	curbuf->b_op_end.coladd = 0;
+	if (flags & PUT_CURSEND)
+	{
+	    colnr_T len;
+
+	    curwin->w_cursor = curbuf->b_op_end;
+	    curwin->w_cursor.col++;
+
+	    // in Insert mode we might be after the NUL, correct for that
+	    len = (colnr_T)STRLEN(ml_get_curline());
+	    if (curwin->w_cursor.col > len)
+		curwin->w_cursor.col = len;
+	}
+	else
+	    curwin->w_cursor.lnum = lnum;
+    }
+    else
+    {
+	// Character or Line mode
+	if (y_type == MCHAR)
+	{
+	    // if type is MCHAR, FORWARD is the same as BACKWARD on the next
+	    // char
+	    if (dir == FORWARD && gchar_cursor() != NUL)
+	    {
+		if (has_mbyte)
+		{
+		    int bytelen = (*mb_ptr2len)(ml_get_cursor());
+
+		    // put it on the next of the multi-byte character.
+		    col += bytelen;
+		    if (yanklen)
+		    {
+			curwin->w_cursor.col += bytelen;
+			curbuf->b_op_end.col += bytelen;
+		    }
+		}
+		else
+		{
+		    ++col;
+		    if (yanklen)
+		    {
+			++curwin->w_cursor.col;
+			++curbuf->b_op_end.col;
+		    }
+		}
+	    }
+	    curbuf->b_op_start = curwin->w_cursor;
+	}
+	// Line mode: BACKWARD is the same as FORWARD on the previous line
+	else if (dir == BACKWARD)
+	    --lnum;
+	new_cursor = curwin->w_cursor;
+
+	// simple case: insert into current line
+	if (y_type == MCHAR && y_size == 1)
+	{
+	    linenr_T end_lnum = 0; // init for gcc
+
+	    if (VIsual_active)
+	    {
+		end_lnum = curbuf->b_visual.vi_end.lnum;
+		if (end_lnum < curbuf->b_visual.vi_start.lnum)
+		    end_lnum = curbuf->b_visual.vi_start.lnum;
+	    }
+
+	    do {
+		totlen = count * yanklen;
+		if (totlen > 0)
+		{
+		    oldp = ml_get(lnum);
+		    if (VIsual_active && col > (int)STRLEN(oldp))
+		    {
+			lnum++;
+			continue;
+		    }
+		    newp = alloc(STRLEN(oldp) + totlen + 1);
+		    if (newp == NULL)
+			goto end;	// alloc() gave an error message
+		    mch_memmove(newp, oldp, (size_t)col);
+		    ptr = newp + col;
+		    for (i = 0; i < count; ++i)
+		    {
+			mch_memmove(ptr, y_array[0], (size_t)yanklen);
+			ptr += yanklen;
+		    }
+		    STRMOVE(ptr, oldp + col);
+		    ml_replace(lnum, newp, FALSE);
+		    // Place cursor on last putted char.
+		    if (lnum == curwin->w_cursor.lnum)
+		    {
+			// make sure curwin->w_virtcol is updated
+			changed_cline_bef_curs();
+			curwin->w_cursor.col += (colnr_T)(totlen - 1);
+		    }
+		}
+		if (VIsual_active)
+		    lnum++;
+	    } while (VIsual_active && lnum <= end_lnum);
+
+	    if (VIsual_active) // reset lnum to the last visual line
+		lnum--;
+
+	    curbuf->b_op_end = curwin->w_cursor;
+	    // For "CTRL-O p" in Insert mode, put cursor after last char
+	    if (totlen && (restart_edit != 0 || (flags & PUT_CURSEND)))
+		++curwin->w_cursor.col;
+	    changed_bytes(lnum, col);
+	}
+	else
+	{
+	    // Insert at least one line.  When y_type is MCHAR, break the first
+	    // line in two.
+	    for (cnt = 1; cnt <= count; ++cnt)
+	    {
+		i = 0;
+		if (y_type == MCHAR)
+		{
+		    // Split the current line in two at the insert position.
+		    // First insert y_array[size - 1] in front of second line.
+		    // Then append y_array[0] to first line.
+		    lnum = new_cursor.lnum;
+		    ptr = ml_get(lnum) + col;
+		    totlen = (int)STRLEN(y_array[y_size - 1]);
+		    newp = alloc(STRLEN(ptr) + totlen + 1);
+		    if (newp == NULL)
+			goto error;
+		    STRCPY(newp, y_array[y_size - 1]);
+		    STRCAT(newp, ptr);
+		    // insert second line
+		    ml_append(lnum, newp, (colnr_T)0, FALSE);
+		    vim_free(newp);
+
+		    oldp = ml_get(lnum);
+		    newp = alloc(col + yanklen + 1);
+		    if (newp == NULL)
+			goto error;
+					    // copy first part of line
+		    mch_memmove(newp, oldp, (size_t)col);
+					    // append to first line
+		    mch_memmove(newp + col, y_array[0], (size_t)(yanklen + 1));
+		    ml_replace(lnum, newp, FALSE);
+
+		    curwin->w_cursor.lnum = lnum;
+		    i = 1;
+		}
+
+		for (; i < y_size; ++i)
+		{
+		    if ((y_type != MCHAR || i < y_size - 1)
+			    && ml_append(lnum, y_array[i], (colnr_T)0, FALSE)
+								      == FAIL)
+			    goto error;
+		    lnum++;
+		    ++nr_lines;
+		    if (flags & PUT_FIXINDENT)
+		    {
+			old_pos = curwin->w_cursor;
+			curwin->w_cursor.lnum = lnum;
+			ptr = ml_get(lnum);
+			if (cnt == count && i == y_size - 1)
+			    lendiff = (int)STRLEN(ptr);
+#if defined(FEAT_SMARTINDENT) || defined(FEAT_CINDENT)
+			if (*ptr == '#' && preprocs_left())
+			    indent = 0;     // Leave # lines at start
+			else
+#endif
+			     if (*ptr == NUL)
+			    indent = 0;     // Ignore empty lines
+			else if (first_indent)
+			{
+			    indent_diff = orig_indent - get_indent();
+			    indent = orig_indent;
+			    first_indent = FALSE;
+			}
+			else if ((indent = get_indent() + indent_diff) < 0)
+			    indent = 0;
+			(void)set_indent(indent, 0);
+			curwin->w_cursor = old_pos;
+			// remember how many chars were removed
+			if (cnt == count && i == y_size - 1)
+			    lendiff -= (int)STRLEN(ml_get(lnum));
+		    }
+		}
+	    }
+
+error:
+	    // Adjust marks.
+	    if (y_type == MLINE)
+	    {
+		curbuf->b_op_start.col = 0;
+		if (dir == FORWARD)
+		    curbuf->b_op_start.lnum++;
+	    }
+	    // Skip mark_adjust when adding lines after the last one, there
+	    // can't be marks there. But still needed in diff mode.
+	    if (curbuf->b_op_start.lnum + (y_type == MCHAR) - 1 + nr_lines
+						 < curbuf->b_ml.ml_line_count
+#ifdef FEAT_DIFF
+						 || curwin->w_p_diff
+#endif
+						 )
+		mark_adjust(curbuf->b_op_start.lnum + (y_type == MCHAR),
+					     (linenr_T)MAXLNUM, nr_lines, 0L);
+
+	    // note changed text for displaying and folding
+	    if (y_type == MCHAR)
+		changed_lines(curwin->w_cursor.lnum, col,
+					 curwin->w_cursor.lnum + 1, nr_lines);
+	    else
+		changed_lines(curbuf->b_op_start.lnum, 0,
+					   curbuf->b_op_start.lnum, nr_lines);
+
+	    // put '] mark at last inserted character
+	    curbuf->b_op_end.lnum = lnum;
+	    // correct length for change in indent
+	    col = (colnr_T)STRLEN(y_array[y_size - 1]) - lendiff;
+	    if (col > 1)
+		curbuf->b_op_end.col = col - 1;
+	    else
+		curbuf->b_op_end.col = 0;
+
+	    if (flags & PUT_CURSLINE)
+	    {
+		// ":put": put cursor on last inserted line
+		curwin->w_cursor.lnum = lnum;
+		beginline(BL_WHITE | BL_FIX);
+	    }
+	    else if (flags & PUT_CURSEND)
+	    {
+		// put cursor after inserted text
+		if (y_type == MLINE)
+		{
+		    if (lnum >= curbuf->b_ml.ml_line_count)
+			curwin->w_cursor.lnum = curbuf->b_ml.ml_line_count;
+		    else
+			curwin->w_cursor.lnum = lnum + 1;
+		    curwin->w_cursor.col = 0;
+		}
+		else
+		{
+		    curwin->w_cursor.lnum = lnum;
+		    curwin->w_cursor.col = col;
+		}
+	    }
+	    else if (y_type == MLINE)
+	    {
+		// put cursor on first non-blank in first inserted line
+		curwin->w_cursor.col = 0;
+		if (dir == FORWARD)
+		    ++curwin->w_cursor.lnum;
+		beginline(BL_WHITE | BL_FIX);
+	    }
+	    else	// put cursor on first inserted character
+		curwin->w_cursor = new_cursor;
+	}
+    }
+
+    msgmore(nr_lines);
+    curwin->w_set_curswant = TRUE;
+
+end:
+    if (allocated)
+	vim_free(insert_string);
+    if (regname == '=')
+	vim_free(y_array);
+
+    VIsual_active = FALSE;
+
+    // If the cursor is past the end of the line put it at the end.
+    adjust_cursor_eol();
+}
+
+/*
+ * Return the character name of the register with the given number.
+ */
+    int
+get_register_name(int num)
+{
+    if (num == -1)
+	return '"';
+    else if (num < 10)
+	return num + '0';
+    else if (num == DELETION_REGISTER)
+	return '-';
+#ifdef FEAT_CLIPBOARD
+    else if (num == STAR_REGISTER)
+	return '*';
+    else if (num == PLUS_REGISTER)
+	return '+';
+#endif
+    else
+    {
+#ifdef EBCDIC
+	int i;
+
+	// EBCDIC is really braindead ...
+	i = 'a' + (num - 10);
+	if (i > 'i')
+	    i += 7;
+	if (i > 'r')
+	    i += 8;
+	return i;
+#else
+	return num + 'a' - 10;
+#endif
+    }
+}
+
+/*
+ * ":dis" and ":registers": Display the contents of the yank registers.
+ */
+    void
+ex_display(exarg_T *eap)
+{
+    int		i, n;
+    long	j;
+    char_u	*p;
+    yankreg_T	*yb;
+    int		name;
+    int		attr;
+    char_u	*arg = eap->arg;
+    int		clen;
+
+    if (arg != NULL && *arg == NUL)
+	arg = NULL;
+    attr = HL_ATTR(HLF_8);
+
+    // Highlight title
+    msg_puts_title(_("\n--- Registers ---"));
+    for (i = -1; i < NUM_REGISTERS && !got_int; ++i)
+    {
+	name = get_register_name(i);
+	if (arg != NULL && vim_strchr(arg, name) == NULL
+#ifdef ONE_CLIPBOARD
+	    // Star register and plus register contain the same thing.
+		&& (name != '*' || vim_strchr(arg, '+') == NULL)
+#endif
+		)
+	    continue;	    // did not ask for this register
+
+#ifdef FEAT_CLIPBOARD
+	// Adjust register name for "unnamed" in 'clipboard'.
+	// When it's a clipboard register, fill it with the current contents
+	// of the clipboard.
+	adjust_clip_reg(&name);
+	(void)may_get_selection(name);
+#endif
+
+	if (i == -1)
+	{
+	    if (y_previous != NULL)
+		yb = y_previous;
+	    else
+		yb = &(y_regs[0]);
+	}
+	else
+	    yb = &(y_regs[i]);
+
+#ifdef FEAT_EVAL
+	if (name == MB_TOLOWER(redir_reg)
+		|| (redir_reg == '"' && yb == y_previous))
+	    continue;	    // do not list register being written to, the
+			    // pointer can be freed
+#endif
+
+	if (yb->y_array != NULL)
+	{
+	    msg_putchar('\n');
+	    msg_putchar('"');
+	    msg_putchar(name);
+	    msg_puts("   ");
+
+	    n = (int)Columns - 6;
+	    for (j = 0; j < yb->y_size && n > 1; ++j)
+	    {
+		if (j)
+		{
+		    msg_puts_attr("^J", attr);
+		    n -= 2;
+		}
+		for (p = yb->y_array[j]; *p && (n -= ptr2cells(p)) >= 0; ++p)
+		{
+		    clen = (*mb_ptr2len)(p);
+		    msg_outtrans_len(p, clen);
+		    p += clen - 1;
+		}
+	    }
+	    if (n > 1 && yb->y_type == MLINE)
+		msg_puts_attr("^J", attr);
+	    out_flush();		    // show one line at a time
+	}
+	ui_breakcheck();
+    }
+
+    // display last inserted text
+    if ((p = get_last_insert()) != NULL
+		 && (arg == NULL || vim_strchr(arg, '.') != NULL) && !got_int)
+    {
+	msg_puts("\n\".   ");
+	dis_msg(p, TRUE);
+    }
+
+    // display last command line
+    if (last_cmdline != NULL && (arg == NULL || vim_strchr(arg, ':') != NULL)
+								  && !got_int)
+    {
+	msg_puts("\n\":   ");
+	dis_msg(last_cmdline, FALSE);
+    }
+
+    // display current file name
+    if (curbuf->b_fname != NULL
+	    && (arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int)
+    {
+	msg_puts("\n\"%   ");
+	dis_msg(curbuf->b_fname, FALSE);
+    }
+
+    // display alternate file name
+    if ((arg == NULL || vim_strchr(arg, '%') != NULL) && !got_int)
+    {
+	char_u	    *fname;
+	linenr_T    dummy;
+
+	if (buflist_name_nr(0, &fname, &dummy) != FAIL)
+	{
+	    msg_puts("\n\"#   ");
+	    dis_msg(fname, FALSE);
+	}
+    }
+
+    // display last search pattern
+    if (last_search_pat() != NULL
+		 && (arg == NULL || vim_strchr(arg, '/') != NULL) && !got_int)
+    {
+	msg_puts("\n\"/   ");
+	dis_msg(last_search_pat(), FALSE);
+    }
+
+#ifdef FEAT_EVAL
+    // display last used expression
+    if (expr_line != NULL && (arg == NULL || vim_strchr(arg, '=') != NULL)
+								  && !got_int)
+    {
+	msg_puts("\n\"=   ");
+	dis_msg(expr_line, FALSE);
+    }
+#endif
+}
+
+/*
+ * display a string for do_dis()
+ * truncate at end of screen line
+ */
+    static void
+dis_msg(
+    char_u	*p,
+    int		skip_esc)	    // if TRUE, ignore trailing ESC
+{
+    int		n;
+    int		l;
+
+    n = (int)Columns - 6;
+    while (*p != NUL
+	    && !(*p == ESC && skip_esc && *(p + 1) == NUL)
+	    && (n -= ptr2cells(p)) >= 0)
+    {
+	if (has_mbyte && (l = (*mb_ptr2len)(p)) > 1)
+	{
+	    msg_outtrans_len(p, l);
+	    p += l;
+	}
+	else
+	    msg_outtrans_len(p++, 1);
+    }
+    ui_breakcheck();
+}
+
+#if defined(FEAT_CLIPBOARD) || defined(PROTO)
+    void
+clip_free_selection(Clipboard_T *cbd)
+{
+    yankreg_T *y_ptr = y_current;
+
+    if (cbd == &clip_plus)
+	y_current = &y_regs[PLUS_REGISTER];
+    else
+	y_current = &y_regs[STAR_REGISTER];
+    free_yank_all();
+    y_current->y_size = 0;
+    y_current = y_ptr;
+}
+
+/*
+ * Get the selected text and put it in register '*' or '+'.
+ */
+    void
+clip_get_selection(Clipboard_T *cbd)
+{
+    yankreg_T	*old_y_previous, *old_y_current;
+    pos_T	old_cursor;
+    pos_T	old_visual;
+    int		old_visual_mode;
+    colnr_T	old_curswant;
+    int		old_set_curswant;
+    pos_T	old_op_start, old_op_end;
+    oparg_T	oa;
+    cmdarg_T	ca;
+
+    if (cbd->owned)
+    {
+	if ((cbd == &clip_plus && y_regs[PLUS_REGISTER].y_array != NULL)
+		|| (cbd == &clip_star && y_regs[STAR_REGISTER].y_array != NULL))
+	    return;
+
+	// Get the text between clip_star.start & clip_star.end
+	old_y_previous = y_previous;
+	old_y_current = y_current;
+	old_cursor = curwin->w_cursor;
+	old_curswant = curwin->w_curswant;
+	old_set_curswant = curwin->w_set_curswant;
+	old_op_start = curbuf->b_op_start;
+	old_op_end = curbuf->b_op_end;
+	old_visual = VIsual;
+	old_visual_mode = VIsual_mode;
+	clear_oparg(&oa);
+	oa.regname = (cbd == &clip_plus ? '+' : '*');
+	oa.op_type = OP_YANK;
+	vim_memset(&ca, 0, sizeof(ca));
+	ca.oap = &oa;
+	ca.cmdchar = 'y';
+	ca.count1 = 1;
+	ca.retval = CA_NO_ADJ_OP_END;
+	do_pending_operator(&ca, 0, TRUE);
+	y_previous = old_y_previous;
+	y_current = old_y_current;
+	curwin->w_cursor = old_cursor;
+	changed_cline_bef_curs();   // need to update w_virtcol et al
+	curwin->w_curswant = old_curswant;
+	curwin->w_set_curswant = old_set_curswant;
+	curbuf->b_op_start = old_op_start;
+	curbuf->b_op_end = old_op_end;
+	VIsual = old_visual;
+	VIsual_mode = old_visual_mode;
+    }
+    else if (!is_clipboard_needs_update())
+    {
+	clip_free_selection(cbd);
+
+	// Try to get selected text from another window
+	clip_gen_request_selection(cbd);
+    }
+}
+
+/*
+ * Convert from the GUI selection string into the '*'/'+' register.
+ */
+    void
+clip_yank_selection(
+    int		type,
+    char_u	*str,
+    long	len,
+    Clipboard_T *cbd)
+{
+    yankreg_T *y_ptr;
+
+    if (cbd == &clip_plus)
+	y_ptr = &y_regs[PLUS_REGISTER];
+    else
+	y_ptr = &y_regs[STAR_REGISTER];
+
+    clip_free_selection(cbd);
+
+    str_to_reg(y_ptr, type, str, len, 0L, FALSE);
+}
+
+/*
+ * Convert the '*'/'+' register into a GUI selection string returned in *str
+ * with length *len.
+ * Returns the motion type, or -1 for failure.
+ */
+    int
+clip_convert_selection(char_u **str, long_u *len, Clipboard_T *cbd)
+{
+    char_u	*p;
+    int		lnum;
+    int		i, j;
+    int_u	eolsize;
+    yankreg_T	*y_ptr;
+
+    if (cbd == &clip_plus)
+	y_ptr = &y_regs[PLUS_REGISTER];
+    else
+	y_ptr = &y_regs[STAR_REGISTER];
+
+# ifdef USE_CRNL
+    eolsize = 2;
+# else
+    eolsize = 1;
+# endif
+
+    *str = NULL;
+    *len = 0;
+    if (y_ptr->y_array == NULL)
+	return -1;
+
+    for (i = 0; i < y_ptr->y_size; i++)
+	*len += (long_u)STRLEN(y_ptr->y_array[i]) + eolsize;
+
+    // Don't want newline character at end of last line if we're in MCHAR mode.
+    if (y_ptr->y_type == MCHAR && *len >= eolsize)
+	*len -= eolsize;
+
+    p = *str = alloc(*len + 1);	// add one to avoid zero
+    if (p == NULL)
+	return -1;
+    lnum = 0;
+    for (i = 0, j = 0; i < (int)*len; i++, j++)
+    {
+	if (y_ptr->y_array[lnum][j] == '\n')
+	    p[i] = NUL;
+	else if (y_ptr->y_array[lnum][j] == NUL)
+	{
+# ifdef USE_CRNL
+	    p[i++] = '\r';
+# endif
+	    p[i] = '\n';
+	    lnum++;
+	    j = -1;
+	}
+	else
+	    p[i] = y_ptr->y_array[lnum][j];
+    }
+    return y_ptr->y_type;
+}
+
+
+/*
+ * If we have written to a clipboard register, send the text to the clipboard.
+ */
+    static void
+may_set_selection(void)
+{
+    if (y_current == &(y_regs[STAR_REGISTER]) && clip_star.available)
+    {
+	clip_own_selection(&clip_star);
+	clip_gen_set_selection(&clip_star);
+    }
+    else if (y_current == &(y_regs[PLUS_REGISTER]) && clip_plus.available)
+    {
+	clip_own_selection(&clip_plus);
+	clip_gen_set_selection(&clip_plus);
+    }
+}
+
+#endif // FEAT_CLIPBOARD || PROTO
+
+
+#if defined(FEAT_DND) || defined(PROTO)
+/*
+ * Replace the contents of the '~' register with str.
+ */
+    void
+dnd_yank_drag_data(char_u *str, long len)
+{
+    yankreg_T *curr;
+
+    curr = y_current;
+    y_current = &y_regs[TILDE_REGISTER];
+    free_yank_all();
+    str_to_reg(y_current, MCHAR, str, len, 0L, FALSE);
+    y_current = curr;
+}
+#endif
+
+
+#if defined(FEAT_EVAL) || defined(PROTO)
+/*
+ * Return the type of a register.
+ * Used for getregtype()
+ * Returns MAUTO for error.
+ */
+    char_u
+get_reg_type(int regname, long *reglen)
+{
+    switch (regname)
+    {
+	case '%':		// file name
+	case '#':		// alternate file name
+	case '=':		// expression
+	case ':':		// last command line
+	case '/':		// last search-pattern
+	case '.':		// last inserted text
+# ifdef FEAT_SEARCHPATH
+	case Ctrl_F:		// Filename under cursor
+	case Ctrl_P:		// Path under cursor, expand via "path"
+# endif
+	case Ctrl_W:		// word under cursor
+	case Ctrl_A:		// WORD (mnemonic All) under cursor
+	case '_':		// black hole: always empty
+	    return MCHAR;
+    }
+
+# ifdef FEAT_CLIPBOARD
+    regname = may_get_selection(regname);
+# endif
+
+    if (regname != NUL && !valid_yank_reg(regname, FALSE))
+	return MAUTO;
+
+    get_yank_register(regname, FALSE);
+
+    if (y_current->y_array != NULL)
+    {
+	if (reglen != NULL && y_current->y_type == MBLOCK)
+	    *reglen = y_current->y_width;
+	return y_current->y_type;
+    }
+    return MAUTO;
+}
+
+/*
+ * When "flags" has GREG_LIST return a list with text "s".
+ * Otherwise just return "s".
+ */
+    static char_u *
+getreg_wrap_one_line(char_u *s, int flags)
+{
+    if (flags & GREG_LIST)
+    {
+	list_T *list = list_alloc();
+
+	if (list != NULL)
+	{
+	    if (list_append_string(list, NULL, -1) == FAIL)
+	    {
+		list_free(list);
+		return NULL;
+	    }
+	    list->lv_first->li_tv.vval.v_string = s;
+	}
+	return (char_u *)list;
+    }
+    return s;
+}
+
+/*
+ * Return the contents of a register as a single allocated string.
+ * Used for "@r" in expressions and for getreg().
+ * Returns NULL for error.
+ * Flags:
+ *	GREG_NO_EXPR	Do not allow expression register
+ *	GREG_EXPR_SRC	For the expression register: return expression itself,
+ *			not the result of its evaluation.
+ *	GREG_LIST	Return a list of lines in place of a single string.
+ */
+    char_u *
+get_reg_contents(int regname, int flags)
+{
+    long	i;
+    char_u	*retval;
+    int		allocated;
+    long	len;
+
+    // Don't allow using an expression register inside an expression
+    if (regname == '=')
+    {
+	if (flags & GREG_NO_EXPR)
+	    return NULL;
+	if (flags & GREG_EXPR_SRC)
+	    return getreg_wrap_one_line(get_expr_line_src(), flags);
+	return getreg_wrap_one_line(get_expr_line(), flags);
+    }
+
+    if (regname == '@')	    // "@@" is used for unnamed register
+	regname = '"';
+
+    // check for valid regname
+    if (regname != NUL && !valid_yank_reg(regname, FALSE))
+	return NULL;
+
+# ifdef FEAT_CLIPBOARD
+    regname = may_get_selection(regname);
+# endif
+
+    if (get_spec_reg(regname, &retval, &allocated, FALSE))
+    {
+	if (retval == NULL)
+	    return NULL;
+	if (allocated)
+	    return getreg_wrap_one_line(retval, flags);
+	return getreg_wrap_one_line(vim_strsave(retval), flags);
+    }
+
+    get_yank_register(regname, FALSE);
+    if (y_current->y_array == NULL)
+	return NULL;
+
+    if (flags & GREG_LIST)
+    {
+	list_T	*list = list_alloc();
+	int	error = FALSE;
+
+	if (list == NULL)
+	    return NULL;
+	for (i = 0; i < y_current->y_size; ++i)
+	    if (list_append_string(list, y_current->y_array[i], -1) == FAIL)
+		error = TRUE;
+	if (error)
+	{
+	    list_free(list);
+	    return NULL;
+	}
+	return (char_u *)list;
+    }
+
+    // Compute length of resulting string.
+    len = 0;
+    for (i = 0; i < y_current->y_size; ++i)
+    {
+	len += (long)STRLEN(y_current->y_array[i]);
+	// Insert a newline between lines and after last line if
+	// y_type is MLINE.
+	if (y_current->y_type == MLINE || i < y_current->y_size - 1)
+	    ++len;
+    }
+
+    retval = alloc(len + 1);
+
+    // Copy the lines of the yank register into the string.
+    if (retval != NULL)
+    {
+	len = 0;
+	for (i = 0; i < y_current->y_size; ++i)
+	{
+	    STRCPY(retval + len, y_current->y_array[i]);
+	    len += (long)STRLEN(retval + len);
+
+	    // Insert a NL between lines and after the last line if y_type is
+	    // MLINE.
+	    if (y_current->y_type == MLINE || i < y_current->y_size - 1)
+		retval[len++] = '\n';
+	}
+	retval[len] = NUL;
+    }
+
+    return retval;
+}
+
+    static int
+init_write_reg(
+    int		name,
+    yankreg_T	**old_y_previous,
+    yankreg_T	**old_y_current,
+    int		must_append,
+    int		*yank_type UNUSED)
+{
+    if (!valid_yank_reg(name, TRUE))	    // check for valid reg name
+    {
+	emsg_invreg(name);
+	return FAIL;
+    }
+
+    // Don't want to change the current (unnamed) register
+    *old_y_previous = y_previous;
+    *old_y_current = y_current;
+
+    get_yank_register(name, TRUE);
+    if (!y_append && !must_append)
+	free_yank_all();
+    return OK;
+}
+
+    static void
+finish_write_reg(
+    int		name,
+    yankreg_T	*old_y_previous,
+    yankreg_T	*old_y_current)
+{
+# ifdef FEAT_CLIPBOARD
+    // Send text of clipboard register to the clipboard.
+    may_set_selection();
+# endif
+
+    // ':let @" = "val"' should change the meaning of the "" register
+    if (name != '"')
+	y_previous = old_y_previous;
+    y_current = old_y_current;
+}
+
+/*
+ * Store string "str" in register "name".
+ * "maxlen" is the maximum number of bytes to use, -1 for all bytes.
+ * If "must_append" is TRUE, always append to the register.  Otherwise append
+ * if "name" is an uppercase letter.
+ * Note: "maxlen" and "must_append" don't work for the "/" register.
+ * Careful: 'str' is modified, you may have to use a copy!
+ * If "str" ends in '\n' or '\r', use linewise, otherwise use characterwise.
+ */
+    void
+write_reg_contents(
+    int		name,
+    char_u	*str,
+    int		maxlen,
+    int		must_append)
+{
+    write_reg_contents_ex(name, str, maxlen, must_append, MAUTO, 0L);
+}
+
+    void
+write_reg_contents_lst(
+    int		name,
+    char_u	**strings,
+    int		maxlen UNUSED,
+    int		must_append,
+    int		yank_type,
+    long	block_len)
+{
+    yankreg_T  *old_y_previous, *old_y_current;
+
+    if (name == '/' || name == '=')
+    {
+	char_u	*s;
+
+	if (strings[0] == NULL)
+	    s = (char_u *)"";
+	else if (strings[1] != NULL)
+	{
+	    emsg(_("E883: search pattern and expression register may not "
+			"contain two or more lines"));
+	    return;
+	}
+	else
+	    s = strings[0];
+	write_reg_contents_ex(name, s, -1, must_append, yank_type, block_len);
+	return;
+    }
+
+    if (name == '_')	    // black hole: nothing to do
+	return;
+
+    if (init_write_reg(name, &old_y_previous, &old_y_current, must_append,
+		&yank_type) == FAIL)
+	return;
+
+    str_to_reg(y_current, yank_type, (char_u *) strings, -1, block_len, TRUE);
+
+    finish_write_reg(name, old_y_previous, old_y_current);
+}
+
+    void
+write_reg_contents_ex(
+    int		name,
+    char_u	*str,
+    int		maxlen,
+    int		must_append,
+    int		yank_type,
+    long	block_len)
+{
+    yankreg_T	*old_y_previous, *old_y_current;
+    long	len;
+
+    if (maxlen >= 0)
+	len = maxlen;
+    else
+	len = (long)STRLEN(str);
+
+    // Special case: '/' search pattern
+    if (name == '/')
+    {
+	set_last_search_pat(str, RE_SEARCH, TRUE, TRUE);
+	return;
+    }
+
+    if (name == '#')
+    {
+	buf_T	*buf;
+
+	if (VIM_ISDIGIT(*str))
+	{
+	    int	num = atoi((char *)str);
+
+	    buf = buflist_findnr(num);
+	    if (buf == NULL)
+		semsg(_(e_nobufnr), (long)num);
+	}
+	else
+	    buf = buflist_findnr(buflist_findpat(str, str + STRLEN(str),
+							 TRUE, FALSE, FALSE));
+	if (buf == NULL)
+	    return;
+	curwin->w_alt_fnum = buf->b_fnum;
+	return;
+    }
+
+    if (name == '=')
+    {
+	char_u	    *p, *s;
+
+	p = vim_strnsave(str, (int)len);
+	if (p == NULL)
+	    return;
+	if (must_append)
+	{
+	    s = concat_str(get_expr_line_src(), p);
+	    vim_free(p);
+	    p = s;
+	}
+	set_expr_line(p);
+	return;
+    }
+
+    if (name == '_')	    // black hole: nothing to do
+	return;
+
+    if (init_write_reg(name, &old_y_previous, &old_y_current, must_append,
+		&yank_type) == FAIL)
+	return;
+
+    str_to_reg(y_current, yank_type, str, len, block_len, FALSE);
+
+    finish_write_reg(name, old_y_previous, old_y_current);
+}
+#endif	// FEAT_EVAL
+
+#if defined(FEAT_CLIPBOARD) || defined(FEAT_EVAL)
+/*
+ * Put a string into a register.  When the register is not empty, the string
+ * is appended.
+ */
+    static void
+str_to_reg(
+    yankreg_T	*y_ptr,		// pointer to yank register
+    int		yank_type,	// MCHAR, MLINE, MBLOCK, MAUTO
+    char_u	*str,		// string to put in register
+    long	len,		// length of string
+    long	blocklen,	// width of Visual block
+    int		str_list)	// TRUE if str is char_u **
+{
+    int		type;			// MCHAR, MLINE or MBLOCK
+    int		lnum;
+    long	start;
+    long	i;
+    int		extra;
+    int		newlines;		// number of lines added
+    int		extraline = 0;		// extra line at the end
+    int		append = FALSE;		// append to last line in register
+    char_u	*s;
+    char_u	**ss;
+    char_u	**pp;
+    long	maxlen;
+
+    if (y_ptr->y_array == NULL)		// NULL means empty register
+	y_ptr->y_size = 0;
+
+    if (yank_type == MAUTO)
+	type = ((str_list || (len > 0 && (str[len - 1] == NL
+					    || str[len - 1] == CAR)))
+							     ? MLINE : MCHAR);
+    else
+	type = yank_type;
+
+    // Count the number of lines within the string
+    newlines = 0;
+    if (str_list)
+    {
+	for (ss = (char_u **) str; *ss != NULL; ++ss)
+	    ++newlines;
+    }
+    else
+    {
+	for (i = 0; i < len; i++)
+	    if (str[i] == '\n')
+		++newlines;
+	if (type == MCHAR || len == 0 || str[len - 1] != '\n')
+	{
+	    extraline = 1;
+	    ++newlines;	// count extra newline at the end
+	}
+	if (y_ptr->y_size > 0 && y_ptr->y_type == MCHAR)
+	{
+	    append = TRUE;
+	    --newlines;	// uncount newline when appending first line
+	}
+    }
+
+    // Without any lines make the register empty.
+    if (y_ptr->y_size + newlines == 0)
+    {
+	VIM_CLEAR(y_ptr->y_array);
+	return;
+    }
+
+    // Allocate an array to hold the pointers to the new register lines.
+    // If the register was not empty, move the existing lines to the new array.
+    pp = lalloc_clear((y_ptr->y_size + newlines) * sizeof(char_u *), TRUE);
+    if (pp == NULL)	// out of memory
+	return;
+    for (lnum = 0; lnum < y_ptr->y_size; ++lnum)
+	pp[lnum] = y_ptr->y_array[lnum];
+    vim_free(y_ptr->y_array);
+    y_ptr->y_array = pp;
+    maxlen = 0;
+
+    // Find the end of each line and save it into the array.
+    if (str_list)
+    {
+	for (ss = (char_u **) str; *ss != NULL; ++ss, ++lnum)
+	{
+	    i = (long)STRLEN(*ss);
+	    pp[lnum] = vim_strnsave(*ss, i);
+	    if (i > maxlen)
+		maxlen = i;
+	}
+    }
+    else
+    {
+	for (start = 0; start < len + extraline; start += i + 1)
+	{
+	    for (i = start; i < len; ++i)	// find the end of the line
+		if (str[i] == '\n')
+		    break;
+	    i -= start;			// i is now length of line
+	    if (i > maxlen)
+		maxlen = i;
+	    if (append)
+	    {
+		--lnum;
+		extra = (int)STRLEN(y_ptr->y_array[lnum]);
+	    }
+	    else
+		extra = 0;
+	    s = alloc(i + extra + 1);
+	    if (s == NULL)
+		break;
+	    if (extra)
+		mch_memmove(s, y_ptr->y_array[lnum], (size_t)extra);
+	    if (append)
+		vim_free(y_ptr->y_array[lnum]);
+	    if (i)
+		mch_memmove(s + extra, str + start, (size_t)i);
+	    extra += i;
+	    s[extra] = NUL;
+	    y_ptr->y_array[lnum++] = s;
+	    while (--extra >= 0)
+	    {
+		if (*s == NUL)
+		    *s = '\n';	    // replace NUL with newline
+		++s;
+	    }
+	    append = FALSE;		    // only first line is appended
+	}
+    }
+    y_ptr->y_type = type;
+    y_ptr->y_size = lnum;
+    if (type == MBLOCK)
+	y_ptr->y_width = (blocklen < 0 ? maxlen - 1 : blocklen);
+    else
+	y_ptr->y_width = 0;
+# ifdef FEAT_VIMINFO
+    y_ptr->y_time_set = vim_time();
+# endif
+}
+#endif // FEAT_CLIPBOARD || FEAT_EVAL || PROTO
diff --git a/src/structs.h b/src/structs.h
index 2dc14c2..e3c73cd 100644
--- a/src/structs.h
+++ b/src/structs.h
@@ -587,23 +587,23 @@
  */
 typedef struct
 {
-    char_u	*cmdbuff;	/* pointer to command line buffer */
-    int		cmdbufflen;	/* length of cmdbuff */
-    int		cmdlen;		/* number of chars in command line */
-    int		cmdpos;		/* current cursor position */
-    int		cmdspos;	/* cursor column on screen */
-    int		cmdfirstc;	/* ':', '/', '?', '=', '>' or NUL */
-    int		cmdindent;	/* number of spaces before cmdline */
-    char_u	*cmdprompt;	/* message in front of cmdline */
-    int		cmdattr;	/* attributes for prompt */
-    int		overstrike;	/* Typing mode on the command line.  Shared by
-				   getcmdline() and put_on_cmdline(). */
-    expand_T	*xpc;		/* struct being used for expansion, xp_pattern
-				   may point into cmdbuff */
-    int		xp_context;	/* type of expansion */
+    char_u	*cmdbuff;	// pointer to command line buffer
+    int		cmdbufflen;	// length of cmdbuff
+    int		cmdlen;		// number of chars in command line
+    int		cmdpos;		// current cursor position
+    int		cmdspos;	// cursor column on screen
+    int		cmdfirstc;	// ':', '/', '?', '=', '>' or NUL
+    int		cmdindent;	// number of spaces before cmdline
+    char_u	*cmdprompt;	// message in front of cmdline
+    int		cmdattr;	// attributes for prompt
+    int		overstrike;	// Typing mode on the command line.  Shared by
+				// getcmdline() and put_on_cmdline().
+    expand_T	*xpc;		// struct being used for expansion, xp_pattern
+				// may point into cmdbuff
+    int		xp_context;	// type of expansion
 # ifdef FEAT_EVAL
-    char_u	*xp_arg;	/* user-defined expansion arg */
-    int		input_fn;	/* when TRUE Invoked for input() function */
+    char_u	*xp_arg;	// user-defined expansion arg
+    int		input_fn;	// when TRUE Invoked for input() function
 # endif
 } cmdline_info_T;
 
@@ -1150,10 +1150,10 @@
  */
 typedef struct hist_entry
 {
-    int		hisnum;		/* identifying number */
-    int		viminfo;	/* when TRUE hisstr comes from viminfo */
-    char_u	*hisstr;	/* actual entry, separator char after the NUL */
-    time_t	time_set;	/* when it was typed, zero if unknown */
+    int		hisnum;		// identifying number
+    int		viminfo;	// when TRUE hisstr comes from viminfo
+    char_u	*hisstr;	// actual entry, separator char after the NUL
+    time_t	time_set;	// when it was typed, zero if unknown
 } histentry_T;
 
 #define CONV_NONE		0
@@ -1579,23 +1579,23 @@
     ino_t	sn_ino;
 # endif
 # ifdef FEAT_PROFILE
-    int		sn_prof_on;	/* TRUE when script is/was profiled */
-    int		sn_pr_force;	/* forceit: profile functions in this script */
-    proftime_T	sn_pr_child;	/* time set when going into first child */
-    int		sn_pr_nest;	/* nesting for sn_pr_child */
-    /* profiling the script as a whole */
-    int		sn_pr_count;	/* nr of times sourced */
-    proftime_T	sn_pr_total;	/* time spent in script + children */
-    proftime_T	sn_pr_self;	/* time spent in script itself */
-    proftime_T	sn_pr_start;	/* time at script start */
-    proftime_T	sn_pr_children; /* time in children after script start */
-    /* profiling the script per line */
-    garray_T	sn_prl_ga;	/* things stored for every line */
-    proftime_T	sn_prl_start;	/* start time for current line */
-    proftime_T	sn_prl_children; /* time spent in children for this line */
-    proftime_T	sn_prl_wait;	/* wait start time for current line */
-    int		sn_prl_idx;	/* index of line being timed; -1 if none */
-    int		sn_prl_execed;	/* line being timed was executed */
+    int		sn_prof_on;	// TRUE when script is/was profiled
+    int		sn_pr_force;	// forceit: profile functions in this script
+    proftime_T	sn_pr_child;	// time set when going into first child
+    int		sn_pr_nest;	// nesting for sn_pr_child
+    // profiling the script as a whole
+    int		sn_pr_count;	// nr of times sourced
+    proftime_T	sn_pr_total;	// time spent in script + children
+    proftime_T	sn_pr_self;	// time spent in script itself
+    proftime_T	sn_pr_start;	// time at script start
+    proftime_T	sn_pr_children; // time in children after script start
+    // profiling the script per line
+    garray_T	sn_prl_ga;	// things stored for every line
+    proftime_T	sn_prl_start;	// start time for current line
+    proftime_T	sn_prl_children; // time spent in children for this line
+    proftime_T	sn_prl_wait;	// wait start time for current line
+    int		sn_prl_idx;	// index of line being timed; -1 if none
+    int		sn_prl_execed;	// line being timed was executed
 # endif
 } scriptitem_T;
 
@@ -1603,9 +1603,9 @@
 /* Struct used in sn_prl_ga for every line of a script. */
 typedef struct sn_prl_S
 {
-    int		snp_count;	/* nr of times line was executed */
-    proftime_T	sn_prl_total;	/* time spent in a line + children */
-    proftime_T	sn_prl_self;	/* time spent in a line itself */
+    int		snp_count;	// nr of times line was executed
+    proftime_T	sn_prl_total;	// time spent in a line + children
+    proftime_T	sn_prl_self;	// time spent in a line itself
 } sn_prl_T;
 
 #  define PRL_ITEM(si, idx)	(((sn_prl_T *)(si)->sn_prl_ga.ga_data)[(idx)])
@@ -2345,7 +2345,7 @@
     garray_T	b_ucmds;
     // start and end of an operator, also used for '[ and ']
     pos_T	b_op_start;
-    pos_T	b_op_start_orig;  /* used for Insstart_orig */
+    pos_T	b_op_start_orig;  // used for Insstart_orig
     pos_T	b_op_end;
 
 #ifdef FEAT_VIMINFO
@@ -3223,8 +3223,8 @@
     long	w_scbind_pos;
 
 #ifdef FEAT_EVAL
-    dictitem_T	w_winvar;	/* variable for "w:" Dictionary */
-    dict_T	*w_vars;	/* internal variables, local to window */
+    dictitem_T	w_winvar;	// variable for "w:" Dictionary
+    dict_T	*w_vars;	// internal variables, local to window
 #endif
 
     /*
@@ -3793,9 +3793,9 @@
 // Variable flavor
 typedef enum
 {
-    VAR_FLAVOUR_DEFAULT,	/* doesn't start with uppercase */
-    VAR_FLAVOUR_SESSION,	/* starts with uppercase, some lower */
-    VAR_FLAVOUR_VIMINFO		/* all uppercase */
+    VAR_FLAVOUR_DEFAULT,	// doesn't start with uppercase
+    VAR_FLAVOUR_SESSION,	// starts with uppercase, some lower
+    VAR_FLAVOUR_VIMINFO		// all uppercase
 } var_flavour_T;
 
 // argument for mouse_find_win()
@@ -3829,6 +3829,26 @@
 # define NUM_REGISTERS		37
 #endif
 
+// structure used by block_prep, op_delete and op_yank for blockwise operators
+// also op_change, op_shift, op_insert, op_replace - AKelly
+struct block_def
+{
+    int		startspaces;	// 'extra' cols before first char
+    int		endspaces;	// 'extra' cols after last char
+    int		textlen;	// chars in block
+    char_u	*textstart;	// pointer to 1st char (partially) in block
+    colnr_T	textcol;	// index of chars (partially) in block
+    colnr_T	start_vcol;	// start col of 1st char wholly inside block
+    colnr_T	end_vcol;	// start col of 1st char wholly after block
+    int		is_short;	// TRUE if line is too short to fit in block
+    int		is_MAX;		// TRUE if curswant==MAXCOL when starting
+    int		is_oneChar;	// TRUE if block within one character
+    int		pre_whitesp;	// screen cols of ws before block
+    int		pre_whitesp_c;	// chars of ws before block
+    colnr_T	end_char_vcols;	// number of vcols of post-block char
+    colnr_T	start_char_vcols; // number of vcols of pre-block char
+};
+
 // Each yank register has an array of pointers to lines.
 typedef struct
 {
diff --git a/src/version.c b/src/version.c
index 4bf2106..401c18d 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    2077,
+/**/
     2076,
 /**/
     2075,
