1
0
forked from aniani/vim

patch 8.2.4717: for TextYankPost v:event does not contain all information

Problem:    For TextYankPost v:event does not contain information about the
            operation being inclusive or not.
Solution:   Add "inclusive" to v:event. (Justn M. Keyes, Yegappan Lakshmanan,
            closes #10125)
This commit is contained in:
Bram Moolenaar 2022-04-09 11:37:38 +01:00
parent 7c7e19cf50
commit a016eeba7a
4 changed files with 52 additions and 16 deletions

View File

@ -1205,6 +1205,9 @@ TextYankPost After text has been yanked or deleted in the
current buffer. The following values of current buffer. The following values of
|v:event| can be used to determine the operation |v:event| can be used to determine the operation
that triggered this autocmd: that triggered this autocmd:
inclusive TRUE if the motion is
|inclusive| else the motion is
|exclusive|.
operator The operation performed. operator The operation performed.
regcontents Text that was stored in the regcontents Text that was stored in the
register, as a list of lines, register, as a list of lines,

View File

@ -1013,20 +1013,28 @@ yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
list = list_alloc(); list = list_alloc();
if (list == NULL) if (list == NULL)
return; return;
// yanked text contents
for (n = 0; n < reg->y_size; n++) for (n = 0; n < reg->y_size; n++)
list_append_string(list, reg->y_array[n], -1); list_append_string(list, reg->y_array[n], -1);
list->lv_lock = VAR_FIXED; list->lv_lock = VAR_FIXED;
(void)dict_add_list(v_event, "regcontents", list); (void)dict_add_list(v_event, "regcontents", list);
// register name or empty string for unnamed operation
buf[0] = (char_u)oap->regname; buf[0] = (char_u)oap->regname;
buf[1] = NUL; buf[1] = NUL;
(void)dict_add_string(v_event, "regname", buf); (void)dict_add_string(v_event, "regname", buf);
// motion type: inclusive or exclusive
(void)dict_add_bool(v_event, "inclusive", oap->inclusive);
// kind of operation (yank, delete, change)
buf[0] = get_op_char(oap->op_type); buf[0] = get_op_char(oap->op_type);
buf[1] = get_extra_op_char(oap->op_type); buf[1] = get_extra_op_char(oap->op_type);
buf[2] = NUL; buf[2] = NUL;
(void)dict_add_string(v_event, "operator", buf); (void)dict_add_string(v_event, "operator", buf);
// register type
buf[0] = NUL; buf[0] = NUL;
buf[1] = NUL; buf[1] = NUL;
switch (get_reg_type(oap->regname, &reglen)) switch (get_reg_type(oap->regname, &reglen))
@ -1040,6 +1048,7 @@ yank_do_autocmd(oparg_T *oap, yankreg_T *reg)
} }
(void)dict_add_string(v_event, "regtype", buf); (void)dict_add_string(v_event, "regtype", buf);
// selection type - visual or not
(void)dict_add_bool(v_event, "visual", oap->is_VIsual); (void)dict_add_bool(v_event, "visual", oap->is_VIsual);
// Lock the dictionary and its keys // Lock the dictionary and its keys

View File

@ -1931,28 +1931,48 @@ func Test_TextYankPost()
norm "ayiw norm "ayiw
call assert_equal( call assert_equal(
\{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v', 'visual': v:false}, \ #{regcontents: ['foo'], regname: 'a', operator: 'y',
\g:event) \ regtype: 'v', visual: v:false, inclusive: v:true},
\ g:event)
norm y_ norm y_
call assert_equal( call assert_equal(
\{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:false}, \ #{regcontents: ['foo'], regname: '', operator: 'y', regtype: 'V',
\g:event) \ visual: v:false, inclusive: v:false},
\ g:event)
norm Vy norm Vy
call assert_equal( call assert_equal(
\{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:true}, \ #{regcontents: ['foo'], regname: '', operator: 'y', regtype: 'V',
\g:event) \ visual: v:true, inclusive: v:true},
\ g:event)
call feedkeys("\<C-V>y", 'x') call feedkeys("\<C-V>y", 'x')
call assert_equal( call assert_equal(
\{'regcontents': ['f'], 'regname': '', 'operator': 'y', 'regtype': "\x161", 'visual': v:true}, \ #{regcontents: ['f'], regname: '', operator: 'y', regtype: "\x161",
\g:event) \ visual: v:true, inclusive: v:true},
\ g:event)
norm "xciwbar norm "xciwbar
call assert_equal( call assert_equal(
\{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v', 'visual': v:false}, \ #{regcontents: ['foo'], regname: 'x', operator: 'c', regtype: 'v',
\g:event) \ visual: v:false, inclusive: v:true},
\ g:event)
norm "bdiw norm "bdiw
call assert_equal( call assert_equal(
\{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v', 'visual': v:false}, \ #{regcontents: ['bar'], regname: 'b', operator: 'd', regtype: 'v',
\g:event) \ visual: v:false, inclusive: v:true},
\ g:event)
call setline(1, 'foobar')
" exclusive motion
norm $"ay0
call assert_equal(
\ #{regcontents: ['fooba'], regname: 'a', operator: 'y', regtype: 'v',
\ visual: v:false, inclusive: v:false},
\ g:event)
" inclusive motion
norm 0"ay$
call assert_equal(
\ #{regcontents: ['foobar'], regname: 'a', operator: 'y', regtype: 'v',
\ visual: v:false, inclusive: v:true},
\ g:event)
call assert_equal({}, v:event) call assert_equal({}, v:event)
@ -1965,15 +1985,17 @@ func Test_TextYankPost()
set clipboard=autoselect set clipboard=autoselect
exe "norm! ggviw\<Esc>" exe "norm! ggviw\<Esc>"
call assert_equal( call assert_equal(
\{'regcontents': ['foobar'], 'regname': '*', 'operator': 'y', 'regtype': 'v', 'visual': v:true}, \ #{regcontents: ['foobar'], regname: '*', operator: 'y',
\g:event) \ regtype: 'v', visual: v:true, inclusive: v:false},
\ g:event)
let @+ = '' let @+ = ''
set clipboard=autoselectplus set clipboard=autoselectplus
exe "norm! ggviw\<Esc>" exe "norm! ggviw\<Esc>"
call assert_equal( call assert_equal(
\{'regcontents': ['foobar'], 'regname': '+', 'operator': 'y', 'regtype': 'v', 'visual': v:true}, \ #{regcontents: ['foobar'], regname: '+', operator: 'y',
\g:event) \ regtype: 'v', visual: v:true, inclusive: v:false},
\ g:event)
set clipboard&vim set clipboard&vim
endif endif

View File

@ -746,6 +746,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 */
/**/
4717,
/**/ /**/
4716, 4716,
/**/ /**/