changeset 32683:5dfaba11d7c3 v9.0.1672

patch 9.0.1672: tabline highlight wrong after truncated double width label Commit: https://github.com/vim/vim/commit/d392a74c5a8af8271a33a20d37ae1a8ea422cb4b Author: zeertzjq <zeertzjq@outlook.com> Date: Sat Jul 1 20:24:40 2023 +0100 patch 9.0.1672: tabline highlight wrong after truncated double width label Problem: Tabline highlight wrong after truncated double width label. Solution: Fill up half a double width character later. (closes https://github.com/vim/vim/issues/12614)
author Bram Moolenaar <Bram@vim.org>
date Sat, 01 Jul 2023 21:30:07 +0200
parents e311afd8e9c2
children fa275d713294
files src/buffer.c src/testdir/test_tabline.vim src/version.c
diffstat 3 files changed, 36 insertions(+), 10 deletions(-) [+]
line wrap: on
line diff
--- a/src/buffer.c
+++ b/src/buffer.c
@@ -502,7 +502,7 @@ can_unload_buffer(buf_T *buf)
  * It can be:
  * 0			buffer becomes hidden
  * DOBUF_UNLOAD		buffer is unloaded
- * DOBUF_DELETE		buffer is unloaded and removed from buffer list
+ * DOBUF_DEL		buffer is unloaded and removed from buffer list
  * DOBUF_WIPE		buffer is unloaded and really deleted
  * DOBUF_WIPE_REUSE	idem, and add to buf_reuse list
  * When doing all but the first one on the current buffer, the caller should
@@ -5108,14 +5108,6 @@ build_stl_str_hl(
 	    STRMOVE(s + 1, p);
 	    *s = '<';
 
-	    // Fill up for half a double-wide character.
-	    while (++width < maxwidth)
-	    {
-		s = s + STRLEN(s);
-		MB_CHAR2BYTES(fillchar, s);
-		*s = NUL;
-	    }
-
 	    --n;	// count the '<'
 	    for (; l < itemcnt; l++)
 	    {
@@ -5124,6 +5116,14 @@ build_stl_str_hl(
 		else
 		    stl_items[l].stl_start = s;
 	    }
+
+	    // Fill up for half a double-wide character.
+	    while (++width < maxwidth)
+	    {
+		s = s + STRLEN(s);
+		MB_CHAR2BYTES(fillchar, s);
+		*s = NUL;
+	    }
 	}
 	width = maxwidth;
     }
--- a/src/testdir/test_tabline.vim
+++ b/src/testdir/test_tabline.vim
@@ -133,7 +133,7 @@ func Test_tabline_empty_group()
   tabnew
   redraw!
 
-  tabclose
+  bw!
   set tabline=
 endfunc
 
@@ -202,4 +202,28 @@ func Test_tabline_showcmd()
   call StopVimInTerminal(buf)
 endfunc
 
+func TruncTabLine()
+  return '%1T口口%2Ta' .. repeat('b', &columns - 4) .. '%999X%#TabLine#c'
+endfunc
+
+" Test 'tabline' with truncated double-width label at the start.
+func Test_tabline_truncated_double_width()
+  tabnew
+  redraw
+  call assert_match('X$', Screenline(1))
+  let attr_TabLineFill = screenattr(1, &columns - 1)
+  let attr_TabLine = screenattr(1, &columns)
+  call assert_notequal(attr_TabLine, attr_TabLineFill)
+
+  set tabline=%!TruncTabLine()
+  redraw
+  call assert_equal('<a' .. repeat('b', &columns - 4) .. 'c', Screenline(1))
+  call assert_equal(attr_TabLineFill, screenattr(1, &columns - 2))
+  call assert_equal(attr_TabLine, screenattr(1, &columns - 1))
+  call assert_equal(attr_TabLine, screenattr(1, &columns))
+
+  bw!
+  set tabline=
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -696,6 +696,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    1672,
+/**/
     1671,
 /**/
     1670,