aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2023-06-01 16:20:31 +0800
committerGitHub <noreply@github.com>2023-06-01 16:20:31 +0800
commit2bdef6dd2a7572602aeb2efec76812769bcee246 (patch)
tree35fa304e530791b8fea12dfc34fa016dc883c930
parentbe5e3611541051d9fa5b752a4fe1da6ab78b141e (diff)
downloadrneovim-2bdef6dd2a7572602aeb2efec76812769bcee246.tar.gz
rneovim-2bdef6dd2a7572602aeb2efec76812769bcee246.tar.bz2
rneovim-2bdef6dd2a7572602aeb2efec76812769bcee246.zip
fix(column): don't overflow sign column with extmark signs (#23854)
-rw-r--r--src/nvim/decoration.c4
-rw-r--r--test/functional/ui/decorations_spec.lua37
2 files changed, 38 insertions, 3 deletions
diff --git a/src/nvim/decoration.c b/src/nvim/decoration.c
index 677bc25127..2027848ccf 100644
--- a/src/nvim/decoration.c
+++ b/src/nvim/decoration.c
@@ -433,7 +433,9 @@ void decor_redraw_signs(buf_T *buf, int row, int *num_signs, SignTextAttrs sattr
if (sattrs[j - 1].priority >= decor->priority) {
break;
}
- sattrs[j] = sattrs[j - 1];
+ if (j < SIGN_SHOW_MAX) {
+ sattrs[j] = sattrs[j - 1];
+ }
}
if (j < SIGN_SHOW_MAX) {
sattrs[j] = (SignTextAttrs) {
diff --git a/test/functional/ui/decorations_spec.lua b/test/functional/ui/decorations_spec.lua
index 2d0223dec7..54441984a3 100644
--- a/test/functional/ui/decorations_spec.lua
+++ b/test/functional/ui/decorations_spec.lua
@@ -3342,8 +3342,8 @@ l5
insert(example_test3)
feed 'gg'
- helpers.command('sign define Oldsign text=O3')
- helpers.command([[exe 'sign place 42 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command('sign define Oldsign text=O3')
+ command([[exe 'sign place 42 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
meths.buf_set_extmark(0, ns, 0, -1, {sign_text='S4', priority=100})
meths.buf_set_extmark(0, ns, 0, -1, {sign_text='S2', priority=5})
@@ -3366,6 +3366,39 @@ l5
]]}
end)
+ it('does not overflow with many old signs #23852', function()
+ screen:try_resize(20, 3)
+
+ command('set signcolumn:auto:9')
+ command('sign define Oldsign text=O3')
+ command([[exe 'sign place 01 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 02 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 03 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 04 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 05 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 06 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 07 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 08 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ command([[exe 'sign place 09 line=1 name=Oldsign priority=10 buffer=' . bufnr('')]])
+ screen:expect{grid=[[
+ O3O3O3O3O3O3O3O3O3^ |
+ {2:~ }|
+ |
+ ]]}
+
+ meths.buf_set_extmark(0, ns, 0, -1, {sign_text='S1', priority=1})
+ screen:expect_unchanged()
+
+ meths.buf_set_extmark(0, ns, 0, -1, {sign_text='S5', priority=200})
+ screen:expect{grid=[[
+ O3O3O3O3O3O3O3O3S5^ |
+ {2:~ }|
+ |
+ ]]}
+
+ assert_alive()
+ end)
+
it('does not set signcolumn for signs without text', function()
screen:try_resize(20, 3)
meths.set_option_value('signcolumn', 'auto', {})