diff options
author | bfredl <bjorn.linse@gmail.com> | 2024-07-21 15:59:12 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-07-21 15:59:12 +0200 |
commit | 5c2f8ccc00062a17f790a3a8a4481ef418cb43c1 (patch) | |
tree | 50b5c162c2e7f025f17e117b1f4424c8831b37c7 /src | |
parent | 4c788b175743e54d0a73248c820d6cf16a854f6e (diff) | |
parent | 012db2b0f5099909a62c56651acb4dcf62328fc9 (diff) | |
download | rneovim-5c2f8ccc00062a17f790a3a8a4481ef418cb43c1.tar.gz rneovim-5c2f8ccc00062a17f790a3a8a4481ef418cb43c1.tar.bz2 rneovim-5c2f8ccc00062a17f790a3a8a4481ef418cb43c1.zip |
Merge pull request #29523 from luukvbaal/invalid
fix(marks): revalidate marks whose position did not change
Diffstat (limited to 'src')
-rw-r--r-- | src/nvim/extmark.c | 22 |
1 files changed, 9 insertions, 13 deletions
diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index b592283d92..4ff298cde5 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -116,16 +116,10 @@ static void extmark_setraw(buf_T *buf, uint64_t mark, int row, colnr_T col, bool { MarkTreeIter itr[1] = { 0 }; MTKey key = marktree_lookup(buf->b_marktree, mark, itr); - if (key.pos.row < 0 || (key.pos.row == row && key.pos.col == col)) { - // Does this hold? If it doesn't, we should still revalidate. - assert(!invalid || !mt_invalid(key)); - return; - } - - // Key already revalidated(how?) Avoid adding to decor again. - if (invalid && !mt_invalid(key)) { - invalid = false; - } + bool move = key.pos.row >= 0 && (key.pos.row != row || key.pos.col != col); + // Already valid keys were being revalidated, presumably when encountering a + // SavePos from a modified mark. Avoid adding that to the decor again. + invalid = invalid && mt_invalid(key); // Only the position before undo needs to be redrawn here, // as the position after undo should be marked as changed. @@ -137,19 +131,21 @@ static void extmark_setraw(buf_T *buf, uint64_t mark, int row, colnr_T col, bool int row2 = 0; if (invalid) { mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_INVALID; - } else if (key.flags & MT_FLAG_DECOR_SIGNTEXT && buf->b_signcols.autom) { + } else if (move && key.flags & MT_FLAG_DECOR_SIGNTEXT && buf->b_signcols.autom) { MTPos end = marktree_get_altpos(buf->b_marktree, key, NULL); row1 = MIN(end.row, MIN(key.pos.row, row)); row2 = MAX(end.row, MAX(key.pos.row, row)); buf_signcols_count_range(buf, row1, row2, 0, kTrue); } - marktree_move(buf->b_marktree, itr, row, col); + if (move) { + marktree_move(buf->b_marktree, itr, row, col); + } if (invalid) { row2 = mt_paired(key) ? marktree_get_altpos(buf->b_marktree, key, NULL).row : row; buf_put_decor(buf, mt_decor(key), row, row2); - } else if (key.flags & MT_FLAG_DECOR_SIGNTEXT && buf->b_signcols.autom) { + } else if (move && key.flags & MT_FLAG_DECOR_SIGNTEXT && buf->b_signcols.autom) { buf_signcols_count_range(buf, row1, row2, 0, kNone); } } |