patch 9.2.0090: "leadtab" behavior inconsistent on line with only TABs
Commit: https://github.com/vim/vim/commit/4b30e40a1f0c27622f71e70648aff99a5a99be5f Author: zeertzjq <[email protected]> Date: Mon Mar 2 18:18:51 2026 +0000 patch 9.2.0090: "leadtab" behavior inconsistent on line with only TABs Problem: "leadtab" behavior inconsistent on line with only TABs (after 9.2.0088). Solution: Don't consider those as leading TABs. Also add more tests for existing behavior of "lead" and "leadmultispace" (zeertzjq). closes: #19549 Signed-off-by: zeertzjq <[email protected]> Signed-off-by: Christian Brabandt <[email protected]> diff --git a/src/drawline.c b/src/drawline.c index 67e4a470f..2758e882e 100644 --- a/src/drawline.c +++ b/src/drawline.c @@ -3267,7 +3267,7 @@ win_line( // check if leadtab is set in 'listchars' if (wp->w_p_list && wp->w_lcs_chars.leadtab1 != NUL && - (leadcol == 0 || ptr < line + leadcol)) + ptr < line + leadcol) { lcs_tab1 = wp->w_lcs_chars.leadtab1; lcs_tab2 = wp->w_lcs_chars.leadtab2; diff --git a/src/testdir/test_listchars.vim b/src/testdir/test_listchars.vim index d22e9d0cf..9064b6027 100644 --- a/src/testdir/test_listchars.vim +++ b/src/testdir/test_listchars.vim @@ -151,6 +151,21 @@ func Test_listchars() call Check_listchars(expected, 5, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) + " In a line with only spaces, they aren't considered leading even if "trail" + " isn't set. + set listchars-=trail:< + let expected = [ + \ '>>>>ffffxxxx$', + \ '>>>>>>>>>>gg$', + \ 'hxxxxxxxxxxx$', + \ 'xxxxxxxxxxxx$', + \ '>>>>0xx0xxxx$', + \ '$' + \ ] + call Check_listchars(expected, 6) + call Check_listchars(expected, 5, -1, 6) + call assert_equal(expected, split(execute("%list"), " ")) + " Test multispace normal ggdG set listchars& @@ -161,6 +176,7 @@ func Test_listchars() \ ' ffff ', \ ' i i gg', \ ' h ', + \ ' ', \ ' j ', \ ' 0 0 ', \ ]) @@ -169,12 +185,13 @@ func Test_listchars() \ 'yYzZffffyYzZ$', \ 'yYi iyYzZygg$', \ ' hyYzZyYzZyY$', + \ 'yYzZyYzZyYzZ$', \ 'yYzZyYzZyYj $', \ 'yYzZ0yY0yYzZ$', \ '$' \ ] - call Check_listchars(expected, 6) - call Check_listchars(expected, 5, -1, 6) + call Check_listchars(expected, 7) + call Check_listchars(expected, 6, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) " Test leadmultispace + multispace @@ -187,6 +204,7 @@ func Test_listchars() \ ' ffff ', \ ' i i gg', \ ' h ', + \ ' ', \ ' j ', \ ' 0 0 ', \ ]) @@ -195,16 +213,17 @@ func Test_listchars() \ '.-+*ffffyYzZ$', \ '.-i iSyYzZgg$', \ ' hyYzZyYzZyY$', + \ 'yYzZyYzZyYzZ$', \ '.-+*.-+*.-j $', \ '.-+*0yY0yYzZ$', \ '$' \ ] call assert_equal('eol:$,multispace:yYzZ,nbsp:S,leadmultispace:.-+*', &listchars) - call Check_listchars(expected, 6) - call Check_listchars(expected, 5, -1, 1) - call Check_listchars(expected, 5, -1, 2) - call Check_listchars(expected, 5, -1, 3) - call Check_listchars(expected, 5, -1, 6) + call Check_listchars(expected, 7) + call Check_listchars(expected, 6, -1, 1) + call Check_listchars(expected, 6, -1, 2) + call Check_listchars(expected, 6, -1, 3) + call Check_listchars(expected, 6, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) " Test leadmultispace without multispace @@ -217,6 +236,7 @@ func Test_listchars() \ ' ffff ', \ ' i i gg', \ ' h ', + \ ' ', \ ' j ', \ ' 0 0 ', \ ]) @@ -225,16 +245,17 @@ func Test_listchars() \ '.-+*ffff>>>>$', \ '.-i+i+++++gg$', \ '+h>>>>>>>>>>$', + \ '>>>>>>>>>>>>$', \ '.-+*.-+*.-j>$', \ '.-+*0++0>>>>$', \ '$' \ ] call assert_equal('eol:$,nbsp:S,leadmultispace:.-+*,space:+,trail:>,eol:$', &listchars) - call Check_listchars(expected, 6) - call Check_listchars(expected, 5, -1, 1) - call Check_listchars(expected, 5, -1, 2) - call Check_listchars(expected, 5, -1, 3) - call Check_listchars(expected, 5, -1, 6) + call Check_listchars(expected, 7) + call Check_listchars(expected, 6, -1, 1) + call Check_listchars(expected, 6, -1, 2) + call Check_listchars(expected, 6, -1, 3) + call Check_listchars(expected, 6, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) " Test leadmultispace only @@ -247,6 +268,7 @@ func Test_listchars() \ ' ffff ', \ ' i i gg', \ ' h ', + \ ' ', \ ' j ', \ ' 0 0 ', \ ]) @@ -255,12 +277,13 @@ func Test_listchars() \ '.-+*ffff ', \ '.-i i gg', \ ' h ', + \ ' ', \ '.-+*.-+*.-j ', \ '.-+*0 0 ', \ ' ' \ ] call assert_equal('leadmultispace:.-+*', &listchars) - call Check_listchars(expected, 5, 12) + call Check_listchars(expected, 6, 12) call assert_equal(expected, split(execute("%list"), " ")) " Changing the value of 'ambiwidth' twice shouldn't cause double-free when @@ -279,6 +302,7 @@ func Test_listchars() \ ' ffff ', \ ' i i gg', \ ' h ', + \ ' ', \ ' j ', \ ' 0 0 ', \ ]) @@ -287,16 +311,17 @@ func Test_listchars() \ '.-+*ffff----$', \ '.-i-i-----gg$', \ '<h----------$', + \ '------------$', \ '.-+*.-+*.-j-$', \ '.-+*0--0----$', \ '$' \ ] call assert_equal('eol:$,lead:<,space:-,leadmultispace:.-+*', &listchars) - call Check_listchars(expected, 6) - call Check_listchars(expected, 5, -1, 1) - call Check_listchars(expected, 5, -1, 2) - call Check_listchars(expected, 5, -1, 3) - call Check_listchars(expected, 5, -1, 6) + call Check_listchars(expected, 7) + call Check_listchars(expected, 6, -1, 1) + call Check_listchars(expected, 6, -1, 2) + call Check_listchars(expected, 6, -1, 3) + call Check_listchars(expected, 6, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) " the last occurrence of 'multispace:' is used @@ -308,13 +333,14 @@ func Test_listchars() \ 'XyYXffffXyYX$', \ 'XyixiXyYXygg$', \ 'xhXyYXyYXyYX$', + \ 'XyYXyYXyYXyY$', \ 'XyYXyYXyYXjx$', \ 'XyYX0Xy0XyYX$', \ '$' \ ] call assert_equal('eol:$,multispace:yYzZ,space:x,multispace:XyY', &listchars) - call Check_listchars(expected, 6) - call Check_listchars(expected, 5, -1, 6) + call Check_listchars(expected, 7) + call Check_listchars(expected, 6, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) set listchars+=lead:>,trail:< @@ -323,12 +349,13 @@ func Test_listchars() \ '>>>>ffff<<<<$', \ '>>ixiXyYXygg$', \ '>h<<<<<<<<<<$', + \ '<<<<<<<<<<<<$', \ '>>>>>>>>>>j<$', \ '>>>>0Xy0<<<<$', \ '$' \ ] - call Check_listchars(expected, 6) - call Check_listchars(expected, 5, -1, 6) + call Check_listchars(expected, 7) + call Check_listchars(expected, 6, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) " removing 'multispace:' @@ -339,12 +366,13 @@ func Test_listchars() \ '>>>>ffff<<<<$', \ '>>ixixxxxxgg$', \ '>h<<<<<<<<<<$', + \ '<<<<<<<<<<<<$', \ '>>>>>>>>>>j<$', \ '>>>>0xx0<<<<$', \ '$' \ ] - call Check_listchars(expected, 6) - call Check_listchars(expected, 5, -1, 6) + call Check_listchars(expected, 7) + call Check_listchars(expected, 6, -1, 6) call assert_equal(expected, split(execute("%list"), " ")) " Test leadtab basic functionality @@ -392,19 +420,22 @@ func Test_listchars() call Check_listchars(expected, 1, 12) " Test leadtab vs tab distinction (leading vs non-leading) + " In a line with only tabs, they aren't considered leading. normal ggdG set listchars=tab:>-,leadtab:+* call append(0, [ \ " leading", \ "text not leading", - \ " multiple leading" + \ " multiple leading", + \ " " \ ]) let expected = [ \ '+*******leading ', \ 'text>---not leading ', - \ '+*******+*******multiple leading' + \ '+*******+*******multiple leading', + \ '>------->------- ' \ ] - call Check_listchars(expected, 3, 32) + call Check_listchars(expected, 4, 32) " Test leadtab with trail and space normal ggdG diff --git a/src/version.c b/src/version.c index 670dc27f6..5e9309c10 100644 --- a/src/version.c +++ b/src/version.c @@ -734,6 +734,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 90, /**/ 89, /**/ -- -- You received this message from the "vim_dev" maillist. Do not top-post! Type your reply below the text you are replying to. For more information, visit http://www.vim.org/maillist.php --- You received this message because you are subscribed to the Google Groups "vim_dev" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To view this discussion visit https://groups.google.com/d/msgid/vim_dev/E1vx81t-003VeF-JT%40256bit.org.
