buf_updates: fix wrong updates on linewise change

This commit is contained in:
Thomas Vigouroux
2020-09-18 08:44:32 +02:00
parent 6dc815530b
commit 179f0bca18
2 changed files with 42 additions and 7 deletions

View File

@@ -1544,15 +1544,19 @@ int op_delete(oparg_T *oap)
oap->line_count = 0; // no lines deleted
} else if (oap->motion_type == kMTLineWise) {
if (oap->op_type == OP_CHANGE) {
/* Delete the lines except the first one. Temporarily move the
* cursor to the next line. Save the current line number, if the
* last line is deleted it may be changed.
*/
// Delete the lines except the first one. Temporarily move the
// cursor to the next line. Save the current line number, if the
// last line is deleted it may be changed.
if (oap->line_count > 1) {
lnum = curwin->w_cursor.lnum;
++curwin->w_cursor.lnum;
del_lines(oap->line_count - 1, TRUE);
curwin->w_cursor.lnum = lnum;
extmark_adjust(curbuf, curwin->w_cursor.lnum,
curwin->w_cursor.lnum + oap->line_count - 1,
MAXLNUM, 0, kExtmarkUndo);
}
if (u_save_cursor() == FAIL)
return FAIL;
@@ -1561,9 +1565,16 @@ int op_delete(oparg_T *oap)
did_ai = true; // delete the indent when ESC hit
ai_col = curwin->w_cursor.col;
} else
beginline(0); /* cursor in column 0 */
truncate_line(FALSE); /* delete the rest of the line */
/* leave cursor past last char in line */
beginline(0); // cursor in column 0
int old_len = (int)STRLEN(ml_get(curwin->w_cursor.lnum));
truncate_line(FALSE); // delete the rest of the line
extmark_splice_cols(curbuf,
(int)curwin->w_cursor.lnum, curwin->w_cursor.col,
old_len - curwin->w_cursor.col, 0, kExtmarkUndo);
// leave cursor past last char in line
if (oap->line_count > 1)
u_clearline(); /* "U" command not possible after "2cc" */
} else {