summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2012-07-10 16:49:23 +0200
committerBram Moolenaar <Bram@vim.org>2012-07-10 16:49:23 +0200
commitc0885aad5c40ea04f4b6a2462602273e06467516 (patch)
treedb0c71077a37dc205dd17a6371d763688b30218e /src
parentf65e5667dfd0281fa197638ab3361f0bc007fc14 (diff)
downloadvim-git-c0885aad5c40ea04f4b6a2462602273e06467516.tar.gz
updated for version 7.3.597v7.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'.
Diffstat (limited to 'src')
-rw-r--r--src/globals.h3
-rw-r--r--src/gui.c2
-rw-r--r--src/normal.c2
-rw-r--r--src/ops.c13
-rw-r--r--src/option.h1
-rw-r--r--src/proto/ui.pro8
-rw-r--r--src/screen.c21
-rw-r--r--src/ui.c107
-rw-r--r--src/version.c2
9 files changed, 101 insertions, 58 deletions
diff --git a/src/globals.h b/src/globals.h
index 615cdf7c6..81cdabba2 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -517,7 +517,8 @@ EXTERN VimClipboard clip_plus; /* CLIPBOARD selection in X11 */
# 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
index caf1f1205..f30952c31 100644
--- 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
index 8134adb2d..66654f8d7 100644
--- a/src/normal.c
+++ b/src/normal.c
@@ -1451,7 +1451,7 @@ do_pending_operator(cap, old_col, gui_yank)
* 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
index 2c054d9b8..c60f3375e 100644
--- 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
index 756cd1aaf..b0cbe1294 100644
--- 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
index 7b65680bf..813d496ad 100644
--- a/src/proto/ui.pro
+++ b/src/proto/ui.pro
@@ -11,17 +11,17 @@ void ui_set_shellsize __ARGS((int mustset));
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
index 64d06ebe0..c9f447c9c 100644
--- 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, nochange)
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, end, wp)
|| (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, end, force, wp)
|| (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
index 4c4c2eefb..d164376d4 100644
--- 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_click)
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, repeated_click)
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
index 80abb73ee..afd4d7cc3 100644
--- 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,