0
0
mirror of https://github.com/vim/vim.git synced 2025-09-24 03:44:06 -04:00

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)
This commit is contained in:
Bram Moolenaar
2015-01-27 14:09:37 +01:00
parent 9a492d456d
commit 5c27fd100a
5 changed files with 45 additions and 26 deletions

View File

@@ -959,17 +959,8 @@ vim_main2(int argc UNUSED, char **argv UNUSED)
if (p_im) if (p_im)
need_start_insertmode = TRUE; 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 #ifdef FEAT_AUTOCMD
apply_autocmds(EVENT_VIMENTER, NULL, NULL, FALSE, curbuf); 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"); TIME_MSG("VimEnter autocommands");
#endif #endif

View File

@@ -1,7 +1,6 @@
Test for various eval features. vim: set ft=vim : Test for various eval features. vim: set ft=vim :
Note: system clipboard support is not tested. I do not think anybody will thank Note: system clipboard is saved, changed and restored.
me for messing with clipboard.
STARTTEST STARTTEST
:so small.vim :so small.vim
@@ -122,7 +121,19 @@ call SetReg('/', ['abc/'])
call SetReg('/', ["abc/\n"]) call SetReg('/', ["abc/\n"])
call SetReg('=', ['"abc/"']) call SetReg('=', ['"abc/"'])
call SetReg('=', ["\"abc/\n\""]) 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' $put ='{{{1 Errors'
call ErrExe('call setreg()') call ErrExe('call setreg()')
call ErrExe('call setreg(1)') call ErrExe('call setreg(1)')

Binary file not shown.

View File

@@ -73,6 +73,8 @@ ui_write(s, len)
static char_u *ta_str = NULL; static char_u *ta_str = NULL;
static int ta_off; /* offset for next char to use when 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 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 void
ui_inchar_undo(s, len) ui_inchar_undo(s, len)
@@ -569,9 +571,12 @@ clip_copy_selection(clip)
void void
start_global_changes() start_global_changes()
{ {
if (++global_change_count > 1)
return;
clip_unnamed_saved = clip_unnamed; clip_unnamed_saved = clip_unnamed;
clipboard_needs_update = FALSE;
if (clip_did_set_selection > 0) if (clip_did_set_selection)
{ {
clip_unnamed = FALSE; clip_unnamed = FALSE;
clip_did_set_selection = FALSE; clip_did_set_selection = FALSE;
@@ -584,22 +589,30 @@ start_global_changes()
void void
end_global_changes() 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_did_set_selection = TRUE;
clip_unnamed = clip_unnamed_saved; clip_unnamed = clip_unnamed_saved;
if (clip_unnamed & CLIP_UNNAMED) clip_unnamed_saved = FALSE;
if (clipboard_needs_update)
{ {
clip_own_selection(&clip_star); /* only store something in the clipboard,
clip_gen_set_selection(&clip_star); * if we have yanked anything to it */
} if (clip_unnamed & CLIP_UNNAMED)
if (clip_unnamed & CLIP_UNNAMED_PLUS) {
{ clip_own_selection(&clip_star);
clip_own_selection(&clip_plus); clip_gen_set_selection(&clip_star);
clip_gen_set_selection(&clip_plus); }
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 /* Updating postponed, so that accessing the system clipboard won't
* hang Vim when accessing it many times (e.g. on a :g comand). */ * 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))
return; || (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED)))
else if (cbd == &clip_star && (clip_unnamed_saved & CLIP_UNNAMED)) {
clipboard_needs_update = TRUE;
return; return;
}
} }
#ifdef FEAT_XCLIPBOARD #ifdef FEAT_XCLIPBOARD
# ifdef FEAT_GUI # ifdef FEAT_GUI

View File

@@ -741,6 +741,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
598,
/**/ /**/
597, 597,
/**/ /**/