mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 09:44:31 +00:00 
			
		
		
		
	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
This commit is contained in:
		@@ -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 */
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
 
 | 
			
		||||
@@ -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;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user