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.

Raspunde prin e-mail lui