summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2018-03-06 19:51:13 +0100
committerBram Moolenaar <Bram@vim.org>2018-03-06 19:51:13 +0100
commit3324d0a86421a634572758dcfde917547f4d4c67 (patch)
tree6b110fec6247516506f1235179cf52d3a8a63b6e
parent201dc67db587e77a845fd24681352d61e57156e2 (diff)
downloadvim-git-3324d0a86421a634572758dcfde917547f4d4c67.tar.gz
patch 8.0.1587: inserting from the clipboard doesn't work literallyv8.0.1587
Problem: inserting from the clipboard doesn't work literally Solution: When pasting from the * or + register always assume literally.
-rw-r--r--src/ops.c27
-rw-r--r--src/proto/ops.pro4
-rw-r--r--src/testdir/test_paste.vim13
-rw-r--r--src/version.c2
4 files changed, 37 insertions, 9 deletions
diff --git a/src/ops.c b/src/ops.c
index 2c80c592d..cb019cfd0 100644
--- 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 writing)
#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 writing)
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;
+ int literally = literally_arg;
- get_yank_register(regname, FALSE);
+ if (get_yank_register(regname, FALSE))
+ literally = TRUE;
if (y_current->y_array == NULL)
return FAIL;
diff --git a/src/proto/ops.pro b/src/proto/ops.pro
index 0740ddad3..b00cc50a4 100644
--- 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);
diff --git a/src/testdir/test_paste.vim b/src/testdir/test_paste.vim
index 440dc7f1f..6450989ec 100644
--- 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(':'))
diff --git a/src/version.c b/src/version.c
index 128be31e9..8cfc17c5f 100644
--- 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,