# HG changeset patch # User Bram Moolenaar # Date 1341931763 -7200 # Node ID b9aa7fb4a9281b87a651251f799e049409634757 # Parent cc076119f07a150a6695aeaa1ae74c5e3e323fce updated for version 7.3.597 Problem: 'clipboard' "autoselect" only applies to the * register. (Sergey Vakulenko) Solution: Make 'autoselect' work for the + register. (Christian Brabant) Add the "autoselectplus" option in 'clipboard' and the "P" flag in 'guioptions'. diff --git a/runtime/doc/options.txt b/runtime/doc/options.txt --- a/runtime/doc/options.txt +++ b/runtime/doc/options.txt @@ -1452,6 +1452,7 @@ A jump table for the options with a shor This option is a list of comma separated names. These names are recognized: + *clipboard-unnamed* unnamed When included, Vim will use the clipboard register '*' for all yank, delete, change and put operations which would normally go to the unnamed register. When a @@ -1481,9 +1482,16 @@ A jump table for the options with a shor "autoselect" flag is used. Also applies to the modeless selection. + *clipboard-autoselectplus* + autoselectplus Like "autoselect" but using the + register instead of + the * register. Compare to the 'P' flag in + 'guioptions'. + + *clipboard-autoselectml* autoselectml Like "autoselect", but for the modeless selection only. Compare to the 'A' flag in 'guioptions'. + *clipboard-html* html When the clipboard contains HTML, use this when pasting. When putting text on the clipboard, mark it as HTML. This works to copy rendered HTML from @@ -1494,6 +1502,7 @@ A jump table for the options with a shor Only supported for GTK version 2 and later. Only available with the |+multi_byte| feature. + *clipboard-exclude* exclude:{pattern} Defines a pattern that is matched against the name of the terminal 'term'. If there is a match, no @@ -3589,6 +3598,9 @@ A jump table for the options with a shor windowing system's global selection unless explicitly told to by a yank or delete operation for the "* register. The same applies to the modeless selection. + *'go-P'* + 'P' Like autoselect but using the "+ register instead of the "* + register. *'go-A'* 'A' Autoselect for the modeless selection. Like 'a', but only applies to the modeless selection. diff --git a/src/globals.h b/src/globals.h --- a/src/globals.h +++ b/src/globals.h @@ -517,7 +517,8 @@ EXTERN VimClipboard clip_plus; /* CLIPBO # define CLIP_UNNAMED_PLUS 2 EXTERN int clip_unnamed INIT(= 0); /* above two values or'ed */ -EXTERN int clip_autoselect INIT(= FALSE); +EXTERN int clip_autoselect_star INIT(= FALSE); +EXTERN int clip_autoselect_plus INIT(= FALSE); EXTERN int clip_autoselectml INIT(= FALSE); EXTERN int clip_html INIT(= FALSE); EXTERN regprog_T *clip_exclude_prog INIT(= NULL); diff --git a/src/gui.c b/src/gui.c --- a/src/gui.c +++ b/src/gui.c @@ -3154,7 +3154,7 @@ button_set: } if (clip_star.state != SELECT_CLEARED && !did_clip) - clip_clear_selection(); + clip_clear_selection(&clip_star); #endif /* Don't put events in the input queue now. */ diff --git a/src/normal.c b/src/normal.c --- a/src/normal.c +++ b/src/normal.c @@ -1451,7 +1451,7 @@ do_pending_operator(cap, old_col, gui_ya * This could call do_pending_operator() recursively, but that's OK * because gui_yank will be TRUE for the nested call. */ - if (clip_star.available + if ((clip_star.available || clip_plus.available) && oap->op_type != OP_NOP && !gui_yank # ifdef FEAT_VISUAL diff --git a/src/ops.c b/src/ops.c --- a/src/ops.c +++ b/src/ops.c @@ -962,8 +962,14 @@ get_register(name, copy) * selection too. */ if (name == '*' && clip_star.available) { - if (clip_isautosel()) - clip_update_selection(); + if (clip_isautosel_star()) + clip_update_selection(&clip_star); + may_get_selection(name); + } + if (name == '+' && clip_plus.available) + { + if (clip_isautosel_plus()) + clip_update_selection(&clip_plus); may_get_selection(name); } #endif @@ -3190,7 +3196,8 @@ op_yank(oap, deleting, mess) clip_own_selection(&clip_plus); clip_gen_set_selection(&clip_plus); - if (!clip_isautosel() && !did_star && curr == &(y_regs[PLUS_REGISTER])) + if (!clip_isautosel_star() && !did_star + && curr == &(y_regs[PLUS_REGISTER])) { copy_yank_reg(&(y_regs[STAR_REGISTER])); clip_own_selection(&clip_star); diff --git a/src/option.h b/src/option.h --- a/src/option.h +++ b/src/option.h @@ -229,6 +229,7 @@ #define GO_MENUS 'm' /* use menu bar */ #define GO_NOSYSMENU 'M' /* don't source system menu */ #define GO_POINTER 'p' /* pointer enter/leave callbacks */ +#define GO_ASELPLUS 'P' /* autoselectPlus */ #define GO_RIGHT 'r' /* use right scrollbar */ #define GO_VRIGHT 'R' /* right scrollbar with vert split */ #define GO_TEAROFF 't' /* add tear-off menu items */ diff --git a/src/proto/ui.pro b/src/proto/ui.pro --- a/src/proto/ui.pro +++ b/src/proto/ui.pro @@ -11,17 +11,17 @@ void ui_set_shellsize __ARGS((int mustse void ui_new_shellsize __ARGS((void)); void ui_breakcheck __ARGS((void)); void clip_init __ARGS((int can_use)); -void clip_update_selection __ARGS((void)); +void clip_update_selection __ARGS((VimClipboard *clip)); void clip_own_selection __ARGS((VimClipboard *cbd)); void clip_lose_selection __ARGS((VimClipboard *cbd)); -void clip_copy_selection __ARGS((void)); void clip_auto_select __ARGS((void)); -int clip_isautosel __ARGS((void)); +int clip_isautosel_star __ARGS((void)); +int clip_isautosel_plus __ARGS((void)); void clip_modeless __ARGS((int button, int is_click, int is_drag)); void clip_start_selection __ARGS((int col, int row, int repeated_click)); void clip_process_selection __ARGS((int button, int col, int row, int_u repeated_click)); void clip_may_redraw_selection __ARGS((int row, int col, int len)); -void clip_clear_selection __ARGS((void)); +void clip_clear_selection __ARGS((VimClipboard *cbd)); void clip_may_clear_selection __ARGS((int row1, int row2)); void clip_scroll_selection __ARGS((int rows)); void clip_copy_modeless_selection __ARGS((int both)); diff --git a/src/screen.c b/src/screen.c --- a/src/screen.c +++ b/src/screen.c @@ -519,8 +519,10 @@ update_screen(type) # endif # ifdef FEAT_CLIPBOARD /* When Visual area changed, may have to update selection. */ - if (clip_star.available && clip_isautosel()) - clip_update_selection(); + if (clip_star.available && clip_isautosel_star()) + clip_update_selection(&clip_star); + if (clip_plus.available && clip_isautosel_plus()) + clip_update_selection(&clip_plus); # endif #ifdef FEAT_GUI /* Remove the cursor before starting to do anything, because @@ -814,8 +816,10 @@ updateWindow(wp) #ifdef FEAT_CLIPBOARD /* When Visual area changed, may have to update selection. */ - if (clip_star.available && clip_isautosel()) - clip_update_selection(); + if (clip_star.available && clip_isautosel_star()) + clip_update_selection(&clip_star); + if (clip_plus.available && clip_isautosel_plus()) + clip_update_selection(&clip_plus); #endif win_update(wp); @@ -3000,7 +3004,10 @@ win_line(wp, lnum, startrow, endrow, noc area_highlighting = TRUE; attr = hl_attr(HLF_V); #if defined(FEAT_CLIPBOARD) && defined(FEAT_X11) - if (clip_star.available && !clip_star.owned && clip_isautosel()) + if ((clip_star.available && !clip_star.owned + && clip_isautosel_star()) + || (clip_plus.available && !clip_plus.owned + && clip_isautosel_plus())) attr = hl_attr(HLF_VNC); #endif } @@ -9060,7 +9067,7 @@ screen_ins_lines(off, row, line_count, e || (wp != NULL && wp->w_width != Columns) # endif ) - clip_clear_selection(); + clip_clear_selection(&clip_star); else clip_scroll_selection(-line_count); #endif @@ -9281,7 +9288,7 @@ screen_del_lines(off, row, line_count, e || (wp != NULL && wp->w_width != Columns) # endif ) - clip_clear_selection(); + clip_clear_selection(&clip_star); else clip_scroll_selection(line_count); #endif diff --git a/src/ui.c b/src/ui.c --- a/src/ui.c +++ b/src/ui.c @@ -381,6 +381,8 @@ ui_breakcheck() #if defined(FEAT_CLIPBOARD) || defined(PROTO) +static void clip_copy_selection __ARGS((VimClipboard *clip)); + /* * Selection stuff using Visual mode, for cutting and pasting text to other * windows. @@ -423,9 +425,10 @@ clip_init(can_use) * this is called whenever VIsual mode is ended. */ void -clip_update_selection() +clip_update_selection(clip) + VimClipboard *clip; { - pos_T start, end; + pos_T start, end; /* If visual mode is only due to a redo command ("."), then ignore it */ if (!redo_VIsual_busy && VIsual_active && (State & NORMAL)) @@ -444,17 +447,17 @@ clip_update_selection() start = curwin->w_cursor; end = VIsual; } - if (!equalpos(clip_star.start, start) - || !equalpos(clip_star.end, end) - || clip_star.vmode != VIsual_mode) + if (!equalpos(clip->start, start) + || !equalpos(clip->end, end) + || clip->vmode != VIsual_mode) { - clip_clear_selection(); - clip_star.start = start; - clip_star.end = end; - clip_star.vmode = VIsual_mode; - clip_free_selection(&clip_star); - clip_own_selection(&clip_star); - clip_gen_set_selection(&clip_star); + clip_clear_selection(clip); + clip->start = start; + clip->end = end; + clip->vmode = VIsual_mode; + clip_free_selection(clip); + clip_own_selection(clip); + clip_gen_set_selection(clip); } } } @@ -475,7 +478,7 @@ clip_own_selection(cbd) int was_owned = cbd->owned; cbd->owned = (clip_gen_own_selection(cbd) == OK); - if (!was_owned && cbd == &clip_star) + if (!was_owned && (cbd == &clip_star || cbd == &clip_plus)) { /* May have to show a different kind of highlighting for the * selected area. There is no specific redraw command for this, @@ -483,7 +486,8 @@ clip_own_selection(cbd) if (cbd->owned && (get_real_state() == VISUAL || get_real_state() == SELECTMODE) - && clip_isautosel() + && (cbd == &clip_star ? clip_isautosel_star() + : clip_isautosel_plus()) && hl_attr(HLF_V) != hl_attr(HLF_VNC)) redraw_curbuf_later(INVERTED_ALL); } @@ -502,12 +506,15 @@ clip_lose_selection(cbd) #ifdef FEAT_X11 int was_owned = cbd->owned; #endif - int visual_selection = (cbd == &clip_star); + int visual_selection = FALSE; + + if (cbd == &clip_star || cbd == &clip_plus) + visual_selection = TRUE; clip_free_selection(cbd); cbd->owned = FALSE; if (visual_selection) - clip_clear_selection(); + clip_clear_selection(cbd); clip_gen_lose_selection(cbd); #ifdef FEAT_X11 if (visual_selection) @@ -518,7 +525,8 @@ clip_lose_selection(cbd) if (was_owned && (get_real_state() == VISUAL || get_real_state() == SELECTMODE) - && clip_isautosel() + && (cbd == &clip_star ? + clip_isautosel_star() : clip_isautosel_plus()) && hl_attr(HLF_V) != hl_attr(HLF_VNC)) { update_curbuf(INVERTED_ALL); @@ -534,18 +542,18 @@ clip_lose_selection(cbd) #endif } - void -clip_copy_selection() + static void +clip_copy_selection(clip) + VimClipboard *clip; { - if (VIsual_active && (State & NORMAL) && clip_star.available) + if (VIsual_active && (State & NORMAL) && clip->available) { - if (clip_isautosel()) - clip_update_selection(); - clip_free_selection(&clip_star); - clip_own_selection(&clip_star); - if (clip_star.owned) - clip_get_selection(&clip_star); - clip_gen_set_selection(&clip_star); + clip_update_selection(clip); + clip_free_selection(clip); + clip_own_selection(clip); + if (clip->owned) + clip_get_selection(clip); + clip_gen_set_selection(clip); } } @@ -555,21 +563,38 @@ clip_copy_selection() void clip_auto_select() { - if (clip_isautosel()) - clip_copy_selection(); + if (clip_isautosel_star()) + clip_copy_selection(&clip_star); + if (clip_isautosel_plus()) + clip_copy_selection(&clip_plus); } /* - * Return TRUE if automatic selection of Visual area is desired. + * Return TRUE if automatic selection of Visual area is desired for the * + * register. */ int -clip_isautosel() +clip_isautosel_star() { return ( #ifdef FEAT_GUI gui.in_use ? (vim_strchr(p_go, GO_ASEL) != NULL) : #endif - clip_autoselect); + clip_autoselect_star); +} + +/* + * Return TRUE if automatic selection of Visual area is desired for the + + * register. + */ + int +clip_isautosel_plus() +{ + return ( +#ifdef FEAT_GUI + gui.in_use ? (vim_strchr(p_go, GO_ASELPLUS) != NULL) : +#endif + clip_autoselect_plus); } @@ -657,7 +682,7 @@ clip_start_selection(col, row, repeated_ VimClipboard *cb = &clip_star; if (cb->state == SELECT_DONE) - clip_clear_selection(); + clip_clear_selection(cb); row = check_row(row); col = check_col(col); @@ -749,7 +774,7 @@ clip_process_selection(button, col, row, printf("Selection ended: (%u,%u) to (%u,%u)\n", cb->start.lnum, cb->start.col, cb->end.lnum, cb->end.col); #endif - if (clip_isautosel() + if (clip_isautosel_star() || ( #ifdef FEAT_GUI gui.in_use ? (vim_strchr(p_go, GO_ASELML) != NULL) : @@ -932,16 +957,16 @@ clip_may_redraw_selection(row, col, len) * Called from outside to clear selected region from the display */ void -clip_clear_selection() +clip_clear_selection(cbd) + VimClipboard *cbd; { - VimClipboard *cb = &clip_star; - if (cb->state == SELECT_CLEARED) + if (cbd->state == SELECT_CLEARED) return; - clip_invert_area((int)cb->start.lnum, cb->start.col, (int)cb->end.lnum, - cb->end.col, CLIP_CLEAR); - cb->state = SELECT_CLEARED; + clip_invert_area((int)cbd->start.lnum, cbd->start.col, (int)cbd->end.lnum, + cbd->end.col, CLIP_CLEAR); + cbd->state = SELECT_CLEARED; } /* @@ -954,7 +979,7 @@ clip_may_clear_selection(row1, row2) if (clip_star.state == SELECT_DONE && row2 >= clip_star.start.lnum && row1 <= clip_star.end.lnum) - clip_clear_selection(); + clip_clear_selection(&clip_star); } /* diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -715,6 +715,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 597, +/**/ 596, /**/ 595,