diff options
author | Jit <jityao+github@gmail.com> | 2019-07-29 00:50:12 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2019-07-29 00:50:11 +0200 |
commit | 7cc2b723d43c73653daa41fcfac623632faa9695 (patch) | |
tree | 4a043b959a51aa8e7bae3e8a29afa697289ddbcb | |
parent | 4213492231cc9b3ae900657d8ab88039f2f4eb91 (diff) | |
download | rneovim-7cc2b723d43c73653daa41fcfac623632faa9695.tar.gz rneovim-7cc2b723d43c73653daa41fcfac623632faa9695.tar.bz2 rneovim-7cc2b723d43c73653daa41fcfac623632faa9695.zip |
TextYankPost: spurious/too-early dispatch during delete #10392
Problem: delete-with-register dispatches TextYankPost before updating yank registers
Solution: Add flag to op_yank().
Fixes #10225
-rw-r--r-- | src/nvim/ex_docmd.c | 2 | ||||
-rw-r--r-- | src/nvim/normal.c | 2 | ||||
-rw-r--r-- | src/nvim/ops.c | 20 | ||||
-rw-r--r-- | test/functional/autocmd/textyankpost_spec.lua | 5 |
4 files changed, 21 insertions, 8 deletions
diff --git a/src/nvim/ex_docmd.c b/src/nvim/ex_docmd.c index c8edf7173e..5365270e0b 100644 --- a/src/nvim/ex_docmd.c +++ b/src/nvim/ex_docmd.c @@ -7520,7 +7520,7 @@ static void ex_operators(exarg_T *eap) case CMD_yank: oa.op_type = OP_YANK; - (void)op_yank(&oa, true); + (void)op_yank(&oa, true, false); break; default: /* CMD_rshift or CMD_lshift */ diff --git a/src/nvim/normal.c b/src/nvim/normal.c index d33c5d33bb..2e4cdc1fe1 100644 --- a/src/nvim/normal.c +++ b/src/nvim/normal.c @@ -1817,7 +1817,7 @@ void do_pending_operator(cmdarg_T *cap, int old_col, bool gui_yank) } } else { curwin->w_p_lbr = lbr_saved; - (void)op_yank(oap, !gui_yank); + (void)op_yank(oap, !gui_yank, false); } check_cursor_col(); break; diff --git a/src/nvim/ops.c b/src/nvim/ops.c index a1f2a2f1b6..28635a4383 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -1400,9 +1400,11 @@ int op_delete(oparg_T *oap) */ if (oap->regname != '_') { yankreg_T *reg = NULL; + int did_yank = false; if (oap->regname != 0) { //yank without message - if (!op_yank(oap, false)) { + did_yank = op_yank(oap, false, true); + if (!did_yank) { // op_yank failed, don't do anything return OK; } @@ -1423,6 +1425,7 @@ int op_delete(oparg_T *oap) y_regs[1].y_array = NULL; // set register "1 to empty reg = &y_regs[1]; op_yank_reg(oap, false, reg, false); + did_yank = true; } /* Yank into small delete register when no named register specified @@ -1431,13 +1434,14 @@ int op_delete(oparg_T *oap) && oap->line_count == 1) { reg = get_yank_register('-', YREG_YANK); op_yank_reg(oap, false, reg, false); + did_yank = true; } - if (oap->regname == 0) { + if (did_yank || oap->regname == 0) { if (reg == NULL) { abort(); } - set_clipboard(0, reg); + set_clipboard(oap->regname, reg); do_autocmd_textyankpost(oap, reg); } @@ -2376,8 +2380,9 @@ void free_register(yankreg_T *reg) /// /// @param oap operator arguments /// @param message show message when more than `&report` lines are yanked. +/// @param deleting whether the function was called from a delete operation. /// @returns whether the operation register was writable. -bool op_yank(oparg_T *oap, bool message) +bool op_yank(oparg_T *oap, bool message, int deleting) FUNC_ATTR_NONNULL_ALL { // check for read-only register @@ -2391,8 +2396,11 @@ bool op_yank(oparg_T *oap, bool message) yankreg_T *reg = get_yank_register(oap->regname, YREG_YANK); op_yank_reg(oap, message, reg, is_append_register(oap->regname)); - set_clipboard(oap->regname, reg); - do_autocmd_textyankpost(oap, reg); + // op_delete will set_clipboard and do_autocmd + if (!deleting) { + set_clipboard(oap->regname, reg); + do_autocmd_textyankpost(oap, reg); + } return true; } diff --git a/test/functional/autocmd/textyankpost_spec.lua b/test/functional/autocmd/textyankpost_spec.lua index 5849679dd2..8c23b72cff 100644 --- a/test/functional/autocmd/textyankpost_spec.lua +++ b/test/functional/autocmd/textyankpost_spec.lua @@ -229,4 +229,9 @@ describe('TextYankPost', function() eq(4, eval('g:count')) end) + it('updates numbered registers correctly #10225', function() + command('autocmd TextYankPost * let g:reg = getreg("1")') + feed('"adj') + eq('foo\nbar\nbaz text\n', eval('g:reg')) + end) end) |