2024-04-20 08:44:13 -07:00
|
|
|
|
local t = require('test.testutil')
|
|
|
|
|
local n = require('test.functional.testnvim')()
|
2015-01-26 20:56:03 -07:00
|
|
|
|
local Screen = require('test.functional.ui.screen')
|
2024-04-20 08:44:13 -07:00
|
|
|
|
|
|
|
|
|
local api, clear, eq = n.api, n.clear, t.eq
|
|
|
|
|
local eval, exec, feed = n.eval, n.exec, n.feed
|
2015-01-26 20:56:03 -07:00
|
|
|
|
|
|
|
|
|
describe('Signs', function()
|
|
|
|
|
local screen
|
|
|
|
|
|
|
|
|
|
before_each(function()
|
|
|
|
|
clear()
|
|
|
|
|
screen = Screen.new()
|
|
|
|
|
screen:attach()
|
2016-08-09 06:11:04 -07:00
|
|
|
|
screen:set_default_attr_ids({
|
|
|
|
|
[0] = { bold = true, foreground = 255 },
|
|
|
|
|
[1] = { background = Screen.colors.Yellow },
|
|
|
|
|
[2] = { foreground = Screen.colors.DarkBlue, background = Screen.colors.Grey },
|
2018-07-26 11:34:13 -07:00
|
|
|
|
[3] = { background = Screen.colors.Gray90 },
|
|
|
|
|
[4] = { bold = true, reverse = true },
|
|
|
|
|
[5] = { reverse = true },
|
2018-10-13 10:33:08 -07:00
|
|
|
|
[6] = { foreground = Screen.colors.Brown },
|
|
|
|
|
[7] = { foreground = Screen.colors.DarkBlue, background = Screen.colors.LightGrey },
|
|
|
|
|
[8] = { foreground = Screen.colors.Grey100, background = Screen.colors.Red },
|
2018-12-24 01:39:21 -07:00
|
|
|
|
[9] = { bold = true, foreground = Screen.colors.Magenta },
|
|
|
|
|
[10] = { foreground = Screen.colors.Blue1 },
|
|
|
|
|
[11] = { bold = true, foreground = Screen.colors.SeaGreen4 },
|
2016-08-09 06:11:04 -07:00
|
|
|
|
})
|
2015-01-26 20:56:03 -07:00
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
describe(':sign place', function()
|
2019-06-23 15:01:02 -07:00
|
|
|
|
it('allows signs with combining characters', function()
|
|
|
|
|
feed('ia<cr>b<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
sign define piet1 text=𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄ texthl=Search
|
|
|
|
|
sign define piet2 text=𠜎̀́̂̃̄̅ texthl=Search
|
|
|
|
|
sign place 1 line=1 name=piet1 buffer=1
|
|
|
|
|
sign place 2 line=2 name=piet2 buffer=1
|
|
|
|
|
]])
|
2019-06-23 15:01:02 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:𐌢̀́̂̃̅̄𐌢̀́̂̃̅̄}a |
|
|
|
|
|
{1:𠜎̀́̂̃̄̅}b |
|
|
|
|
|
{2: }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*10
|
2019-06-23 15:01:02 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
|
|
|
|
|
2015-01-26 20:56:03 -07:00
|
|
|
|
it('shadows previously placed signs', function()
|
|
|
|
|
feed('ia<cr>b<cr>c<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
sign define piet text=>> texthl=Search
|
|
|
|
|
sign define pietx text=>! texthl=Search
|
|
|
|
|
sign place 1 line=1 name=piet buffer=1
|
|
|
|
|
sign place 2 line=3 name=piet buffer=1
|
|
|
|
|
sign place 3 line=1 name=pietx buffer=1
|
|
|
|
|
]])
|
2015-01-26 20:56:03 -07:00
|
|
|
|
screen:expect([[
|
2016-08-09 06:11:04 -07:00
|
|
|
|
{1:>!}a |
|
|
|
|
|
{2: }b |
|
|
|
|
|
{1:>>}c |
|
|
|
|
|
{2: }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2017-04-08 17:23:16 -07:00
|
|
|
|
|
|
2015-01-26 20:56:03 -07:00
|
|
|
|
]])
|
|
|
|
|
end)
|
2018-07-26 11:34:13 -07:00
|
|
|
|
|
2020-12-24 09:33:52 -07:00
|
|
|
|
it('allows signs with no text', function()
|
|
|
|
|
feed('ia<cr>b<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign define piet1 text= texthl=Search')
|
|
|
|
|
exec('sign place 1 line=1 name=piet1 buffer=1')
|
2020-12-24 09:33:52 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
a |
|
|
|
|
|
b |
|
|
|
|
|
^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*10
|
2020-12-24 09:33:52 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
|
|
|
|
|
2018-07-26 11:34:13 -07:00
|
|
|
|
it('can be called right after :split', function()
|
|
|
|
|
feed('ia<cr>b<cr>c<cr><esc>gg')
|
|
|
|
|
-- This used to cause a crash due to :sign using a special redraw
|
|
|
|
|
-- (not updating nvim's specific highlight data structures)
|
|
|
|
|
-- without proper redraw first, as split just flags for redraw later.
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
2018-07-26 11:34:13 -07:00
|
|
|
|
set cursorline
|
|
|
|
|
sign define piet text=>> texthl=Search
|
|
|
|
|
split
|
|
|
|
|
sign place 3 line=2 name=piet buffer=1
|
|
|
|
|
]])
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{2: }{3:^a }|
|
|
|
|
|
{1:>>}b |
|
|
|
|
|
{2: }c |
|
|
|
|
|
{2: } |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*2
|
2018-07-26 11:34:13 -07:00
|
|
|
|
{4:[No Name] [+] }|
|
|
|
|
|
{2: }{3:a }|
|
|
|
|
|
{1:>>}b |
|
|
|
|
|
{2: }c |
|
|
|
|
|
{2: } |
|
2019-04-03 01:48:47 -07:00
|
|
|
|
{0:~ }|
|
2018-07-26 11:34:13 -07:00
|
|
|
|
{5:[No Name] [+] }|
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2018-10-13 10:33:08 -07:00
|
|
|
|
|
|
|
|
|
it('can combine text, linehl and numhl', function()
|
|
|
|
|
feed('ia<cr>b<cr>c<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
set number
|
|
|
|
|
sign define piet text=>> texthl=Search
|
|
|
|
|
sign define pietx linehl=ErrorMsg
|
|
|
|
|
sign define pietxx numhl=Folded
|
|
|
|
|
sign place 1 line=1 name=piet buffer=1
|
|
|
|
|
sign place 2 line=2 name=pietx buffer=1
|
|
|
|
|
sign place 3 line=3 name=pietxx buffer=1
|
|
|
|
|
sign place 4 line=4 name=piet buffer=1
|
|
|
|
|
sign place 5 line=4 name=pietx buffer=1
|
|
|
|
|
sign place 6 line=4 name=pietxx buffer=1
|
|
|
|
|
]])
|
2018-10-13 10:33:08 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }{8:b }|
|
|
|
|
|
{2: }{7: 3 }c |
|
|
|
|
|
{1:>>}{7: 4 }{8:^ }|
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2021-08-01 10:16:54 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-01-10 18:52:11 -07:00
|
|
|
|
-- Check that 'statuscolumn' correctly applies numhl
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set statuscolumn=%s%=%l\\ ')
|
2023-01-10 18:52:11 -07:00
|
|
|
|
screen:expect_unchanged()
|
2021-08-01 10:16:54 -07:00
|
|
|
|
end)
|
|
|
|
|
|
2022-10-23 01:17:45 -07:00
|
|
|
|
it('highlights the cursorline sign with culhl', function()
|
2021-08-01 10:16:54 -07:00
|
|
|
|
feed('ia<cr>b<cr>c<esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
sign define piet text=>> texthl=Search culhl=ErrorMsg
|
|
|
|
|
sign place 1 line=1 name=piet buffer=1
|
|
|
|
|
sign place 2 line=2 name=piet buffer=1
|
|
|
|
|
sign place 3 line=3 name=piet buffer=1
|
|
|
|
|
set cursorline
|
|
|
|
|
]])
|
2021-08-01 10:16:54 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}a |
|
|
|
|
|
{1:>>}b |
|
|
|
|
|
{8:>>}{3:^c }|
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*10
|
2021-08-01 10:16:54 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
feed('k')
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}a |
|
|
|
|
|
{8:>>}{3:^b }|
|
|
|
|
|
{1:>>}c |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*10
|
2021-08-01 10:16:54 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set nocursorline')
|
2021-08-01 10:16:54 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}a |
|
|
|
|
|
{1:>>}^b |
|
|
|
|
|
{1:>>}c |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*10
|
2021-08-01 10:16:54 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set cursorline cursorlineopt=line')
|
2021-08-01 10:16:54 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}a |
|
|
|
|
|
{1:>>}{3:^b }|
|
|
|
|
|
{1:>>}c |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*10
|
2021-08-01 10:16:54 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set cursorlineopt=number')
|
|
|
|
|
exec('hi! link SignColumn IncSearch')
|
2023-01-10 18:52:11 -07:00
|
|
|
|
feed('Go<esc>2G')
|
2021-08-01 10:16:54 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}a |
|
|
|
|
|
{8:>>}^b |
|
|
|
|
|
{1:>>}c |
|
2023-01-10 18:52:11 -07:00
|
|
|
|
{5: } |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2018-10-13 10:33:08 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-01-10 18:52:11 -07:00
|
|
|
|
-- Check that 'statuscolumn' cursorline/signcolumn highlights are the same (#21726)
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set statuscolumn=%s')
|
2023-01-10 18:52:11 -07:00
|
|
|
|
screen:expect_unchanged()
|
2018-10-13 10:33:08 -07:00
|
|
|
|
end)
|
2018-12-24 01:39:21 -07:00
|
|
|
|
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
it('multiple signs #9295', function()
|
|
|
|
|
feed('ia<cr>b<cr>c<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
set number
|
|
|
|
|
set signcolumn=yes:2
|
|
|
|
|
sign define pietSearch text=>> texthl=Search
|
|
|
|
|
sign define pietError text=XX texthl=Error
|
|
|
|
|
sign define pietWarn text=WW texthl=Warning
|
|
|
|
|
sign place 6 line=3 name=pietSearch buffer=1
|
|
|
|
|
sign place 7 line=3 name=pietWarn buffer=1
|
|
|
|
|
sign place 5 line=3 name=pietError buffer=1
|
|
|
|
|
]])
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
-- Line 3 checks that with a limit over the maximum number
|
|
|
|
|
-- of signs, the ones with the highest Ids are being picked,
|
|
|
|
|
-- and presented by their sorted Id order.
|
2023-12-20 17:23:06 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{2: }{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
feat(signs)!: place higher-priority signs from the left #27781
Problem:
Higher-priority signs may be hidden by lower-priority signs.
Solution:
Place higher-priority signs from the left.
Example:
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='H', priority=1})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='W', priority=2})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='E', priority=3})
Before:
| |
H | W E |
^ | |
Not visible
After:
| |
| E W | H
| | ^
Not visible
Fixes #16632
2024-05-21 09:21:42 -07:00
|
|
|
|
WW{1:>>}{6: 3 }c |
|
2023-12-20 17:23:06 -07:00
|
|
|
|
{2: }{6: 4 }^ |
|
|
|
|
|
{0:~ }|*9
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
exec([[
|
|
|
|
|
sign place 1 line=1 name=pietSearch buffer=1
|
|
|
|
|
sign place 2 line=1 name=pietError buffer=1
|
|
|
|
|
" Line 2 helps checking that signs in the same line are ordered by Id.
|
|
|
|
|
sign place 4 line=2 name=pietSearch buffer=1
|
|
|
|
|
sign place 3 line=2 name=pietError buffer=1
|
|
|
|
|
]])
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
screen:expect([[
|
feat(signs)!: place higher-priority signs from the left #27781
Problem:
Higher-priority signs may be hidden by lower-priority signs.
Solution:
Place higher-priority signs from the left.
Example:
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='H', priority=1})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='W', priority=2})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='E', priority=3})
Before:
| |
H | W E |
^ | |
Not visible
After:
| |
| E W | H
| | ^
Not visible
Fixes #16632
2024-05-21 09:21:42 -07:00
|
|
|
|
{8:XX}{1:>>}{6: 1 }a |
|
|
|
|
|
{1:>>}{8:XX}{6: 2 }b |
|
|
|
|
|
WW{1:>>}{6: 3 }c |
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- With the default setting, we get the sign with the top id.
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set signcolumn=yes:1')
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
screen:expect([[
|
2021-07-28 08:11:07 -07:00
|
|
|
|
{8:XX}{6: 1 }a |
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
{1:>>}{6: 2 }b |
|
|
|
|
|
WW{6: 3 }c |
|
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- "auto:3" accommodates all the signs we defined so far.
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set signcolumn=auto:3')
|
2023-12-13 15:30:19 -07:00
|
|
|
|
local s3 = [[
|
feat(signs)!: place higher-priority signs from the left #27781
Problem:
Higher-priority signs may be hidden by lower-priority signs.
Solution:
Place higher-priority signs from the left.
Example:
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='H', priority=1})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='W', priority=2})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='E', priority=3})
Before:
| |
H | W E |
^ | |
Not visible
After:
| |
| E W | H
| | ^
Not visible
Fixes #16632
2024-05-21 09:21:42 -07:00
|
|
|
|
{8:XX}{1:>>}{2: }{6: 1 }a |
|
|
|
|
|
{1:>>}{8:XX}{2: }{6: 2 }b |
|
|
|
|
|
WW{1:>>}{8:XX}{6: 3 }c |
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
|
|
2023-12-13 15:30:19 -07:00
|
|
|
|
]]
|
|
|
|
|
screen:expect(s3)
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
-- Check "yes:9".
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set signcolumn=yes:9')
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
screen:expect([[
|
feat(signs)!: place higher-priority signs from the left #27781
Problem:
Higher-priority signs may be hidden by lower-priority signs.
Solution:
Place higher-priority signs from the left.
Example:
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='H', priority=1})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='W', priority=2})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='E', priority=3})
Before:
| |
H | W E |
^ | |
Not visible
After:
| |
| E W | H
| | ^
Not visible
Fixes #16632
2024-05-21 09:21:42 -07:00
|
|
|
|
{8:XX}{1:>>}{2: }{6: 1 }a |
|
|
|
|
|
{1:>>}{8:XX}{2: }{6: 2 }b |
|
|
|
|
|
WW{1:>>}{8:XX}{2: }{6: 3 }c |
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- Check "auto:N" larger than the maximum number of signs defined in
|
|
|
|
|
-- a single line (same result as "auto:3").
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set signcolumn=auto:4')
|
2023-12-13 15:30:19 -07:00
|
|
|
|
screen:expect(s3)
|
2020-05-15 09:22:44 -07:00
|
|
|
|
-- line deletion deletes signs.
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('3move1')
|
|
|
|
|
exec('2d')
|
2020-05-15 09:22:44 -07:00
|
|
|
|
screen:expect([[
|
feat(signs)!: place higher-priority signs from the left #27781
Problem:
Higher-priority signs may be hidden by lower-priority signs.
Solution:
Place higher-priority signs from the left.
Example:
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='H', priority=1})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='W', priority=2})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='E', priority=3})
Before:
| |
H | W E |
^ | |
Not visible
After:
| |
| E W | H
| | ^
Not visible
Fixes #16632
2024-05-21 09:21:42 -07:00
|
|
|
|
{8:XX}{1:>>}{6: 1 }a |
|
|
|
|
|
{1:>>}{8:XX}{6: 2 }^b |
|
2023-12-07 21:58:29 -07:00
|
|
|
|
{2: }{6: 3 } |
|
2023-12-13 15:30:19 -07:00
|
|
|
|
{0:~ }|*10
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- character deletion does not delete signs.
|
|
|
|
|
feed('x')
|
|
|
|
|
screen:expect([[
|
feat(signs)!: place higher-priority signs from the left #27781
Problem:
Higher-priority signs may be hidden by lower-priority signs.
Solution:
Place higher-priority signs from the left.
Example:
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='H', priority=1})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='W', priority=2})
nvim_buf_set_extmark(0, ns, 0, -1, {sign_text='E', priority=3})
Before:
| |
H | W E |
^ | |
Not visible
After:
| |
| E W | H
| | ^
Not visible
Fixes #16632
2024-05-21 09:21:42 -07:00
|
|
|
|
{8:XX}{1:>>}{6: 1 }a |
|
|
|
|
|
{1:>>}{8:XX}{6: 2 }^ |
|
2023-12-13 15:30:19 -07:00
|
|
|
|
{2: }{6: 3 } |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*10
|
2020-05-15 09:22:44 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
signs: support multiple columns #9295
closes #990
closes #9295
- Support for multiple auto-adjusted sign columns.
With this change, having more than one sign on a line, and with the
'auto' setting on 'signcolumn', extra columns will shown automatically
to accomodate all the existing signs.
For example, suppose we have this view:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
5152 return 0;
5153 }
5154
We have GitGutter installed, so it tells us about modified lines that
are not commmited. So let's change line 5152:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
~ 5152 return 0;
5153 }
5154
Now we add a mark over line 5152 using 'ma' in normal mode:
5147 }
5148
5149 return sign->typenr;
5150 }
5151 }
a ~ 5152 return 0;
5153 }
5154
Previously, Vim/Nvim would have picked only one of the signs,
because there was no support for having multiple signs in a line.
- Remove signs from deleted lines.
Suppose we have highlights on a group of lines and we delete them:
+ 6 use std::ops::Deref;
--+ 7 use std::borrow::Cow;
--+ 8 use std::io::{Cursor};
9 use proc_macro2::TokenStream;
10 use syn::export::ToTokens;
--+ 11 use std::io::Write;
>> 12 use std::ops::Deref;
Without this change, these signs will momentarily accumulate in
the sign column until the plugins wake up to refresh them.
+ --+ --+ --+ >> 6
Discussion: It may be better to extend the API a bit and allow this
to happen for only certain types of signs. For example, VIM marks
and vim-gitgutter removal signs may want to be presreved, unlike
line additions and linter highlights.
- 'signcolumn': support 'auto:NUM' and 'yes:NUM' settings
- sort signs according to id, from lowest to highest. If you have
git-gutter, vim-signature, and ALE, it would appear in this order:
git-gutter - vim-signature - ALE.
- recalculate size before screen update
- If no space for all signs, prefer the higher ids (while keeping the
rendering order from low to high).
- Prevent duplicate signs. Duplicate signs were invisible to the user,
before using our extended non-standard signcolumn settings.
- multi signcols: fix bug related to wrapped lines.
In wrapped lines, the wrapped parts of a line did not include the extra
columns if they existed. The result was a misdrawing of the wrapped
parts. Fix the issue by:
1. initializing the signcol counter to 0 when we are on a wrap boundary
2. allowing for the draw of spaces in that case.
2019-03-24 18:16:58 -07:00
|
|
|
|
end)
|
|
|
|
|
|
2021-01-20 09:37:09 -07:00
|
|
|
|
it('auto-resize sign column with minimum size (#13783)', function()
|
|
|
|
|
feed('ia<cr>b<cr>c<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set number')
|
2021-01-20 09:37:09 -07:00
|
|
|
|
-- sign column should always accommodate at the minimum size
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set signcolumn=auto:1-3')
|
2021-01-20 09:37:09 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{2: }{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
|
|
|
|
{2: }{6: 3 }c |
|
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2021-01-20 09:37:09 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- should support up to 8 signs at minimum
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set signcolumn=auto:8-9')
|
2021-01-20 09:37:09 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{2: }{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
|
|
|
|
{2: }{6: 3 }c |
|
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2021-01-20 09:37:09 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- should keep the same sign size when signs are not exceeding
|
|
|
|
|
-- the minimum
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('set signcolumn=auto:2-5')
|
|
|
|
|
exec('sign define pietSearch text=>> texthl=Search')
|
|
|
|
|
exec('sign place 1 line=1 name=pietSearch buffer=1')
|
2021-01-20 09:37:09 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}{2: }{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
|
|
|
|
{2: }{6: 3 }c |
|
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2021-01-20 09:37:09 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- should resize itself when signs are exceeding minimum but
|
|
|
|
|
-- not over the maximum
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
sign place 2 line=1 name=pietSearch buffer=1
|
|
|
|
|
sign place 3 line=1 name=pietSearch buffer=1
|
|
|
|
|
sign place 4 line=1 name=pietSearch buffer=1
|
|
|
|
|
]])
|
2021-01-20 09:37:09 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>>>>>>>}{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
|
|
|
|
{2: }{6: 3 }c |
|
2022-02-20 10:39:40 -07:00
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2021-01-20 09:37:09 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-11-27 21:40:18 -07:00
|
|
|
|
-- should not increase size because sign with existing id is moved
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign place 4 line=1 name=pietSearch buffer=1')
|
2023-11-27 21:40:18 -07:00
|
|
|
|
screen:expect_unchanged()
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign unplace 4')
|
2023-11-27 21:40:18 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>>>>>}{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
|
|
|
|
{2: }{6: 3 }c |
|
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2023-11-27 21:40:18 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign place 4 line=1 name=pietSearch buffer=1')
|
2021-01-20 09:37:09 -07:00
|
|
|
|
-- should keep the column at maximum size when signs are
|
|
|
|
|
-- exceeding the maximum
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
sign place 5 line=1 name=pietSearch buffer=1
|
|
|
|
|
sign place 6 line=1 name=pietSearch buffer=1
|
|
|
|
|
sign place 7 line=1 name=pietSearch buffer=1
|
|
|
|
|
sign place 8 line=1 name=pietSearch buffer=1
|
|
|
|
|
]])
|
2021-01-20 09:37:09 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>>>>>>>>>}{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
|
|
|
|
{2: }{6: 3 }c |
|
2022-02-20 10:39:40 -07:00
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2021-01-20 09:37:09 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
|
|
|
|
|
2022-03-09 23:34:55 -07:00
|
|
|
|
it('ignores signs with no icon and text when calculating the signcolumn width', function()
|
2020-12-24 09:33:52 -07:00
|
|
|
|
feed('ia<cr>b<cr>c<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
set number
|
|
|
|
|
set signcolumn=auto:2
|
|
|
|
|
sign define pietSearch text=>> texthl=Search
|
|
|
|
|
sign define pietError text= texthl=Error
|
|
|
|
|
sign place 2 line=1 name=pietError buffer=1
|
|
|
|
|
]])
|
2020-12-24 09:33:52 -07:00
|
|
|
|
-- no signcolumn with only empty sign
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{6: 1 }a |
|
|
|
|
|
{6: 2 }b |
|
|
|
|
|
{6: 3 }c |
|
|
|
|
|
{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2020-12-24 09:33:52 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
-- single column with 1 sign with text and one sign without
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign place 1 line=1 name=pietSearch buffer=1')
|
2020-12-24 09:33:52 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}{6: 1 }a |
|
|
|
|
|
{2: }{6: 2 }b |
|
|
|
|
|
{2: }{6: 3 }c |
|
2022-02-20 10:39:40 -07:00
|
|
|
|
{2: }{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2020-12-24 09:33:52 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
|
|
|
|
|
2023-12-19 06:25:33 -07:00
|
|
|
|
it('signcolumn=number', function()
|
2022-01-03 23:00:06 -07:00
|
|
|
|
feed('ia<cr>b<cr>c<cr><esc>')
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
|
|
|
|
set number signcolumn=number
|
|
|
|
|
sign define pietSearch text=>> texthl=Search numhl=Error
|
|
|
|
|
sign define pietError text= texthl=Search numhl=Error
|
|
|
|
|
sign place 1 line=1 name=pietSearch buffer=1
|
|
|
|
|
sign place 2 line=2 name=pietError buffer=1
|
|
|
|
|
]])
|
2023-12-19 06:25:33 -07:00
|
|
|
|
-- line number should be drawn if sign has no text
|
2022-01-03 23:00:06 -07:00
|
|
|
|
-- no signcolumn, line number for "a" is Search, for "b" is Error, for "c" is LineNr
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{1: >> }a |
|
|
|
|
|
{8: 2 }b |
|
|
|
|
|
{6: 3 }c |
|
|
|
|
|
{6: 4 }^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2022-01-03 23:00:06 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-12-19 06:25:33 -07:00
|
|
|
|
-- number column on wrapped part of a line should be empty
|
|
|
|
|
feed('gg100aa<Esc>')
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{1: >> }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
|
refactor(drawline): remove LineDrawState and wlv->saved_n_extra
We do not need an enum to keep track of what place in win_line() we
currently are at. We already have a variable which keeps track where
in the code we currently are (and thus what part of the line we are
currently rendering), it is called the _program counter_. When we need
non-linear or self-referential control-flow anyway for a laugh, we
have a mechanism for that, it is called _function calls_.
Do not "save" and "restore" the wlv->n_extra state every time the
columns are to be drawn. This sort of thing needs to go away. Instead of
setting the n_extra variables and then going to the outer while loop,
the text in the columns can be rendered by just simply putting the text
into the cells of the screen line, right away. Even in nvim this can be
tricky sometimes, luckily we can use function calls to abstract this
logic, which means that this handy data structure called the _call
stack_ is handling saving away state temporarily, and restoring it back
when we need it again.
Lastly, but not least, as we now have direct control how signs
are rendered, these can be stored as schar_T[2] and be directly
put on screen as such.
2023-11-22 11:58:17 -07:00
|
|
|
|
{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
|
|
|
|
|
{8: }aa^a |
|
2023-12-19 06:25:33 -07:00
|
|
|
|
{8: 2 }b |
|
|
|
|
|
{6: 3 }c |
|
|
|
|
|
{6: 4 } |
|
|
|
|
|
{0:~ }|*7
|
|
|
|
|
|
|
|
|
|
|
]])
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_buf_set_extmark(0, api.nvim_create_namespace('test'), 0, 0, {
|
2023-12-19 06:25:33 -07:00
|
|
|
|
virt_lines = { { { 'VIRT LINES' } } },
|
|
|
|
|
virt_lines_above = true,
|
|
|
|
|
})
|
|
|
|
|
feed('<C-Y>')
|
|
|
|
|
-- number column on virtual lines should be empty
|
|
|
|
|
screen:expect([[
|
refactor(drawline): remove LineDrawState and wlv->saved_n_extra
We do not need an enum to keep track of what place in win_line() we
currently are at. We already have a variable which keeps track where
in the code we currently are (and thus what part of the line we are
currently rendering), it is called the _program counter_. When we need
non-linear or self-referential control-flow anyway for a laugh, we
have a mechanism for that, it is called _function calls_.
Do not "save" and "restore" the wlv->n_extra state every time the
columns are to be drawn. This sort of thing needs to go away. Instead of
setting the n_extra variables and then going to the outer while loop,
the text in the columns can be rendered by just simply putting the text
into the cells of the screen line, right away. Even in nvim this can be
tricky sometimes, luckily we can use function calls to abstract this
logic, which means that this handy data structure called the _call
stack_ is handling saving away state temporarily, and restoring it back
when we need it again.
Lastly, but not least, as we now have direct control how signs
are rendered, these can be stored as schar_T[2] and be directly
put on screen as such.
2023-11-22 11:58:17 -07:00
|
|
|
|
{6: }VIRT LINES |
|
2023-12-19 06:25:33 -07:00
|
|
|
|
{1: >> }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
|
refactor(drawline): remove LineDrawState and wlv->saved_n_extra
We do not need an enum to keep track of what place in win_line() we
currently are at. We already have a variable which keeps track where
in the code we currently are (and thus what part of the line we are
currently rendering), it is called the _program counter_. When we need
non-linear or self-referential control-flow anyway for a laugh, we
have a mechanism for that, it is called _function calls_.
Do not "save" and "restore" the wlv->n_extra state every time the
columns are to be drawn. This sort of thing needs to go away. Instead of
setting the n_extra variables and then going to the outer while loop,
the text in the columns can be rendered by just simply putting the text
into the cells of the screen line, right away. Even in nvim this can be
tricky sometimes, luckily we can use function calls to abstract this
logic, which means that this handy data structure called the _call
stack_ is handling saving away state temporarily, and restoring it back
when we need it again.
Lastly, but not least, as we now have direct control how signs
are rendered, these can be stored as schar_T[2] and be directly
put on screen as such.
2023-11-22 11:58:17 -07:00
|
|
|
|
{8: }aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa|
|
|
|
|
|
{8: }aa^a |
|
2023-12-19 06:25:33 -07:00
|
|
|
|
{8: 2 }b |
|
|
|
|
|
{6: 3 }c |
|
|
|
|
|
{6: 4 } |
|
|
|
|
|
{0:~ }|*6
|
|
|
|
|
|
|
|
|
|
|
]])
|
2022-01-03 23:00:06 -07:00
|
|
|
|
end)
|
|
|
|
|
|
2018-12-24 01:39:21 -07:00
|
|
|
|
it('can have 32bit sign IDs', function()
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign define piet text=>> texthl=Search')
|
|
|
|
|
exec('sign place 100000 line=1 name=piet buffer=1')
|
2018-12-24 01:39:21 -07:00
|
|
|
|
feed(':sign place<cr>')
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>} |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*6
|
2018-12-24 01:39:21 -07:00
|
|
|
|
{4: }|
|
|
|
|
|
:sign place |
|
|
|
|
|
{9:--- Signs ---} |
|
|
|
|
|
{10:Signs for [NULL]:} |
|
2019-05-19 23:57:49 -07:00
|
|
|
|
line=1 id=100000 name=piet priority=10 |
|
2018-12-24 01:39:21 -07:00
|
|
|
|
|
|
|
|
|
|
{11:Press ENTER or type command to continue}^ |
|
|
|
|
|
]])
|
|
|
|
|
|
|
|
|
|
feed('<cr>')
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{1:>>}^ |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*12
|
2018-12-24 01:39:21 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2015-01-26 20:56:03 -07:00
|
|
|
|
end)
|
2022-09-29 00:48:39 -07:00
|
|
|
|
|
|
|
|
|
it('signcolumn width is updated when removing all signs after deleting lines', function()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_buf_set_lines(0, 0, 1, true, { 'a', 'b', 'c', 'd', 'e' })
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign define piet text=>>')
|
|
|
|
|
exec('sign place 10001 line=1 name=piet')
|
|
|
|
|
exec('sign place 10002 line=5 name=piet')
|
|
|
|
|
exec('2delete')
|
|
|
|
|
exec('sign unplace 10001')
|
2022-09-29 00:48:39 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{2: }a |
|
|
|
|
|
{2: }^c |
|
|
|
|
|
{2: }d |
|
|
|
|
|
>>e |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2022-09-29 00:48:39 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign unplace 10002')
|
2022-09-29 00:48:39 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
a |
|
|
|
|
|
^c |
|
|
|
|
|
d |
|
|
|
|
|
e |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*9
|
2022-09-29 00:48:39 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
|
|
|
|
|
|
|
|
|
it('signcolumn width is updated when removing all signs after inserting lines', function()
|
2024-01-12 10:59:57 -07:00
|
|
|
|
api.nvim_buf_set_lines(0, 0, 1, true, { 'a', 'b', 'c', 'd', 'e' })
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign define piet text=>>')
|
|
|
|
|
exec('sign place 10001 line=1 name=piet')
|
|
|
|
|
exec('sign place 10002 line=5 name=piet')
|
|
|
|
|
exec('copy .')
|
|
|
|
|
exec('sign unplace 10001')
|
2022-09-29 00:48:39 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
{2: }a |
|
|
|
|
|
{2: }^a |
|
|
|
|
|
{2: }b |
|
|
|
|
|
{2: }c |
|
|
|
|
|
{2: }d |
|
|
|
|
|
>>e |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*7
|
2022-09-29 00:48:39 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec('sign unplace 10002')
|
2022-09-29 00:48:39 -07:00
|
|
|
|
screen:expect([[
|
|
|
|
|
a |
|
|
|
|
|
^a |
|
|
|
|
|
b |
|
|
|
|
|
c |
|
|
|
|
|
d |
|
|
|
|
|
e |
|
2023-12-09 05:42:00 -07:00
|
|
|
|
{0:~ }|*7
|
2022-09-29 00:48:39 -07:00
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2023-11-23 04:58:17 -07:00
|
|
|
|
|
|
|
|
|
it('numhl highlight is applied when signcolumn=no', function()
|
|
|
|
|
screen:try_resize(screen._width, 4)
|
2023-12-20 17:23:06 -07:00
|
|
|
|
exec([[
|
2023-11-23 04:58:17 -07:00
|
|
|
|
set nu scl=no
|
|
|
|
|
call setline(1, ['line1', 'line2', 'line3'])
|
|
|
|
|
call nvim_buf_set_extmark(0, nvim_create_namespace('test'), 0, 0, {'number_hl_group':'Error'})
|
|
|
|
|
call sign_define('foo', { 'text':'F', 'numhl':'Error' })
|
|
|
|
|
call sign_place(0, '', 'foo', bufnr(''), { 'lnum':2 })
|
|
|
|
|
]])
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{8: 1 }^line1 |
|
|
|
|
|
{8: 2 }line2 |
|
|
|
|
|
{6: 3 }line3 |
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2024-01-16 10:01:51 -07:00
|
|
|
|
|
|
|
|
|
it('no negative b_signcols.count with undo after initializing', function()
|
|
|
|
|
exec([[
|
|
|
|
|
set signcolumn=auto:2
|
|
|
|
|
call setline(1, 'a')
|
|
|
|
|
call nvim_buf_set_extmark(0, nvim_create_namespace(''), 0, 0, {'sign_text':'S1'})
|
|
|
|
|
delete | redraw | undo
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2024-01-16 17:55:28 -07:00
|
|
|
|
|
|
|
|
|
it('sign not shown on line it was previously on after undo', function()
|
|
|
|
|
exec([[
|
|
|
|
|
call setline(1, range(1, 4))
|
|
|
|
|
call nvim_buf_set_extmark(0, nvim_create_namespace(''), 1, 0, {'sign_text':'S1'})
|
|
|
|
|
]])
|
|
|
|
|
exec('norm 2Gdd')
|
|
|
|
|
exec('silent undo')
|
|
|
|
|
screen:expect([[
|
|
|
|
|
{2: }1 |
|
|
|
|
|
S1^2 |
|
|
|
|
|
{2: }3 |
|
|
|
|
|
{2: }4 |
|
|
|
|
|
{0:~ }|*9
|
|
|
|
|
|
|
|
|
|
|
]])
|
|
|
|
|
end)
|
2024-01-23 14:51:18 -07:00
|
|
|
|
|
|
|
|
|
it('sign_undefine() frees all signs', function()
|
|
|
|
|
exec([[
|
|
|
|
|
sign define 1 text=1
|
|
|
|
|
sign define 2 text=2
|
|
|
|
|
call sign_undefine()
|
|
|
|
|
]])
|
|
|
|
|
eq({}, eval('sign_getdefined()'))
|
|
|
|
|
end)
|
2024-06-10 07:55:16 -07:00
|
|
|
|
|
|
|
|
|
it('no crash when unplacing signs beyond end of buffer', function()
|
|
|
|
|
exec([[
|
|
|
|
|
sign define S1 text=S1
|
|
|
|
|
sign define S2 text=S2
|
|
|
|
|
sign place 1 line=8 name=S1
|
|
|
|
|
sign place 2 line=9 name=S2
|
|
|
|
|
]])
|
|
|
|
|
-- Now placed at end of buffer
|
|
|
|
|
local s1 = {
|
|
|
|
|
grid = [[
|
|
|
|
|
S2^ |
|
|
|
|
|
{0:~ }|*12
|
|
|
|
|
|
|
|
|
|
|
]],
|
|
|
|
|
}
|
|
|
|
|
screen:expect(s1)
|
|
|
|
|
-- Signcolumn tracking used to not count signs placed beyond end of buffer here
|
|
|
|
|
exec('set signcolumn=auto:9')
|
|
|
|
|
screen:expect({
|
|
|
|
|
grid = [[
|
|
|
|
|
S2S1^ |
|
|
|
|
|
{0:~ }|*12
|
|
|
|
|
|
|
|
|
|
|
]],
|
|
|
|
|
})
|
|
|
|
|
-- Unplacing the sign does not crash by decrementing tracked signs below zero
|
|
|
|
|
exec('sign unplace 1')
|
|
|
|
|
screen:expect(s1)
|
|
|
|
|
end)
|
2015-01-26 20:56:03 -07:00
|
|
|
|
end)
|