diff options
author | Bram Moolenaar <Bram@vim.org> | 2022-04-09 11:37:38 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-04-09 11:37:38 +0100 |
commit | a016eeba7a5777ba1f2ec2dbcda7c96823bf9ab1 (patch) | |
tree | a2bd0a87051ffcb805cd543f37d94b528453fe50 | |
parent | 7c7e19cf50d76568e2637ad66b095044a41c6a82 (diff) | |
download | vim-git-a016eeba7a5777ba1f2ec2dbcda7c96823bf9ab1.tar.gz |
patch 8.2.4717: for TextYankPost v:event does not contain all informationv8.2.4717
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)
-rw-r--r-- | runtime/doc/autocmd.txt | 3 | ||||
-rw-r--r-- | src/register.c | 9 | ||||
-rw-r--r-- | src/testdir/test_autocmd.vim | 54 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 52 insertions, 16 deletions
diff --git a/runtime/doc/autocmd.txt b/runtime/doc/autocmd.txt index 8421f77af..3b738b744 100644 --- a/runtime/doc/autocmd.txt +++ b/runtime/doc/autocmd.txt @@ -1205,6 +1205,9 @@ TextYankPost After text has been yanked or deleted in the current buffer. The following values of |v:event| can be used to determine the operation that triggered this autocmd: + inclusive TRUE if the motion is + |inclusive| else the motion is + |exclusive|. operator The operation performed. regcontents Text that was stored in the register, as a list of lines, diff --git a/src/register.c b/src/register.c index 79e602130..b4e88a609 100644 --- a/src/register.c +++ b/src/register.c @@ -1013,20 +1013,28 @@ yank_do_autocmd(oparg_T *oap, yankreg_T *reg) list = list_alloc(); if (list == NULL) return; + + // yanked text contents for (n = 0; n < reg->y_size; n++) list_append_string(list, reg->y_array[n], -1); list->lv_lock = VAR_FIXED; (void)dict_add_list(v_event, "regcontents", list); + // register name or empty string for unnamed operation buf[0] = (char_u)oap->regname; buf[1] = NUL; (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[1] = get_extra_op_char(oap->op_type); buf[2] = NUL; (void)dict_add_string(v_event, "operator", buf); + // register type buf[0] = NUL; buf[1] = NUL; switch (get_reg_type(oap->regname, ®len)) @@ -1040,6 +1048,7 @@ yank_do_autocmd(oparg_T *oap, yankreg_T *reg) } (void)dict_add_string(v_event, "regtype", buf); + // selection type - visual or not (void)dict_add_bool(v_event, "visual", oap->is_VIsual); // Lock the dictionary and its keys diff --git a/src/testdir/test_autocmd.vim b/src/testdir/test_autocmd.vim index 3ff9d0b34..896c563f7 100644 --- a/src/testdir/test_autocmd.vim +++ b/src/testdir/test_autocmd.vim @@ -1931,28 +1931,48 @@ func Test_TextYankPost() norm "ayiw call assert_equal( - \{'regcontents': ['foo'], 'regname': 'a', 'operator': 'y', 'regtype': 'v', 'visual': v:false}, - \g:event) + \ #{regcontents: ['foo'], regname: 'a', operator: 'y', + \ regtype: 'v', visual: v:false, inclusive: v:true}, + \ g:event) norm y_ call assert_equal( - \{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:false}, - \g:event) + \ #{regcontents: ['foo'], regname: '', operator: 'y', regtype: 'V', + \ visual: v:false, inclusive: v:false}, + \ g:event) norm Vy call assert_equal( - \{'regcontents': ['foo'], 'regname': '', 'operator': 'y', 'regtype': 'V', 'visual': v:true}, - \g:event) + \ #{regcontents: ['foo'], regname: '', operator: 'y', regtype: 'V', + \ visual: v:true, inclusive: v:true}, + \ g:event) call feedkeys("\<C-V>y", 'x') call assert_equal( - \{'regcontents': ['f'], 'regname': '', 'operator': 'y', 'regtype': "\x161", 'visual': v:true}, - \g:event) + \ #{regcontents: ['f'], regname: '', operator: 'y', regtype: "\x161", + \ visual: v:true, inclusive: v:true}, + \ g:event) norm "xciwbar call assert_equal( - \{'regcontents': ['foo'], 'regname': 'x', 'operator': 'c', 'regtype': 'v', 'visual': v:false}, - \g:event) + \ #{regcontents: ['foo'], regname: 'x', operator: 'c', regtype: 'v', + \ visual: v:false, inclusive: v:true}, + \ g:event) norm "bdiw call assert_equal( - \{'regcontents': ['bar'], 'regname': 'b', 'operator': 'd', 'regtype': 'v', 'visual': v:false}, - \g:event) + \ #{regcontents: ['bar'], regname: 'b', operator: 'd', regtype: 'v', + \ 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) @@ -1965,15 +1985,17 @@ func Test_TextYankPost() set clipboard=autoselect exe "norm! ggviw\<Esc>" call assert_equal( - \{'regcontents': ['foobar'], 'regname': '*', 'operator': 'y', 'regtype': 'v', 'visual': v:true}, - \g:event) + \ #{regcontents: ['foobar'], regname: '*', operator: 'y', + \ regtype: 'v', visual: v:true, inclusive: v:false}, + \ 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) + \ #{regcontents: ['foobar'], regname: '+', operator: 'y', + \ regtype: 'v', visual: v:true, inclusive: v:false}, + \ g:event) set clipboard&vim endif diff --git a/src/version.c b/src/version.c index f8f15ad9f..1830d5f69 100644 --- a/src/version.c +++ b/src/version.c @@ -747,6 +747,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 4717, +/**/ 4716, /**/ 4715, |