Mercurial > vim
diff src/undo.c @ 28835:58d2315b096e v8.2.4941
patch 8.2.4941: '[ and '] marks may be wrong after undo
Commit: https://github.com/vim/vim/commit/82444cefa3fef87624a078ea86a72af7ef4ef42e
Author: LemonBoy <thatlemon@gmail.com>
Date: Thu May 12 15:39:31 2022 +0100
patch 8.2.4941: '[ and '] marks may be wrong after undo
Problem: '[ and '] marks may be wrong after undo.
Solution: Adjust the '[ and '] marks if needed. (closes https://github.com/vim/vim/issues/10407, closes https://github.com/vim/vim/issues/1281)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Thu, 12 May 2022 16:45:03 +0200 |
parents | 4dcccb2673fe |
children | 48d74a5822eb |
line wrap: on
line diff
--- a/src/undo.c +++ b/src/undo.c @@ -2831,9 +2831,10 @@ u_undoredo(int undo) if (oldsize > 0 || newsize > 0) changed_lines(top + 1, 0, bot, newsize - oldsize); - // 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) @@ -2853,6 +2854,12 @@ u_undoredo(int undo) 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; + // Set the cursor to the desired position. Check that the line is valid. curwin->w_cursor = new_curpos; check_cursor_lnum();