Merge pull request #24853 from zeertzjq/inline-virt-eol

fix(ui): wrong cursor position with left gravity inline virt text at eol
This commit is contained in:
zeertzjq 2023-08-28 06:36:51 +08:00 committed by GitHub
commit d7d3d757c1
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 241 additions and 137 deletions

View File

@ -868,8 +868,8 @@ static void apply_cursorline_highlight(win_T *wp, winlinevars_T *wlv)
} }
} }
// Checks if there is more inline virtual text that need to be drawn /// Checks if there is more inline virtual text that need to be drawn
// and sets has_more_virt_inline_chunks to reflect that. /// and sets has_more_virt_inline_chunks to reflect that.
static bool has_more_inline_virt(winlinevars_T *wlv, ptrdiff_t v) static bool has_more_inline_virt(winlinevars_T *wlv, ptrdiff_t v)
{ {
DecorState *state = &decor_state; DecorState *state = &decor_state;
@ -3096,8 +3096,8 @@ int win_line(win_T *wp, linenr_T lnum, int startrow, int endrow, bool number_onl
|| wlv.filler_todo > 0 || wlv.filler_todo > 0
|| (wp->w_p_list && wp->w_p_lcs_chars.eol != NUL || (wp->w_p_list && wp->w_p_lcs_chars.eol != NUL
&& wlv.p_extra != at_end_str) && wlv.p_extra != at_end_str)
|| (wlv.n_extra != 0 || (wlv.n_extra != 0 && (wlv.c_extra != NUL || *wlv.p_extra != NUL))
&& (wlv.c_extra != NUL || *wlv.p_extra != NUL)) || wlv.more_virt_inline_chunks)) { || wlv.more_virt_inline_chunks)) {
bool wrap = wp->w_p_wrap // Wrapping enabled. bool wrap = wp->w_p_wrap // Wrapping enabled.
&& wlv.filler_todo <= 0 // Not drawing diff filler lines. && wlv.filler_todo <= 0 // Not drawing diff filler lines.
&& lcs_eol_one != -1 // Haven't printed the lcs_eol character. && lcs_eol_one != -1 // Haven't printed the lcs_eol character.

View File

@ -862,15 +862,6 @@ void curs_columns(win_T *wp, int may_scroll)
n = (wp->w_wcol - wp->w_width_inner) / width2 + 1; n = (wp->w_wcol - wp->w_width_inner) / width2 + 1;
wp->w_wcol -= n * width2; wp->w_wcol -= n * width2;
wp->w_wrow += n; wp->w_wrow += n;
// When cursor wraps to first char of next line in Insert
// mode, the 'showbreak' string isn't shown, backup to first
// column
char *const sbr = get_showbreak_value(wp);
if (*sbr && *get_cursor_pos_ptr() == NUL
&& wp->w_wcol == (wp->w_width_inner - width2) + vim_strsize(sbr)) {
wp->w_wcol = 0;
}
} }
} else if (may_scroll } else if (may_scroll
&& !wp->w_cline_folded) { && !wp->w_cline_folded) {

View File

@ -359,7 +359,7 @@ int win_lbr_chartabsize(chartabsize_T *cts, int *headp)
if (width <= 0) { if (width <= 0) {
width = 1; width = 1;
} }
// divide "size - prev_width" by "width", rounding up // Divide "size - prev_rem" by "width", rounding up.
int cnt = (size - prev_rem + width - 1) / width; int cnt = (size - prev_rem + width - 1) / width;
added += cnt * head_mid; added += cnt * head_mid;
@ -371,7 +371,11 @@ int win_lbr_chartabsize(chartabsize_T *cts, int *headp)
} else if (max_head_vcol < 0) { } else if (max_head_vcol < 0) {
int off = virt_text_cursor_off(cts, c == NUL); int off = virt_text_cursor_off(cts, c == NUL);
if (off >= prev_rem) { if (off >= prev_rem) {
head += (1 + (off - prev_rem) / width) * head_mid; if (size > off) {
head += (1 + (off - prev_rem) / width) * head_mid;
} else {
head += (off - prev_rem + width - 1) / width * head_mid;
}
} }
} }
} }

View File

@ -21,7 +21,6 @@ describe('breakindent', function()
set listchars=eol:$ set listchars=eol:$
let &signcolumn = 'yes' let &signcolumn = 'yes'
let &showbreak = '++' let &showbreak = '++'
let &breakindent = v:true
let &breakindentopt = 'shift:2' let &breakindentopt = 'shift:2'
let leftcol = win_getid()->getwininfo()->get(0, {})->get('textoff') let leftcol = win_getid()->getwininfo()->get(0, {})->get('textoff')
eval repeat('x', &columns - leftcol - 1)->setline(1) eval repeat('x', &columns - leftcol - 1)->setline(1)
@ -39,6 +38,9 @@ describe('breakindent', function()
-- No line wraps, so changing 'showbreak' should lead to the same screen. -- No line wraps, so changing 'showbreak' should lead to the same screen.
command('setlocal showbreak=+') command('setlocal showbreak=+')
screen:expect_unchanged() screen:expect_unchanged()
-- No line wraps, so setting 'breakindent' should lead to the same screen.
command('setlocal breakindent')
screen:expect_unchanged()
-- The first line now wraps because of "eol" in 'listchars'. -- The first line now wraps because of "eol" in 'listchars'.
command('setlocal list') command('setlocal list')
screen:expect{grid=[[ screen:expect{grid=[[
@ -49,5 +51,14 @@ describe('breakindent', function()
{0:~ }| {0:~ }|
{2:-- INSERT --} | {2:-- INSERT --} |
]]} ]]}
command('setlocal nobreakindent')
screen:expect{grid=[[
{1: }xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxX|
{1: }{0:+^$} |
{1: }second line{0:$} |
{0:~ }|
{0:~ }|
{2:-- INSERT --} |
]]}
end) end)
end) end)

View File

@ -1976,91 +1976,100 @@ describe('decorations: inline virtual text', function()
end) end)
it('text is drawn correctly with a wrapping virtual text', function() it('text is drawn correctly with a wrapping virtual text', function()
screen:try_resize(50, 8) screen:try_resize(60, 8)
feed('o<esc>') exec([[
insert([[aaaaaaa call setline(1, ['', 'aaa', '', 'bbbbbb'])
normal gg0
bbbbbbb]]) ]])
meths.buf_set_extmark(0, ns, 0, 0, { virt_text = { { string.rep('X', 51), 'Special' } }, virt_text_pos = 'inline' }) meths.buf_set_extmark(0, ns, 0, 0, { virt_text = { { string.rep('X', 60), 'Special' } }, virt_text_pos = 'inline' })
meths.buf_set_extmark(0, ns, 2, 0, { virt_text = { { string.rep('X', 50), 'Special' } }, virt_text_pos = 'inline' }) meths.buf_set_extmark(0, ns, 2, 0, { virt_text = { { string.rep('X', 61), 'Special' } }, virt_text_pos = 'inline' })
feed('gg0') feed('$')
screen:expect{grid=[[ screen:expect{grid=[[
{10:^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:X} | aaa |
aaaaaaa | {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:X} |
bbbbbbb | bbbbbb |
{1:~ }| {1:~ }|
{1:~ }| {1:~ }|
| |
]]} ]]}
feed('j') feed('j')
screen:expect{grid=[[ screen:expect{grid=[[
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:X} | aa^a |
^aaaaaaa | {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:X} |
bbbbbbb | bbbbbb |
{1:~ }| {1:~ }|
{1:~ }| {1:~ }|
| |
]]} ]]}
feed('j') feed('j')
screen:expect{grid=[[ screen:expect{grid=[[
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:X} | aaa |
aaaaaaa | {10:^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:X} |
bbbbbbb | bbbbbb |
{1:~ }| {1:~ }|
{1:~ }| {1:~ }|
| |
]]} ]]}
feed('j') feed('j')
screen:expect{grid=[[ screen:expect{grid=[[
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:X} | aaa |
aaaaaaa | {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:X} |
^bbbbbbb | bbbbb^b |
{1:~ }| {1:~ }|
{1:~ }| {1:~ }|
| |
]]} ]]}
feed('0<C-V>2l2k')
feed('ggic')
screen:expect{grid=[[ screen:expect{grid=[[
c{10:^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:XX} | {7:aa}^a |
aaaaaaa | {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}| {10:X} |
bbbbbbb | {7:bbb}bbb |
{1:~ }| {1:~ }|
{1:~ }| {1:~ }|
{8:-- INSERT --} | {8:-- VISUAL BLOCK --} |
]]} ]]}
end) feed([[<Esc>/aaa\n\%V<CR>]])
it('regexp \\%V does not count trailing virtual text', function()
screen:try_resize(50, 4)
meths.buf_set_lines(0, 0, -1, true, {'foofoo', '', 'foofoo'})
meths.buf_set_extmark(0, ns, 1, 0, { virt_text = {{'barbarbar', 'Special'}}, virt_text_pos = 'inline' })
feed([[<C-V>G5l<Esc>/foo\n\%V<CR>]])
screen:expect{grid=[[ screen:expect{grid=[[
foo{12:^foo } | {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:barbarbar} | {12:^aaa } |
foofoo | {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{16:search hit BOTTOM, continuing at TOP} | {10:X} |
bbbbbb |
{1:~ }|
{1:~ }|
{16:search hit BOTTOM, continuing at TOP} |
]]} ]]}
feed([[jIbaz<Esc>/foo\nbaz\%V<CR>]]) feed('3ggic')
screen:expect{grid=[[ screen:expect{grid=[[
foo{12:^foo } | {10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{12:baz}{10:barbarbar} | {12:aaa } |
foofoo | c{10:^XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{16:search hit BOTTOM, continuing at TOP} | {10:XX} |
bbbbbb |
{1:~ }|
{1:~ }|
{8:-- INSERT --} |
]]}
feed([[<Esc>/aaa\nc\%V<CR>]])
screen:expect{grid=[[
{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{12:^aaa } |
{12:c}{10:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX}|
{10:XX} |
bbbbbb |
{1:~ }|
{1:~ }|
{16:search hit BOTTOM, continuing at TOP} |
]]} ]]}
end) end)
@ -2209,111 +2218,119 @@ bbbbbbb]])
end) end)
it('cursor position is correct when inserting around a virtual text with left gravity', function() it('cursor position is correct when inserting around a virtual text with left gravity', function()
insert('foo foo foo foo') screen:try_resize(27, 4)
meths.buf_set_extmark(0, ns, 0, 8, { virt_text = { { 'virtual text', 'Special' } }, virt_text_pos = 'inline', right_gravity = false }) insert(('a'):rep(15))
feed('0') meths.buf_set_extmark(0, ns, 0, 8, { virt_text = { { ('>'):rep(43), 'Special' } }, virt_text_pos = 'inline', right_gravity = false })
feed('8l') command('setlocal showbreak=+ breakindent breakindentopt=shift:2')
feed('08l')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:virtual text}^foo foo | aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>>>>>>>>>}|
| {1:+}^aaaaaaa |
|
]]} ]]}
feed('i') feed('i')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:virtual text}^foo foo | aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>>>>>>>>>}|
{8:-- INSERT --} | {1:+}^aaaaaaa |
{8:-- INSERT --} |
]]} ]]}
feed([[<C-\><C-O>]]) feed([[<C-\><C-O>]])
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:virtual text}^foo foo | aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>>>>>>>>>}|
{8:-- (insert) --} | {1:+}^aaaaaaa |
{8:-- (insert) --} |
]]} ]]}
feed('D') feed('D')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:virtual text}^ | aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>>>>>>>>>}|
{8:-- INSERT --} | {1:^~ }|
{8:-- INSERT --} |
]]}
command('setlocal list listchars=eol:$')
screen:expect{grid=[[
aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:+^$} |
{8:-- INSERT --} |
]]} ]]}
feed('<C-U>') feed('<C-U>')
screen:expect{grid=[[ screen:expect{grid=[[
{10:virtual text}^ | {10:>>>>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>}{1:^$} |
{8:-- INSERT --} | {1:~ }|
{8:-- INSERT --} |
]]} ]]}
feed('a') feed('a')
screen:expect{grid=[[ screen:expect{grid=[[
{10:virtual text}a^ | {10:>>>>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>}a{1:^$} |
{8:-- INSERT --} | {1:~ }|
{8:-- INSERT --} |
]]} ]]}
feed('<Esc>') feed('<Esc>')
screen:expect{grid=[[ screen:expect{grid=[[
{10:virtual text}^a | {10:>>>>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>}^a{1:$} |
| {1:~ }|
|
]]} ]]}
feed('x') feed('x')
screen:expect{grid=[[ screen:expect{grid=[[
{10:^virtual text} | {10:^>>>>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:~ }| {1:+}{10:>>>>>>>>>>>>>>>>}{1:$} |
| {1:~ }|
|
]]} ]]}
end) end)
it('cursor position is correct when inserting around virtual texts with both left and right gravity', function() it('cursor position is correct when inserting around virtual texts with both left and right gravity', function()
screen:try_resize(30, 4) screen:try_resize(30, 4)
command('setlocal showbreak=+ breakindent breakindentopt=shift:2') command('setlocal showbreak=+ breakindent breakindentopt=shift:2')
insert('foo foo foo foo') insert(('a'):rep(15))
meths.buf_set_extmark(0, ns, 0, 8, { virt_text = {{ ('>'):rep(32), 'Special' }}, virt_text_pos = 'inline', right_gravity = false }) meths.buf_set_extmark(0, ns, 0, 8, { virt_text = {{ ('>'):rep(32), 'Special' }}, virt_text_pos = 'inline', right_gravity = false })
meths.buf_set_extmark(0, ns, 0, 8, { virt_text = {{ ('<'):rep(32), 'Special' }}, virt_text_pos = 'inline', right_gravity = true }) meths.buf_set_extmark(0, ns, 0, 8, { virt_text = {{ ('<'):rep(32), 'Special' }}, virt_text_pos = 'inline', right_gravity = true })
feed('08l') feed('08l')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:>>>>>>>>>>>>>>>>>>>>>>}| aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>>>>>>>>><<<<<<<<<<<<<<<<<}| {1:+}{10:>>>>>>>>>><<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<<<<<<<<<<<<<}^foo foo | {1:+}{10:<<<<<<<<<<<<<<<}^aaaaaaa |
| |
]]} ]]}
feed('i') feed('i')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:>>>>>>>>>>>>>>>>>>>>>>}| aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>>>>>>>>>^<<<<<<<<<<<<<<<<<}| {1:+}{10:>>>>>>>>>>^<<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<<<<<<<<<<<<<}foo foo | {1:+}{10:<<<<<<<<<<<<<<<}aaaaaaa |
{8:-- INSERT --} | {8:-- INSERT --} |
]]} ]]}
feed('a') feed('a')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:>>>>>>>>>>>>>>>>>>>>>>}| aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>>>>>>>>>}a{10:^<<<<<<<<<<<<<<<<}| {1:+}{10:>>>>>>>>>>}a{10:^<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<<<<<<<<<<<<<<}foo foo | {1:+}{10:<<<<<<<<<<<<<<<<}aaaaaaa |
{8:-- INSERT --} | {8:-- INSERT --} |
]]} ]]}
feed([[<C-\><C-O>]]) feed([[<C-\><C-O>]])
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:>>>>>>>>>>>>>>>>>>>>>>}| aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>>>>>>>>>}a{10:<<<<<<<<<<<<<<<<}| {1:+}{10:>>>>>>>>>>}a{10:<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<<<<<<<<<<<<<<}^foo foo | {1:+}{10:<<<<<<<<<<<<<<<<}^aaaaaaa |
{8:-- (insert) --} | {8:-- (insert) --} |
]]} ]]}
feed('D') feed('D')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:>>>>>>>>>>>>>>>>>>>>>>}| aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>>>>>>>>>}a{10:^<<<<<<<<<<<<<<<<}| {1:+}{10:>>>>>>>>>>}a{10:^<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<<<<<<<<<<<<<<} | {1:+}{10:<<<<<<<<<<<<<<<<} |
{8:-- INSERT --} | {8:-- INSERT --} |
]]} ]]}
feed('<BS>') feed('<BS>')
screen:expect{grid=[[ screen:expect{grid=[[
foo foo {10:>>>>>>>>>>>>>>>>>>>>>>}| aaaaaaaa{10:>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>>>>>>>>>^<<<<<<<<<<<<<<<<<}| {1:+}{10:>>>>>>>>>>^<<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<<<<<<<<<<<<<} | {1:+}{10:<<<<<<<<<<<<<<<} |
{8:-- INSERT --} | {8:-- INSERT --} |
@ -2346,6 +2363,27 @@ bbbbbbb]])
{1:+}{10:<<<<<<<} | {1:+}{10:<<<<<<<} |
| |
]]} ]]}
feed('i')
screen:expect{grid=[[
{10:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:>>^<<<<<<<<<<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<<<<<} |
{8:-- INSERT --} |
]]}
screen:try_resize(32, 4)
screen:expect{grid=[[
{10:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}|
{1:+}{10:<<<} |
{8:-- INSERT --} |
]]}
command('setlocal nobreakindent')
screen:expect{grid=[[
{10:>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>}|
{1:+}{10:^<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<}|
{1:+}{10:<} |
{8:-- INSERT --} |
]]}
end) end)
it('draws correctly with no wrap multiple virtual text, where one is hidden', function() it('draws correctly with no wrap multiple virtual text, where one is hidden', function()
@ -2639,7 +2677,45 @@ bbbbbbb]])
]]} ]]}
end) end)
it('list "extends" is drawn with only inline virtual text offscreen', function() it('lcs-extends is drawn with inline virtual text at end of screen line', function()
exec([[
setlocal nowrap list listchars=extends:!
call setline(1, repeat('a', 51))
]])
meths.buf_set_extmark(0, ns, 0, 50, { virt_text = { { 'bbb', 'Special' } }, virt_text_pos = 'inline' })
feed('20l')
screen:expect{grid=[[
aaaaaaaaaaaaaaaaaaaa^aaaaaaaaaaaaaaaaaaaaaaaaaaaaa{1:!}|
{1:~ }|
|
]]}
feed('zl')
screen:expect{grid=[[
aaaaaaaaaaaaaaaaaaa^aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{1:!}|
{1:~ }|
|
]]}
feed('zl')
screen:expect{grid=[[
aaaaaaaaaaaaaaaaaa^aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{10:b}{1:!}|
{1:~ }|
|
]]}
feed('zl')
screen:expect{grid=[[
aaaaaaaaaaaaaaaaa^aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{10:bb}{1:!}|
{1:~ }|
|
]]}
feed('zl')
screen:expect{grid=[[
aaaaaaaaaaaaaaaa^aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa{10:bbb}a|
{1:~ }|
|
]]}
end)
it('lcs-extends is drawn with only inline virtual text offscreen', function()
command('set nowrap') command('set nowrap')
command('set list') command('set list')
command('set listchars+=extends:c') command('set listchars+=extends:c')
@ -2797,9 +2873,9 @@ bbbbbbb]])
screen:try_resize(30, 6) screen:try_resize(30, 6)
exec([[ exec([[
highlight! link LineNr Normal highlight! link LineNr Normal
call setline(1, repeat('a', 28))
setlocal number showbreak=+ breakindent breakindentopt=shift:2 setlocal number showbreak=+ breakindent breakindentopt=shift:2
setlocal scrolloff=0 smoothscroll setlocal scrolloff=0 smoothscroll
call setline(1, repeat('a', 28))
normal! $ normal! $
]]) ]])
meths.buf_set_extmark(0, ns, 0, 27, { virt_text = { { ('123'):rep(23) } }, virt_text_pos = 'inline' }) meths.buf_set_extmark(0, ns, 0, 27, { virt_text = { { ('123'):rep(23) } }, virt_text_pos = 'inline' })
@ -3002,6 +3078,24 @@ bbbbbbb]])
{1:~ }| {1:~ }|
| |
]]} ]]}
feed('26ia<Esc>a')
screen:expect{grid=[[
1 aaaaaaaaaaaaaaaaaaaaaaaaaa|
{1:+}^12312312312312312312312|
{1:+}31231231231231231231231|
{1:+}23123123123123123123123|
{1:~ }|
{8:-- INSERT --} |
]]}
feed([[<C-\><C-O>:setlocal breakindentopt=<CR>]])
screen:expect{grid=[[
1 aaaaaaaaaaaaaaaaaaaaaaaaaa|
{1:+}^1231231231231231231231231|
{1:+}2312312312312312312312312|
{1:+}3123123123123123123 |
{1:~ }|
{8:-- INSERT --} |
]]}
end end
describe('with showbreak, smoothscroll', function() describe('with showbreak, smoothscroll', function()
@ -3019,8 +3113,8 @@ bbbbbbb]])
it('before TABs with smoothscroll', function() it('before TABs with smoothscroll', function()
screen:try_resize(30, 6) screen:try_resize(30, 6)
exec([[ exec([[
call setline(1, repeat("\t", 4) .. 'a')
setlocal list listchars=tab:<-> scrolloff=0 smoothscroll setlocal list listchars=tab:<-> scrolloff=0 smoothscroll
call setline(1, repeat("\t", 4) .. 'a')
normal! $ normal! $
]]) ]])
meths.buf_set_extmark(0, ns, 0, 3, { virt_text = { { ('12'):rep(32) } }, virt_text_pos = 'inline' }) meths.buf_set_extmark(0, ns, 0, 3, { virt_text = { { ('12'):rep(32) } }, virt_text_pos = 'inline' })

View File

@ -938,7 +938,6 @@ func Test_cursor_position_with_showbreak()
vim9script vim9script
&signcolumn = 'yes' &signcolumn = 'yes'
&showbreak = '++' &showbreak = '++'
&breakindent = true
&breakindentopt = 'shift:2' &breakindentopt = 'shift:2'
var leftcol: number = win_getid()->getwininfo()->get(0, {})->get('textoff') var leftcol: number = win_getid()->getwininfo()->get(0, {})->get('textoff')
repeat('x', &columns - leftcol - 1)->setline(1) repeat('x', &columns - leftcol - 1)->setline(1)
@ -952,9 +951,14 @@ func Test_cursor_position_with_showbreak()
" No line wraps, so changing 'showbreak' should lead to the same screen. " No line wraps, so changing 'showbreak' should lead to the same screen.
call term_sendkeys(buf, "\<C-\>\<C-O>:setlocal showbreak=+\<CR>") call term_sendkeys(buf, "\<C-\>\<C-O>:setlocal showbreak=+\<CR>")
call VerifyScreenDump(buf, 'Test_cursor_position_with_showbreak_1', {}) call VerifyScreenDump(buf, 'Test_cursor_position_with_showbreak_1', {})
" No line wraps, so setting 'breakindent' should lead to the same screen.
call term_sendkeys(buf, "\<C-\>\<C-O>:setlocal breakindent\<CR>")
call VerifyScreenDump(buf, 'Test_cursor_position_with_showbreak_1', {})
" The first line now wraps because of "eol" in 'listchars'. " The first line now wraps because of "eol" in 'listchars'.
call term_sendkeys(buf, "\<C-\>\<C-O>:setlocal list\<CR>") call term_sendkeys(buf, "\<C-\>\<C-O>:setlocal list\<CR>")
call VerifyScreenDump(buf, 'Test_cursor_position_with_showbreak_2', {}) call VerifyScreenDump(buf, 'Test_cursor_position_with_showbreak_2', {})
call term_sendkeys(buf, "\<C-\>\<C-O>:setlocal nobreakindent\<CR>")
call VerifyScreenDump(buf, 'Test_cursor_position_with_showbreak_3', {})
call StopVimInTerminal(buf) call StopVimInTerminal(buf)
endfunc endfunc