mirror of
https://github.com/vim/vim.git
synced 2025-09-26 04:04:07 -04:00
patch 8.2.2057: getting the selection may trigger TextYankPost autocmd
Problem: Getting the selection may trigger TextYankPost autocmd. Solution: Only trigger the autocommand when yanking in Vim, not for getting the selection. (closes #7367)
This commit is contained in:
@@ -2025,6 +2025,9 @@ clip_get_selection(Clipboard_T *cbd)
|
|||||||
&& get_y_register(STAR_REGISTER)->y_array != NULL))
|
&& get_y_register(STAR_REGISTER)->y_array != NULL))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Avoid triggering autocmds such as TextYankPost.
|
||||||
|
block_autocmds();
|
||||||
|
|
||||||
// Get the text between clip_star.start & clip_star.end
|
// Get the text between clip_star.start & clip_star.end
|
||||||
old_y_previous = get_y_previous();
|
old_y_previous = get_y_previous();
|
||||||
old_y_current = get_y_current();
|
old_y_current = get_y_current();
|
||||||
@@ -2054,6 +2057,8 @@ clip_get_selection(Clipboard_T *cbd)
|
|||||||
curbuf->b_op_end = old_op_end;
|
curbuf->b_op_end = old_op_end;
|
||||||
VIsual = old_visual;
|
VIsual = old_visual;
|
||||||
VIsual_mode = old_visual_mode;
|
VIsual_mode = old_visual_mode;
|
||||||
|
|
||||||
|
unblock_autocmds();
|
||||||
}
|
}
|
||||||
else if (!is_clipboard_needs_update())
|
else if (!is_clipboard_needs_update())
|
||||||
{
|
{
|
||||||
|
32
src/normal.c
32
src/normal.c
@@ -1325,6 +1325,26 @@ check_visual_highlight(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(FEAT_CLIPBOARD) && defined(FEAT_EVAL)
|
||||||
|
/*
|
||||||
|
* Call yank_do_autocmd() for "regname".
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
call_yank_do_autocmd(int regname)
|
||||||
|
{
|
||||||
|
oparg_T oa;
|
||||||
|
yankreg_T *reg;
|
||||||
|
|
||||||
|
clear_oparg(&oa);
|
||||||
|
oa.regname = regname;
|
||||||
|
oa.op_type = OP_YANK;
|
||||||
|
oa.is_VIsual = TRUE;
|
||||||
|
reg = get_register(regname, TRUE);
|
||||||
|
yank_do_autocmd(&oa, reg);
|
||||||
|
free_register(reg);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* End Visual mode.
|
* End Visual mode.
|
||||||
* This function should ALWAYS be called to end Visual mode, except from
|
* This function should ALWAYS be called to end Visual mode, except from
|
||||||
@@ -1342,6 +1362,18 @@ end_visual_mode(void)
|
|||||||
*/
|
*/
|
||||||
if (clip_star.available && clip_star.owned)
|
if (clip_star.available && clip_star.owned)
|
||||||
clip_auto_select();
|
clip_auto_select();
|
||||||
|
|
||||||
|
# if defined(FEAT_EVAL)
|
||||||
|
// Emit a TextYankPost for the automatic copy of the selection into the
|
||||||
|
// star and/or plus register.
|
||||||
|
if (has_textyankpost())
|
||||||
|
{
|
||||||
|
if (clip_isautosel_star())
|
||||||
|
call_yank_do_autocmd('*');
|
||||||
|
if (clip_isautosel_plus())
|
||||||
|
call_yank_do_autocmd('+');
|
||||||
|
}
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
VIsual_active = FALSE;
|
VIsual_active = FALSE;
|
||||||
|
@@ -322,8 +322,7 @@ put_register(int name, void *reg)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (defined(FEAT_CLIPBOARD) && defined(FEAT_X11) && defined(USE_SYSTEM)) \
|
#if defined(FEAT_CLIPBOARD) || defined(PROTO)
|
||||||
|| defined(PROTO)
|
|
||||||
void
|
void
|
||||||
free_register(void *reg)
|
free_register(void *reg)
|
||||||
{
|
{
|
||||||
|
@@ -1760,6 +1760,28 @@ func Test_TextYankPost()
|
|||||||
|
|
||||||
call assert_equal({}, v:event)
|
call assert_equal({}, v:event)
|
||||||
|
|
||||||
|
if has('clipboard_working') && !has('gui_running')
|
||||||
|
" Test that when the visual selection is automatically copied to clipboard
|
||||||
|
" register a TextYankPost is emitted
|
||||||
|
call setline(1, ['foobar'])
|
||||||
|
|
||||||
|
let @* = ''
|
||||||
|
set clipboard=autoselect
|
||||||
|
exe "norm! ggviw\<Esc>"
|
||||||
|
call assert_equal(
|
||||||
|
\{'regcontents': ['foobar'], 'regname': '*', 'operator': 'y', 'regtype': 'v', 'visual': v:true},
|
||||||
|
\g:event)
|
||||||
|
|
||||||
|
let @+ = ''
|
||||||
|
set clipboard=autoselectplus
|
||||||
|
exe "norm! ggviw\<Esc>"
|
||||||
|
call assert_equal(
|
||||||
|
\{'regcontents': ['foobar'], 'regname': '+', 'operator': 'y', 'regtype': 'v', 'visual': v:true},
|
||||||
|
\g:event)
|
||||||
|
|
||||||
|
set clipboard&vim
|
||||||
|
endif
|
||||||
|
|
||||||
au! TextYankPost
|
au! TextYankPost
|
||||||
unlet g:event
|
unlet g:event
|
||||||
bwipe!
|
bwipe!
|
||||||
|
@@ -750,6 +750,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 */
|
||||||
|
/**/
|
||||||
|
2057,
|
||||||
/**/
|
/**/
|
||||||
2056,
|
2056,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user