mirror of
https://github.com/neovim/neovim.git
synced 2025-12-13 18:12:50 +00:00
fix(marks): ensure decor is removed with proper range (#32973)
Problem: Paired mark whose end is in front of its start should not have
its decor removed (as fixed by 72f630f9), but may still need to
have its range redrawn.
Solution: Still call `buf_decor_remove()` but ensure it is not called with
an inverse range when `extmark_del()` is called on an end mark.
This commit is contained in:
@@ -180,11 +180,14 @@ void extmark_del(buf_T *buf, MarkTreeIter *itr, MTKey key, bool restore)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (mt_decor_any(key)) {
|
if (mt_decor_any(key)) {
|
||||||
// If key is an end mark it has been found first while iterating the marktree,
|
if (mt_invalid(key)) {
|
||||||
// indicating the decor is already invalid.
|
|
||||||
if (mt_invalid(key) || mt_end(key)) {
|
|
||||||
decor_free(mt_decor(key));
|
decor_free(mt_decor(key));
|
||||||
} else {
|
} else {
|
||||||
|
if (mt_end(key)) {
|
||||||
|
MTKey k = key;
|
||||||
|
key = key2;
|
||||||
|
key2 = k;
|
||||||
|
}
|
||||||
buf_decor_remove(buf, key.pos.row, key2.pos.row, key.pos.col, mt_decor(key), true);
|
buf_decor_remove(buf, key.pos.row, key2.pos.row, key.pos.col, mt_decor(key), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6393,24 +6393,19 @@ l5
|
|||||||
end)
|
end)
|
||||||
|
|
||||||
describe('decorations: virt_text', function()
|
describe('decorations: virt_text', function()
|
||||||
local screen ---@type test.functional.ui.screen
|
local ns, screen ---@type integer, test.functional.ui.screen
|
||||||
|
|
||||||
before_each(function()
|
before_each(function()
|
||||||
clear()
|
clear()
|
||||||
screen = Screen.new(50, 10)
|
screen = Screen.new(50, 10)
|
||||||
|
ns = api.nvim_create_namespace('test')
|
||||||
end)
|
end)
|
||||||
|
|
||||||
it('avoids regression in #17638', function()
|
it('avoids regression in #17638', function()
|
||||||
exec_lua[[
|
command 'set number relativenumber'
|
||||||
vim.wo.number = true
|
|
||||||
vim.wo.relativenumber = true
|
|
||||||
]]
|
|
||||||
|
|
||||||
command 'normal 4ohello'
|
command 'normal 4ohello'
|
||||||
command 'normal aVIRTUAL'
|
command 'normal aVIRTUAL'
|
||||||
|
|
||||||
local ns = api.nvim_create_namespace('test')
|
|
||||||
|
|
||||||
api.nvim_buf_set_extmark(0, ns, 2, 0, {
|
api.nvim_buf_set_extmark(0, ns, 2, 0, {
|
||||||
virt_text = {{"hello", "String"}},
|
virt_text = {{"hello", "String"}},
|
||||||
virt_text_win_col = 20,
|
virt_text_win_col = 20,
|
||||||
@@ -6451,7 +6446,6 @@ describe('decorations: virt_text', function()
|
|||||||
|
|
|
|
||||||
]]}
|
]]}
|
||||||
|
|
||||||
local ns = api.nvim_create_namespace('ns')
|
|
||||||
for row = 1, 5 do
|
for row = 1, 5 do
|
||||||
api.nvim_buf_set_extmark(0, ns, row, 0, { id = 1, virt_text = {{'world', 'Normal'}} })
|
api.nvim_buf_set_extmark(0, ns, row, 0, { id = 1, virt_text = {{'world', 'Normal'}} })
|
||||||
end
|
end
|
||||||
@@ -6464,6 +6458,30 @@ describe('decorations: virt_text', function()
|
|||||||
|
|
|
|
||||||
]]}
|
]]}
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
it('redraws correctly when removing mark whose end ends up in front of start', function()
|
||||||
|
command('normal 5ohello')
|
||||||
|
api.nvim_buf_set_extmark(0, ns, 2, 0, { end_col = 1, virt_text = {{'world', 'Normal'}} })
|
||||||
|
screen:expect([[
|
||||||
|
|
|
||||||
|
hello |
|
||||||
|
hello world |
|
||||||
|
hello |*2
|
||||||
|
hell^o |
|
||||||
|
{1:~ }|*3
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
feed('3Gdd')
|
||||||
|
api.nvim_buf_clear_namespace(0, ns, 0, -1)
|
||||||
|
screen:expect([[
|
||||||
|
|
|
||||||
|
hello |
|
||||||
|
^hello |
|
||||||
|
hello |*2
|
||||||
|
{1:~ }|*4
|
||||||
|
|
|
||||||
|
]])
|
||||||
|
end)
|
||||||
end)
|
end)
|
||||||
|
|
||||||
describe('decorations: window scoped', function()
|
describe('decorations: window scoped', function()
|
||||||
|
|||||||
Reference in New Issue
Block a user