Mercurial > vim
changeset 6543:b01ca71f93b2 v7.4.598
updated for version 7.4.598
Problem: ":tabdo windo echo 'hi'" causes "* register not to be changed.
(Salman Halim)
Solution: Change how clip_did_set_selection is used and add
clipboard_needs_update and global_change_count. (Christian
Brabandt)
author | Bram Moolenaar <bram@vim.org> |
---|---|
date | Tue, 27 Jan 2015 14:09:37 +0100 |
parents | f52b5c1d7bb0 |
children | 930ad67c0414 |
files | src/main.c src/testdir/test_eval.in src/testdir/test_eval.ok src/ui.c src/version.c |
diffstat | 5 files changed, 45 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- a/src/main.c +++ b/src/main.c @@ -959,17 +959,8 @@ vim_main2(int argc UNUSED, char **argv U if (p_im) need_start_insertmode = TRUE; -#ifdef FEAT_CLIPBOARD - if (clip_unnamed) - /* do not overwrite system clipboard while starting up */ - clip_did_set_selection = -1; -#endif #ifdef FEAT_AUTOCMD apply_autocmds(EVENT_VIMENTER, NULL, NULL, FALSE, curbuf); -# ifdef FEAT_CLIPBOARD - if (clip_did_set_selection < 0) - clip_did_set_selection = TRUE; -# endif TIME_MSG("VimEnter autocommands"); #endif
--- a/src/testdir/test_eval.in +++ b/src/testdir/test_eval.in @@ -1,7 +1,6 @@ Test for various eval features. vim: set ft=vim : -Note: system clipboard support is not tested. I do not think anybody will thank -me for messing with clipboard. +Note: system clipboard is saved, changed and restored. STARTTEST :so small.vim @@ -122,7 +121,19 @@ call SetReg('/', ['abc/']) call SetReg('/', ["abc/\n"]) call SetReg('=', ['"abc/"']) call SetReg('=', ["\"abc/\n\""]) - +$put ='{{{1 System clipboard' +" Save and restore system clipboard. +" If no connection to X-Server is possible, test should succeed. +:let _clipreg = ['+', getreg('+'), getregtype('+')] +:let _clipopt = &cb +:let &cb='unnamedplus' +:1y +:AR + +:tabdo :windo :echo "hi" +:3y +:AR + +:let &cb=_clipopt +:call call('setreg', _clipreg) $put ='{{{1 Errors' call ErrExe('call setreg()') call ErrExe('call setreg(1)')
index 59112d028e72a937287ae2d2b7e60a0a03bd4493..5e8d2cc4f6f0caa2b4386ceec8b3addb70c419a2 GIT binary patch literal 11538 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 QkneXzkIpo`xbNM60S}6Z!T<mO
--- a/src/ui.c +++ b/src/ui.c @@ -73,6 +73,8 @@ ui_write(s, len) static char_u *ta_str = NULL; static int ta_off; /* offset for next char to use when ta_str != NULL */ static int ta_len; /* length of ta_str when it's not NULL*/ +static int clipboard_needs_update; /* clipboard needs to be updated */ +static int global_change_count = 0; /* if set, inside a start_global_changes */ void ui_inchar_undo(s, len) @@ -569,9 +571,12 @@ clip_copy_selection(clip) void start_global_changes() { + if (++global_change_count > 1) + return; clip_unnamed_saved = clip_unnamed; + clipboard_needs_update = FALSE; - if (clip_did_set_selection > 0) + if (clip_did_set_selection) { clip_unnamed = FALSE; clip_did_set_selection = FALSE; @@ -584,22 +589,30 @@ start_global_changes() void end_global_changes() { - if (clip_did_set_selection == FALSE) /* not when -1 */ + if (--global_change_count > 0) + /* recursive */ + return; + if (!clip_did_set_selection) { clip_did_set_selection = TRUE; clip_unnamed = clip_unnamed_saved; - if (clip_unnamed & CLIP_UNNAMED) + clip_unnamed_saved = FALSE; + if (clipboard_needs_update) { - clip_own_selection(&clip_star); - clip_gen_set_selection(&clip_star); - } - if (clip_unnamed & CLIP_UNNAMED_PLUS) - { - clip_own_selection(&clip_plus); - clip_gen_set_selection(&clip_plus); + /* only store something in the clipboard, + * if we have yanked anything to it */ + if (clip_unnamed & CLIP_UNNAMED) + { + clip_own_selection(&clip_star); + clip_gen_set_selection(&clip_star); + } + if (clip_unnamed & CLIP_UNNAMED_PLUS) + { + clip_own_selection(&clip_plus); + clip_gen_set_selection(&clip_plus); + } } } - clip_unnamed_saved = FALSE; } /* @@ -1477,10 +1490,12 @@ clip_gen_set_selection(cbd) { /* Updating postponed, so that accessing the system clipboard won't * hang Vim when accessing it many times (e.g. on a :g comand). */ - if (cbd == &clip_plus && (clip_unnamed_saved & CLIP_UNNAMED_PLUS)) + if ((cbd == &clip_plus && (clip_unnamed_saved & CLIP_UNNAMED_PLUS)) + || (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED))) + { + clipboard_needs_update = TRUE; return; - else if (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED)) - return; + } } #ifdef FEAT_XCLIPBOARD # ifdef FEAT_GUI