diff options
-rw-r--r-- | src/ops.c | 27 | ||||
-rw-r--r-- | src/proto/ops.pro | 4 | ||||
-rw-r--r-- | src/testdir/test_paste.vim | 13 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 37 insertions, 9 deletions
@@ -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, |