aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJit <jityao+github@gmail.com>2019-07-29 00:50:12 +0200
committerJustin M. Keyes <justinkz@gmail.com>2019-07-29 00:50:11 +0200
commit7cc2b723d43c73653daa41fcfac623632faa9695 (patch)
tree4a043b959a51aa8e7bae3e8a29afa697289ddbcb
parent4213492231cc9b3ae900657d8ab88039f2f4eb91 (diff)
downloadrneovim-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.c2
-rw-r--r--src/nvim/normal.c2
-rw-r--r--src/nvim/ops.c20
-rw-r--r--test/functional/autocmd/textyankpost_spec.lua5
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)