diff options
author | Luuk van Baal <luukvbaal@gmail.com> | 2025-01-09 17:58:37 +0100 |
---|---|---|
committer | luukvbaal <luukvbaal@gmail.com> | 2025-01-10 08:14:38 +0100 |
commit | 87610d82db912cda8877198c25dabbf2bb08f0aa (patch) | |
tree | aafe4e99c501da418590ce0501bdbde8aa526c4d | |
parent | a37784ad831fdf31e7eeafdd41f7d3cb81b1a07f (diff) | |
download | rneovim-87610d82db912cda8877198c25dabbf2bb08f0aa.tar.gz rneovim-87610d82db912cda8877198c25dabbf2bb08f0aa.tar.bz2 rneovim-87610d82db912cda8877198c25dabbf2bb08f0aa.zip |
fix(decor): set invalid flag for end of invalidated paired marks
-rw-r--r-- | src/nvim/extmark.c | 9 | ||||
-rw-r--r-- | test/functional/api/extmark_spec.lua | 10 |
2 files changed, 16 insertions, 3 deletions
diff --git a/src/nvim/extmark.c b/src/nvim/extmark.c index 79eea718f4..5b47afa4b2 100644 --- a/src/nvim/extmark.c +++ b/src/nvim/extmark.c @@ -140,8 +140,9 @@ static void extmark_setraw(buf_T *buf, uint64_t mark, int row, colnr_T col, bool } 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); + MTPos end = marktree_get_altpos(buf->b_marktree, key, itr); + mt_itr_rawkey(itr).flags &= (uint16_t) ~MT_FLAG_INVALID; + buf_put_decor(buf, mt_decor(key), row, end.row); } else if (move && key.flags & MT_FLAG_DECOR_SIGNTEXT && buf->b_signcols.autom) { buf_signcols_count_range(buf, row1, row2, 0, kNone); } @@ -394,7 +395,8 @@ void extmark_splice_delete(buf_T *buf, int l_row, colnr_T l_col, int u_row, coln bool invalidated = false; // Invalidate/delete mark if (!only_copy && !mt_invalid(mark) && mt_invalidate(mark) && !mt_end(mark)) { - MTPos endpos = marktree_get_altpos(buf->b_marktree, mark, NULL); + MarkTreeIter enditr[1] = { *itr }; + MTPos endpos = marktree_get_altpos(buf->b_marktree, mark, enditr); // Invalidate unpaired marks in deleted lines and paired marks whose entire // range has been deleted. if ((!mt_paired(mark) && mark.pos.row < u_row) @@ -409,6 +411,7 @@ void extmark_splice_delete(buf_T *buf, int l_row, colnr_T l_col, int u_row, coln copy = true; invalidated = true; mt_itr_rawkey(itr).flags |= MT_FLAG_INVALID; + mt_itr_rawkey(enditr).flags |= MT_FLAG_INVALID; marktree_revise_meta(buf->b_marktree, itr, mark); buf_decor_remove(buf, mark.pos.row, endpos.row, mark.pos.col, mt_decor(mark), false); } diff --git a/test/functional/api/extmark_spec.lua b/test/functional/api/extmark_spec.lua index 6a94881093..c8d6110207 100644 --- a/test/functional/api/extmark_spec.lua +++ b/test/functional/api/extmark_spec.lua @@ -1794,6 +1794,16 @@ describe('API/extmarks', function() eq({}, get_extmark_by_id(ns, 4, {})) end) + it('no crash checking invalided flag of sign pair end key #31856', function() + api.nvim_buf_set_lines(0, 0, 1, false, { '', '' }) + api.nvim_set_option_value('signcolumn', 'auto:2', {}) + set_extmark(ns, 1, 0, 0, { sign_text = 'S1', invalidate = true, end_row = 0 }) + set_extmark(ns, 2, 1, 0, { sign_text = 'S2', end_row = 1 }) + command('d') + api.nvim_buf_clear_namespace(0, ns, 0, -1) + n.assert_alive() + end) + it('can set a URL', function() local url1 = 'https://example.com' local url2 = 'http://127.0.0.1' |