Mercurial > vim
view src/testdir/test_matchadd_conceal.vim @ 35308:22c03485f222 v9.1.0456
patch 9.1.0456: Left shift is incorrect with vartabstop and shiftwidth=0
Commit: https://github.com/vim/vim/commit/88d4f255b7b7a19bb4f6489e0ad0956e47d51fed
Author: Gary Johnson <garyjohn@spocom.com>
Date: Sat Jun 1 20:51:33 2024 +0200
patch 9.1.0456: Left shift is incorrect with vartabstop and shiftwidth=0
Problem: Left shift is incorrect with vartabstop and shiftwidth=0
Solution: make tabstop_at() function aware of shift direction
(Gary Johnson)
The problem was that with 'vartabstop' set and 'shiftwidth' equal 0,
left shifts using << were shifting the line to the wrong column. The
tabstop to the right of the first character in the line was being used
as the shift amount instead of the tabstop to the left of that first
character.
The reason was that the tabstop_at() function always returned the value
of the tabstop to the right of the given column and was not accounting
for the direction of the shift.
The solution was to make tabstop_at() aware of the direction of the
shift and to choose the tabtop accordingly.
A test was added to check this behavior and make sure it doesn't
regress.
While at it, also fix a few indentation/alignment issues.
fixes: #14864
closes: #14887
Signed-off-by: Gary Johnson <garyjohn@spocom.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Sat, 01 Jun 2024 21:00:03 +0200 |
parents | 72245f9c9405 |
children |
line wrap: on
line source
" Test for matchadd() and conceal feature source check.vim CheckFeature conceal if !has('gui_running') && has('unix') set term=ansi endif source shared.vim source term_util.vim source view_util.vim func Test_simple_matchadd() new 1put='# This is a Test' " 1234567890123456 let expect = '# This is a Test' call cursor(1, 1) call matchadd('Conceal', '\%2l ') redraw! let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) quit! endfunc func Test_simple_matchadd_and_conceal() new setlocal concealcursor=n conceallevel=1 1put='# This is a Test' " 1234567890123456 let expect = '#XThisXisXaXTest' call cursor(1, 1) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) redraw! let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) quit! endfunc func Test_matchadd_and_conceallevel_3() new setlocal conceallevel=3 " set filetype and :syntax on to change screenattr() setlocal filetype=conf syntax on 1put='# This is a Test $' " 1234567890123 let expect = '#ThisisaTest$' call cursor(1, 1) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'X'}) redraw! let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 13)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 14)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 16)) " more matchadd() " 12345678901234 let expect = '#Thisisa Test$' call matchadd('ErrorMsg', '\%2l Test', 20, -1, {'conceal': 'X'}) redraw! call assert_equal(expect, Screenline(lnum)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 7)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 10), screenattr(lnum, 13)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 14)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 16)) call assert_notequal(screenattr(lnum, 10), screenattr(lnum, 16)) syntax off quit! endfunc func Test_default_conceal_char() new setlocal concealcursor=n conceallevel=1 1put='# This is a Test' " 1234567890123456 let expect = '# This is a Test' call cursor(1, 1) call matchadd('Conceal', '\%2l ', 10, -1, {}) redraw! let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) " 1234567890123456 let expect = '#+This+is+a+Test' let listchars_save = &listchars set listchars=conceal:+ redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) let &listchars = listchars_save quit! endfunc func Test_syn_and_match_conceal() new setlocal concealcursor=n conceallevel=1 1put='# This is a Test ' let lnum = 2 call cursor(1, 1) " 123456789012345678 let expect = '#ZThisZisZaZTestZZ' call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'}) syntax match MyConceal /\%2l / conceal containedin=ALL hi MyConceal ctermbg=4 ctermfg=2 redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) syntax clear MyConceal syntax match MyConceal /\%2l / conceal containedin=ALL cchar=* redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) " 123456789012345678 let expect = '#*This*is*a*Test**' call clearmatches() redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) " 123456789012345678 let expect = '#*ThisXis*a*Test**' call matchadd('Conceal', '\%2l\%7c ', 10, -1, {'conceal': 'X'}) redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) " 123456789012345678 let expect = '#*ThisXis*a*Test**' call matchadd('ErrorMsg', '\%2l Test', 20, -1) redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_notequal(screenattr(lnum, 12), screenattr(lnum, 13)) call assert_equal(screenattr(lnum, 13), screenattr(lnum, 16)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 17)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 18)) call assert_notequal(screenattr(lnum, 18), screenattr(lnum, 19)) " 123456789012345678 let expect = '# ThisXis a Test' syntax clear MyConceal syntax match MyConceal /\%2l / conceal containedin=ALL redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 12)) call assert_notequal(screenattr(lnum, 12), screenattr(lnum, 13)) call assert_equal(screenattr(lnum, 13), screenattr(lnum, 16)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 17)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 18)) call assert_notequal(screenattr(lnum, 18), screenattr(lnum, 19)) syntax off quit! endfunc func Test_clearmatches() new setlocal concealcursor=n conceallevel=1 1put='# This is a Test' " 1234567890123456 let expect = '# This is a Test' call cursor(1, 1) call matchadd('Conceal', '\%2l ', 10, -1, {'conceal': 'Z'}) let a = getmatches() call clearmatches() redraw! let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) " reset match using setmatches() " 1234567890123456 let expect = '#ZThisZisZaZTest' call setmatches(a) redraw! call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1), screenattr(lnum, 2)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 10)) call assert_equal(screenattr(lnum, 2), screenattr(lnum, 12)) call assert_equal(screenattr(lnum, 1), screenattr(lnum, 16)) call assert_equal({'group': 'Conceal', 'pattern': '\%2l ', 'priority': 10, 'id': a[0].id, 'conceal': 'Z'}, a[0]) quit! endfunc func Test_using_matchaddpos() new setlocal concealcursor=n conceallevel=1 " set filetype and :syntax on to change screenattr() setlocal filetype=conf syntax on 1put='# This is a Test' " 1234567890123456 let expect = '#Pis a Test' call cursor(1, 1) call matchaddpos('Conceal', [[2,2,6]], 10, -1, {'conceal': 'P'}) let a = getmatches() redraw! let lnum = 2 call assert_equal(expect, Screenline(lnum)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 2)) call assert_notequal(screenattr(lnum, 2) , screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 7)) call assert_equal(screenattr(lnum, 1) , screenattr(lnum, 10)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 12)) call assert_notequal(screenattr(lnum, 1) , screenattr(lnum, 16)) call assert_equal(screenattr(lnum, 12), screenattr(lnum, 16)) call assert_equal({'group': 'Conceal', 'id': a[0].id, 'priority': 10, 'pos1': [2, 2, 6], 'conceal': 'P'}, a[0]) syntax off quit! endfunc func Test_matchadd_repeat_conceal_with_syntax_off() new " To test targets in the same line string is replaced with conceal char " correctly, repeat 'TARGET' 1put ='TARGET_TARGETTARGET' call cursor(1, 1) redraw call assert_equal('TARGET_TARGETTARGET', Screenline(2)) setlocal conceallevel=2 call matchadd('Conceal', 'TARGET', 10, -1, {'conceal': 't'}) redraw call assert_equal('t_tt', Screenline(2)) quit! endfunc func Test_matchadd_and_syn_conceal() new let cnt='Inductive bool : Type := | true : bool | false : bool.' let expect = 'Inductive - : Type := | true : - | false : -.' 0put =cnt " set filetype and :syntax on to change screenattr() set cole=1 cocu=nv hi link CheckedByCoq WarningMsg syntax on syntax keyword coqKwd bool conceal cchar=- redraw! call assert_equal(expect, Screenline(1)) call assert_notequal(screenattr(1, 10) , screenattr(1, 11)) call assert_notequal(screenattr(1, 11) , screenattr(1, 12)) call assert_equal(screenattr(1, 11) , screenattr(1, 32)) call matchadd('CheckedByCoq', '\%<2l\%>9c\%<16c') redraw! call assert_equal(expect, Screenline(1)) call assert_notequal(screenattr(1, 10) , screenattr(1, 11)) call assert_notequal(screenattr(1, 11) , screenattr(1, 12)) call assert_equal(screenattr(1, 11) , screenattr(1, 32)) endfunc func Test_interaction_matchadd_syntax() new " Test for issue #7268 fix. " When redrawing the second column, win_line() was comparing the sequence " number of the syntax-concealed region with a bogus zero value that was " returned for the matchadd-concealed region. Before 8.0.0672 the sequence " number was never reset, thus masking the problem. call setline(1, 'aaa|bbb|ccc') call matchadd('Conceal', '^..', 10, -1, #{conceal: 'X'}) syn match foobar '^.' setl concealcursor=n conceallevel=1 redraw! call assert_equal('Xa|bbb|ccc', Screenline(1)) call assert_notequal(screenattr(1, 1), screenattr(1, 2)) bwipe! endfunc func Test_cursor_column_in_concealed_line_after_window_scroll() CheckRunVimInTerminal " Test for issue #5012 fix. " For a concealed line with cursor, there should be no window's cursor " position invalidation during win_update() after scrolling attempt that is " not successful and no real topline change happens. The invalidation would " cause a window's cursor position recalc outside of win_line() where it's " not possible to take conceal into account. let lines =<< trim END 3split let m = matchadd('Conceal', '=') setl conceallevel=2 concealcursor=nc normal gg "==expr== END call writefile(lines, 'Xcolesearch', 'D') let buf = RunVimInTerminal('Xcolesearch', {}) call TermWait(buf, 50) " Jump to something that is beyond the bottom of the window, " so there's a scroll down. call term_sendkeys(buf, ":so %\<CR>") call TermWait(buf, 50) call term_sendkeys(buf, "/expr\<CR>") call TermWait(buf, 50) " Are the concealed parts of the current line really hidden? let cursor_row = term_scrape(buf, '.')->map({_, e -> e.chars})->join('') call assert_equal('"expr', cursor_row) " BugFix check: Is the window's cursor column properly updated for hidden " parts of the current line? call assert_equal(2, term_getcursor(buf)[1]) call StopVimInTerminal(buf) endfunc func Test_cursor_column_in_concealed_line_after_leftcol_change() CheckRunVimInTerminal " Test for issue #5214 fix. let lines =<< trim END 0put = 'ab' .. repeat('-', &columns) .. 'c' call matchadd('Conceal', '-') set nowrap ss=0 cole=3 cocu=n END call writefile(lines, 'Xcurs-columns', 'D') let buf = RunVimInTerminal('-S Xcurs-columns', {}) " Go to the end of the line (3 columns beyond the end of the screen). " Horizontal scroll would center the cursor in the screen line, but conceal " makes it go to screen column 1. call term_sendkeys(buf, "$") call TermWait(buf) " Are the concealed parts of the current line really hidden? call WaitForAssert({-> assert_equal('c', term_getline(buf, '.'))}) " BugFix check: Is the window's cursor column properly updated for conceal? call assert_equal(1, term_getcursor(buf)[1]) call StopVimInTerminal(buf) endfunc " vim: shiftwidth=2 sts=2 expandtab