changeset 13425:bb789ed5113a v8.0.1587

patch 8.0.1587: inserting from the clipboard doesn't work literally commit https://github.com/vim/vim/commit/3324d0a86421a634572758dcfde917547f4d4c67 Author: Bram Moolenaar <Bram@vim.org> Date: Tue Mar 6 19:51:13 2018 +0100 patch 8.0.1587: inserting from the clipboard doesn't work literally Problem: inserting from the clipboard doesn't work literally Solution: When pasting from the * or + register always assume literally.
author Christian Brabandt <cb@256bit.org>
date Tue, 06 Mar 2018 20:00:07 +0100
parents 22b13b27d9fe
children c953267b2849
files src/ops.c src/proto/ops.pro src/testdir/test_paste.vim src/version.c
diffstat 4 files changed, 38 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/ops.c
+++ b/src/ops.c
@@ -899,17 +899,21 @@ valid_yank_reg(
  *
  * 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).
  */
-    void
+    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;
+	return ret;
     }
     i = regname;
     if (VIM_ISDIGIT(i))
@@ -926,10 +930,16 @@ get_yank_register(int regname, int writi
 #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 == '~')
@@ -940,6 +950,7 @@ get_yank_register(int regname, int writi
     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)
@@ -1387,12 +1398,13 @@ put_in_typebuf(
     int
 insert_reg(
     int		regname,
-    int		literally)	/* insert literally, not as if typed */
+    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
@@ -1423,7 +1435,8 @@ insert_reg(
     }
     else				/* name or number register */
     {
-	get_yank_register(regname, FALSE);
+	if (get_yank_register(regname, FALSE))
+	    literally = TRUE;
 	if (y_current->y_array == NULL)
 	    retval = FAIL;
 	else
@@ -1580,12 +1593,14 @@ get_spec_reg(
     int
 cmdline_paste_reg(
     int regname,
-    int literally,	/* Insert text literally instead of "as typed" */
+    int literally_arg,	/* Insert text literally instead of "as typed" */
     int remcr)		/* don't add CR characters */
 {
     long	i;
-
-    get_yank_register(regname, FALSE);
+    int		literally = literally_arg;
+
+    if (get_yank_register(regname, FALSE))
+	literally = TRUE;
     if (y_current->y_array == NULL)
 	return FAIL;
 
--- a/src/proto/ops.pro
+++ b/src/proto/ops.pro
@@ -11,7 +11,7 @@ void set_expr_line(char_u *new_line);
 char_u *get_expr_line(void);
 char_u *get_expr_line_src(void);
 int valid_yank_reg(int regname, int writing);
-void get_yank_register(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);
@@ -19,7 +19,7 @@ void free_register(void *reg);
 int yank_register_mline(int regname);
 int do_record(int c);
 int do_execreg(int regname, int colon, int addcr, int silent);
-int insert_reg(int regname, int literally);
+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, int remcr);
 void adjust_clip_reg(int *rp);
--- a/src/testdir/test_paste.vim
+++ b/src/testdir/test_paste.vim
@@ -1,4 +1,4 @@
-" Tests for bracketed paste.
+" Tests for bracketed paste and other forms of pasting.
 
 " Bracketed paste only works with "xterm".  Not in GUI.
 if has('gui_running')
@@ -66,6 +66,17 @@ func Test_paste_insert_mode()
   bwipe!
 endfunc
 
+func Test_paste_clipboard()
+  if !has('clipboard')
+    return
+  endif
+  let @+ = "nasty\<Esc>:!ls\<CR>command"
+  new
+  exe "normal i\<C-R>+\<Esc>"
+  call assert_equal("nasty\<Esc>:!ls\<CR>command", getline(1))
+  bwipe!
+endfunc
+
 func Test_paste_cmdline()
   call feedkeys(":a\<Esc>[200~foo\<CR>bar\<Esc>[201~b\<Home>\"\<CR>", 'xt')
   call assert_equal("\"afoo\<CR>barb", getreg(':'))
--- a/src/version.c
+++ b/src/version.c
@@ -767,6 +767,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1587,
+/**/
     1586,
 /**/
     1585,