vim-patch:8.2.4941: '[ and '] marks may be wrong after undo (#18539)

Problem:    '[ and '] marks may be wrong after undo.
Solution:   Adjust the '[ and '] marks if needed. (closes vim/vim#10407, closes vim/vim#1281)
82444cefa3
This commit is contained in:
zeertzjq 2022-05-12 23:38:26 +08:00 committed by GitHub
parent 8fba428bc6
commit a200ce0d85
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 1 deletions

View File

@ -733,4 +733,21 @@ func Test_undofile_cryptmethod_blowfish2()
set undofile& undolevels& cryptmethod&
endfunc
func Test_undo_mark()
new
" The undo is applied to the only line.
call setline(1, 'hello')
call feedkeys("ggyiw$p", 'xt')
undo
call assert_equal([0, 1, 1, 0], getpos("'["))
call assert_equal([0, 1, 1, 0], getpos("']"))
" The undo removes the last line.
call feedkeys("Goaaaa\<Esc>", 'xt')
call feedkeys("obbbb\<Esc>", 'xt')
undo
call assert_equal([0, 2, 1, 0], getpos("'["))
call assert_equal([0, 2, 1, 0], getpos("']"))
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@ -2418,10 +2418,11 @@ static void u_undoredo(int undo, bool do_buf_event)
changed_lines(top + 1, 0, bot, newsize - oldsize, do_buf_event);
// set '[ and '] mark
// Set the '[ mark.
if (top + 1 < curbuf->b_op_start.lnum) {
curbuf->b_op_start.lnum = top + 1;
}
// Set the '] mark.
if (newsize == 0 && top + 1 > curbuf->b_op_end.lnum) {
curbuf->b_op_end.lnum = top + 1;
} else if (top + newsize > curbuf->b_op_end.lnum) {
@ -2442,6 +2443,14 @@ static void u_undoredo(int undo, bool do_buf_event)
newlist = uep;
}
// Ensure the '[ and '] marks are within bounds.
if (curbuf->b_op_start.lnum > curbuf->b_ml.ml_line_count) {
curbuf->b_op_start.lnum = curbuf->b_ml.ml_line_count;
}
if (curbuf->b_op_end.lnum > curbuf->b_ml.ml_line_count) {
curbuf->b_op_end.lnum = curbuf->b_ml.ml_line_count;
}
// Adjust Extmarks
ExtmarkUndoObject undo_info;
if (undo) {