Commit: patch 9.2.1114: Visual selection is not highlighted at the cursor position

4 views
Skip to first unread message

Christian Brabandt

unread,
Sep 16, 2026, 2:30:19 PM (2 days ago) Sep 16
to vim...@googlegroups.com
patch 9.2.1114: Visual selection is not highlighted at the cursor position

Commit: https://github.com/vim/vim/commit/d10aab4ba6602f8f2f2576d2d62ceb63869db6fb
Author: Shane Harper <sh...@shaneharper.net>
Date: Wed Sep 16 18:16:41 2026 +0000

patch 9.2.1114: Visual selection is not highlighted at the cursor position

Problem: In a terminal the character under the cursor is normally not
shown as part of the visual selection.
Solution: Don't set "noinvcur" in win_line() (Shane Harper).

The problem did not occur in the GUI, only in a terminal.

The name "noinvcur" ("don't invert the cursor") was misleading: the
variable did not affect the cursor, but whether the character under the
cursor could be displayed as part of the visual selection.

The "noinvcur" handling may have been meant to help during a visual
selection when Visual is shown in reverse video and the terminal draws
the cursor by inverting the character under it, as otherwise the
character under the cursor would not look highlighted like the rest of
the selection. But Vim cannot know in general how a terminal draws the
cursor, and when either the cursor is not drawn by inverting the
character under it or Visual is not shown in reverse video, the handling
just left a character of the visual selection unhighlighted.

closes: #21317

Signed-off-by: Shane Harper <sh...@shaneharper.net>
Signed-off-by: Christian Brabandt <c...@256bit.org>

diff --git a/src/drawline.c b/src/drawline.c
index 01ef8dc23..b0db203c3 100644
--- a/src/drawline.c
+++ b/src/drawline.c
@@ -1165,7 +1165,6 @@ win_line(
winlinevars_T wlv; // variables passed between functions

int c = 0; // init for GCC
- long vcol_prev = -1; // "wlv.vcol" of previous character
char_u *line; // current line
char_u *ptr; // current position in "line"
int in_curline = wp == curwin && lnum == curwin->w_cursor.lnum;
@@ -1189,8 +1188,6 @@ win_line(
// w_skipcol or concealing
int skipped_cells = 0; // nr of skipped cells for virtual text
// to be added to wlv.vcol later
- int fromcol_prev = -2; // start of inverting after cursor
- int noinvcur = FALSE; // don't invert the cursor
int lnum_in_visual_area = FALSE;
pos_T pos;
long v;
@@ -1451,14 +1448,6 @@ win_line(
}
}

- // Check if the character under the cursor should not be inverted
- if (!highlight_match && in_curline
-#ifdef FEAT_GUI
- && !gui.in_use
-#endif
- )
- noinvcur = TRUE;
-
// if inverting in this line set area_highlighting
if (wlv.fromcol >= 0)
{
@@ -1963,26 +1952,8 @@ win_line(
#endif
}

- // Correct highlighting for cursor that can't be disabled.
- // Avoids having to check this for each character.
- if (wlv.fromcol >= 0)
- {
- if (noinvcur)
- {
- if ((colnr_T)wlv.fromcol == wp->w_virtcol)
- {
- // highlighting starts at cursor, let it start just after the
- // cursor
- fromcol_prev = wlv.fromcol;
- wlv.fromcol = -1;
- }
- else if ((colnr_T)wlv.fromcol < wp->w_virtcol)
- // restart highlighting after the cursor
- fromcol_prev = wp->w_virtcol;
- }
- if (wlv.fromcol >= wlv.tocol)
- wlv.fromcol = -1;
- }
+ if (wlv.fromcol >= wlv.tocol)
+ wlv.fromcol = -1;

#ifdef FEAT_SEARCH_EXTRA
if (number_only == 0)
@@ -2514,14 +2485,9 @@ win_line(
|| (has_mbyte && wlv.vcol + 1 == wlv.fromcol
&& ((wlv.n_extra == 0 && (*mb_ptr2cells)(ptr) > 1)
|| (wlv.n_extra > 0 && wlv.p_extra != NULL
- && (*mb_ptr2cells)(wlv.p_extra) > 1)))
- || ((int)vcol_prev == fromcol_prev
- && vcol_prev < wlv.vcol // not at margin
- && wlv.vcol < wlv.tocol))
+ && (*mb_ptr2cells)(wlv.p_extra) > 1))))
*area_attr_p = vi_attr; // start highlighting
- else if (*area_attr_p != 0
- && (wlv.vcol == wlv.tocol
- || (noinvcur && (colnr_T)wlv.vcol == wp->w_virtcol)))
+ else if (*area_attr_p != 0 && wlv.vcol == wlv.tocol)
*area_attr_p = 0; // stop highlighting

if (wlv.n_extra == 0)
@@ -2691,11 +2657,9 @@ win_line(
else if (wlv.line_attr != 0
&& ((wlv.fromcol == -10 && wlv.tocol == MAXCOL)
|| wlv.vcol < wlv.fromcol
- || vcol_prev < fromcol_prev
|| wlv.vcol >= wlv.tocol))
{
// Use wlv.line_attr when not in the Visual or 'incsearch' area
- // (area_attr may be 0 when "noinvcur" is set).
# ifdef FEAT_SYN_HL
wlv.char_attr = hl_combine_attr(syntax_attr, wlv.line_attr);
# else
@@ -3490,17 +3454,14 @@ win_line(
else if (c == NUL
&& wlv.n_extra == 0
&& (wp->w_p_list
- || ((wlv.fromcol >= 0 || fromcol_prev >= 0)
+ || (wlv.fromcol >= 0
&& wlv.tocol > wlv.vcol
&& VIsual_mode != Ctrl_V
&& (
#ifdef FEAT_RIGHTLEFT
wp->w_p_rl ? (wlv.col >= 0) :
#endif
- (wlv.col < wp->w_width))
- && !(noinvcur
- && lnum == wp->w_cursor.lnum
- && (colnr_T)wlv.vcol == wp->w_virtcol)))
+ (wlv.col < wp->w_width))))
&& lcs_eol_one > 0)
{
// Display a '$' after the line or highlight an extra
@@ -4128,9 +4089,6 @@ win_line(
}
#endif

- if (wlv.draw_state == WL_LINE)
- vcol_prev = wlv.vcol;
-
// Store character to be displayed.
// Skip characters that are left of the screen for 'nowrap'.
if (wlv.draw_state < WL_LINE || skip_cells <= 0)
diff --git a/src/testdir/dumps/Test_balloon_eval_term_02.dump b/src/testdir/dumps/Test_balloon_eval_term_02.dump
index f3bd6331c..67fb98122 100644
--- a/src/testdir/dumps/Test_balloon_eval_term_02.dump
+++ b/src/testdir/dumps/Test_balloon_eval_term_02.dump
@@ -1,6 +1,6 @@
|o+0&#ffffff0|n|e| |o|n|e| |o|n|e| @38
|t|w|o| |t|X|o| |t|w|o| @38
-|t|h|r|e|e+0#0000001#a8a8a8255| |t|h>r+0#0000000#ffffff0|e@1| |t|h|r|e@1| @32
+|t|h|r|e|e+0#0000001#a8a8a8255| |t|h>r|e+0#0000000#ffffff0@1| |t|h|r|e@1| @32
|~+0#4040ff13&| @2| +0#0000001#ffd7ff255@17| +0#4040ff13#ffffff0@27
|~| @2| +0#0000001#ffd7ff255|l|i|n|e| |3| |c|o|l|u|m|n| |5|:| | +0#4040ff13#ffffff0@27
|~| @2| +0#0000001#ffd7ff255|e| |t|h|r|<| @10| +0#4040ff13#ffffff0@27
diff --git a/src/testdir/dumps/Test_conceal_two_windows_06v.dump b/src/testdir/dumps/Test_conceal_two_windows_06v.dump
index 745662574..82c6d3367 100644
--- a/src/testdir/dumps/Test_conceal_two_windows_06v.dump
+++ b/src/testdir/dumps/Test_conceal_two_windows_06v.dump
@@ -9,7 +9,7 @@
|~| @73
|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|3|,|1|4| @10|A|l@1
|o+0&&|n|e| |o|n|e| |o|n|e| |o|n|e| |o|n|e| @55
-|t|w|o| |||h|i|d@1|e|n||| >h|e|r|e| @57
+|t|w|o| |||h|i|d@1|e|n||| >h+0#0000001#a8a8a8255|e+0#0000000#ffffff0|r|e| @57
|t|h|r|e@1| @1|t|h|r|e@1| @62
|~+0#4040ff13&| @73
|~| @73
diff --git a/src/testdir/dumps/Test_conceal_two_windows_07v.dump b/src/testdir/dumps/Test_conceal_two_windows_07v.dump
index 745662574..82c6d3367 100644
--- a/src/testdir/dumps/Test_conceal_two_windows_07v.dump
+++ b/src/testdir/dumps/Test_conceal_two_windows_07v.dump
@@ -9,7 +9,7 @@
|~| @73
|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|3|,|1|4| @10|A|l@1
|o+0&&|n|e| |o|n|e| |o|n|e| |o|n|e| |o|n|e| @55
-|t|w|o| |||h|i|d@1|e|n||| >h|e|r|e| @57
+|t|w|o| |||h|i|d@1|e|n||| >h+0#0000001#a8a8a8255|e+0#0000000#ffffff0|r|e| @57
|t|h|r|e@1| @1|t|h|r|e@1| @62
|~+0#4040ff13&| @73
|~| @73
diff --git a/src/testdir/dumps/Test_conceal_two_windows_08v.dump b/src/testdir/dumps/Test_conceal_two_windows_08v.dump
index 745662574..82c6d3367 100644
--- a/src/testdir/dumps/Test_conceal_two_windows_08v.dump
+++ b/src/testdir/dumps/Test_conceal_two_windows_08v.dump
@@ -9,7 +9,7 @@
|~| @73
|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|3|,|1|4| @10|A|l@1
|o+0&&|n|e| |o|n|e| |o|n|e| |o|n|e| |o|n|e| @55
-|t|w|o| |||h|i|d@1|e|n||| >h|e|r|e| @57
+|t|w|o| |||h|i|d@1|e|n||| >h+0#0000001#a8a8a8255|e+0#0000000#ffffff0|r|e| @57
|t|h|r|e@1| @1|t|h|r|e@1| @62
|~+0#4040ff13&| @73
|~| @73
diff --git a/src/testdir/dumps/Test_conceal_two_windows_09v.dump b/src/testdir/dumps/Test_conceal_two_windows_09v.dump
index 8d6cb4bc3..9242103e0 100644
--- a/src/testdir/dumps/Test_conceal_two_windows_09v.dump
+++ b/src/testdir/dumps/Test_conceal_two_windows_09v.dump
@@ -9,7 +9,7 @@
|~| @73
|[+1#0000000&|N|o| |N|a|m|e|]| |[|+|]| @43|3|,|1|4| @10|A|l@1
|o+0&&|n|e| |o|n|e| |o|n|e| |o|n|e| |o|n|e| @55
-|t|w|o| @1>h|e|r|e| @65
+|t|w|o| @1>h+0#0000001#a8a8a8255|e+0#0000000#ffffff0|r|e| @65
|t|h|r|e@1| @1|t|h|r|e@1| @62
|~+0#4040ff13&| @73
|~| @73
diff --git a/src/testdir/dumps/Test_cursorline_with_visualmode_01.dump b/src/testdir/dumps/Test_cursorline_with_visualmode_01.dump
index 326abac37..d7e2212d4 100644
--- a/src/testdir/dumps/Test_cursorline_with_visualmode_01.dump
+++ b/src/testdir/dumps/Test_cursorline_with_visualmode_01.dump
@@ -3,7 +3,7 @@
|a+0#0000001#a8a8a8255|b|c| | +0#0000000#ffffff0@70
|a+0#0000001#a8a8a8255|b|c| | +0#0000000#ffffff0@70
|a+0#0000001#a8a8a8255|b|c| | +0#0000000#ffffff0@70
->a|b+0#0000001#a8a8a8255|c| | +0#0000000#ffffff0@70
+>a+0#0000001#a8a8a8255|b|c| | +0#0000000#ffffff0@70
|a|b|c| @71
|a|b|c| @71
|a|b|c| @71
diff --git a/src/testdir/dumps/Test_display_scroll_update_visual.dump b/src/testdir/dumps/Test_display_scroll_update_visual.dump
index 4b17a3b88..df5d9a4ad 100644
--- a/src/testdir/dumps/Test_display_scroll_update_visual.dump
+++ b/src/testdir/dumps/Test_display_scroll_update_visual.dump
@@ -1,4 +1,4 @@
-| +0#0000e05#a8a8a8255@1>f+0#0000000#ffffff0|o+0#0000001#a8a8a8255@1| | +0#0000000#ffffff0@53
+| +0#0000e05#a8a8a8255@1>f+0#0000001&|o@1| | +0#0000000#ffffff0@53
| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @54
| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @54
| +0#0000e05#a8a8a8255@1|f+0#0000000#ffffff0|o@1| @54
diff --git a/src/testdir/dumps/Test_echowin_showmode.dump b/src/testdir/dumps/Test_echowin_showmode.dump
index 9a73bbf25..8dc0bd133 100644
--- a/src/testdir/dumps/Test_echowin_showmode.dump
+++ b/src/testdir/dumps/Test_echowin_showmode.dump
@@ -1,4 +1,4 @@
->o+0&#ffffff0|n+0#0000001#a8a8a8255|e| | +0#0000000#ffffff0@70
+>o+0#0000001#a8a8a8255|n|e| | +0#0000000#ffffff0@70
|t|w|o| @71
|~+0#4040ff13&| @73
|~| @73
diff --git a/src/testdir/dumps/Test_hlsearch_visual_1.dump b/src/testdir/dumps/Test_hlsearch_visual_1.dump
index e65d56764..0f37686a9 100644
--- a/src/testdir/dumps/Test_hlsearch_visual_1.dump
+++ b/src/testdir/dumps/Test_hlsearch_visual_1.dump
@@ -1,6 +1,6 @@
|x+0&#ffffff0@2| |y+2&#ffff4012|y+2#0000001#a8a8a8255@1| +0&&|z@2| | +0#0000000#ffffff0@27
|x+0#0000001#a8a8a8255@2| |y+2&&@2| +0&&|z@2| | +0#0000000#ffffff0@27
-|x+0#0000001#a8a8a8255@2| |y+2&&>y+2#0000000#ffff4012@1| +0&#ffffff0|z@2| @28
+|x+0#0000001#a8a8a8255@2| |y+2&&>y|y+2#0000000#ffff4012| +0&#ffffff0|z@2| @28
|~+0#4040ff13&| @38
|~| @38
|-+2#0000000&@1| |V|I|S|U|A|L| |-@1|3+0&&| @8|3|,|6| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_mode_cleared_after_silent_message_1.dump b/src/testdir/dumps/Test_mode_cleared_after_silent_message_1.dump
index 5a704d60e..42aa6149b 100644
--- a/src/testdir/dumps/Test_mode_cleared_after_silent_message_1.dump
+++ b/src/testdir/dumps/Test_mode_cleared_after_silent_message_1.dump
@@ -1,4 +1,4 @@
->f+0&#ffffff0|o@1|b|a|r| @68
+>f+0#0000001#a8a8a8255|o+0#0000000#ffffff0@1|b|a|r| @68
|~+0#4040ff13&| @73
|~| @73
|~| @73
diff --git a/src/testdir/dumps/Test_popup_command_03.dump b/src/testdir/dumps/Test_popup_command_03.dump
index 2a0c5af50..7025ee837 100644
--- a/src/testdir/dumps/Test_popup_command_03.dump
+++ b/src/testdir/dumps/Test_popup_command_03.dump
@@ -1,5 +1,5 @@
|o+0&#ffffff0|n|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| @51
-|a|n|d| |o|n|e| |t|w|o| |X+0#0000001#a8a8a8255|t|h|r|e@1> +0#0000000#ffffff0|f|o|u|r| |f|i|v|e| @46
+|a|n|d| |o|n|e| |t|w|o| |X+0#0000001#a8a8a8255|t|h|r|e@1> |f+0#0000000#ffffff0|o|u|r| |f|i|v|e| @46
|o|n|e| |m|o|r|e| |t|w|o| |t|h|r|e@1| |f|o|u|r| |f|i|v|e| @46
|~+0#4040ff13&| @73
|~| @73
diff --git a/src/testdir/dumps/Test_prop_inserts_text_visual_block_2.dump b/src/testdir/dumps/Test_prop_inserts_text_visual_block_2.dump
index 48d8ebc98..cf0a3aac3 100644
--- a/src/testdir/dumps/Test_prop_inserts_text_visual_block_2.dump
+++ b/src/testdir/dumps/Test_prop_inserts_text_visual_block_2.dump
@@ -1,6 +1,6 @@
|1+0#0000001#a8a8a8255|2|3+0#0000000#ffffff0|4|5|6|7|8|9| @50
|1+0#0000001#a8a8a8255|-+0#e000e06#ffffff0|口*&|-+&|2+0#0000000&|3|4|5|6|7|8|9| @46
|1+0#0000001#a8a8a8255|2|口*0#e000e06#ffffff0|3+0#0000000&|4|5|6|7|8|9| @48
-|1+0#0000001#a8a8a8255>2+0#0000000#ffffff0|3|4|5|6|7|8|9| @50
+|1+0#0000001#a8a8a8255>2|3+0#0000000#ffffff0|4|5|6|7|8|9| @50
|~+0#4040ff13&| @58
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@13|4|x|2| @6|4|,|2| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_inserts_text_visual_block_3.dump b/src/testdir/dumps/Test_prop_inserts_text_visual_block_3.dump
index 0234ba467..938715544 100644
--- a/src/testdir/dumps/Test_prop_inserts_text_visual_block_3.dump
+++ b/src/testdir/dumps/Test_prop_inserts_text_visual_block_3.dump
@@ -1,6 +1,6 @@
|1+0#0000001#a8a8a8255|2|3|4+0#0000000#ffffff0|5|6|7|8|9| @50
|1+0#0000001#a8a8a8255|-+0#e000e06#ffffff0|口*&|-+&|2+0#0000000&|3|4|5|6|7|8|9| @46
|1+0#0000001#a8a8a8255|2|口*0#e000e06#ffffff0|3+0#0000000&|4|5|6|7|8|9| @48
-|1+0#0000001#a8a8a8255|2>3+0#0000000#ffffff0|4|5|6|7|8|9| @50
+|1+0#0000001#a8a8a8255|2>3|4+0#0000000#ffffff0|5|6|7|8|9| @50
|~+0#4040ff13&| @58
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@13|4|x|3| @6|4|,|3| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_inserts_text_visual_block_4.dump b/src/testdir/dumps/Test_prop_inserts_text_visual_block_4.dump
index ff5af3af1..e18ee22c7 100644
--- a/src/testdir/dumps/Test_prop_inserts_text_visual_block_4.dump
+++ b/src/testdir/dumps/Test_prop_inserts_text_visual_block_4.dump
@@ -1,6 +1,6 @@
|1+0#0000001#a8a8a8255|2|3|4|5|6|7|8+0#0000000#ffffff0|9| @50
|1+0#0000001#a8a8a8255|-+0#e000e06#ffffff0|口*&|-+&|2+0#0000001#a8a8a8255|3|4+0#0000000#ffffff0|5|6|7|8|9| @46
|1+0#0000001#a8a8a8255|2|口*0#e000e06#ffffff0|3+0#0000001#a8a8a8255|4|5|6+0#0000000#ffffff0|7|8|9| @48
-|1+0#0000001#a8a8a8255|2|3|4|5|6>7+0#0000000#ffffff0|8|9| @50
+|1+0#0000001#a8a8a8255|2|3|4|5|6>7|8+0#0000000#ffffff0|9| @50
|~+0#4040ff13&| @58
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@13|4|x|7| @6|4|,|7| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_inserts_text_visual_block_5.dump b/src/testdir/dumps/Test_prop_inserts_text_visual_block_5.dump
index 496eee9f6..9dbff6ba1 100644
--- a/src/testdir/dumps/Test_prop_inserts_text_visual_block_5.dump
+++ b/src/testdir/dumps/Test_prop_inserts_text_visual_block_5.dump
@@ -1,6 +1,6 @@
|1+0&#ffffff0|2+0#0000001#a8a8a8255|3|4|5|6|7|8+0#0000000#ffffff0|9| @50
|1|-+0#e000e06&|口*&|-+&|2+0#0000001#a8a8a8255|3|4+0#0000000#ffffff0|5|6|7|8|9| @46
|1|2+0#0000001#a8a8a8255|口*0#e000e06#ffffff0|3+0#0000001#a8a8a8255|4|5|6+0#0000000#ffffff0|7|8|9| @48
-|1>2|3+0#0000001#a8a8a8255|4|5|6|7|8+0#0000000#ffffff0|9| @50
+|1>2+0#0000001#a8a8a8255|3|4|5|6|7|8+0#0000000#ffffff0|9| @50
|~+0#4040ff13&| @58
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@13|4|x|6| @6|4|,|2| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_inserts_text_visual_block_6.dump b/src/testdir/dumps/Test_prop_inserts_text_visual_block_6.dump
index 863077766..54352d219 100644
--- a/src/testdir/dumps/Test_prop_inserts_text_visual_block_6.dump
+++ b/src/testdir/dumps/Test_prop_inserts_text_visual_block_6.dump
@@ -1,6 +1,6 @@
|1+0&#ffffff0|2|3+0#0000001#a8a8a8255|4|5|6|7|8+0#0000000#ffffff0|9| @50
|1|-+0#e000e06&|口*&|-+&|2+0#0000001#a8a8a8255|3|4+0#0000000#ffffff0|5|6|7|8|9| @46
|1|2|口*0#e000e06&|3+0#0000001#a8a8a8255|4|5|6+0#0000000#ffffff0|7|8|9| @48
-|1|2>3|4+0#0000001#a8a8a8255|5|6|7|8+0#0000000#ffffff0|9| @50
+|1|2>3+0#0000001#a8a8a8255|4|5|6|7|8+0#0000000#ffffff0|9| @50
|~+0#4040ff13&| @58
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@13|4|x|5| @6|4|,|3| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_inserts_text_visual_block_7.dump b/src/testdir/dumps/Test_prop_inserts_text_visual_block_7.dump
index bcc9101db..f762bd837 100644
--- a/src/testdir/dumps/Test_prop_inserts_text_visual_block_7.dump
+++ b/src/testdir/dumps/Test_prop_inserts_text_visual_block_7.dump
@@ -1,6 +1,6 @@
|1+0&#ffffff0|2|3|4+0#0000001#a8a8a8255|5|6|7|8+0#0000000#ffffff0|9| @50
|1|-+0#e000e06&|口*&|-+&|2+0#0000001#a8a8a8255|3|4+0#0000000#ffffff0|5|6|7|8|9| @46
|1|2|口*0#e000e06&|3+0#0000001#a8a8a8255|4|5|6+0#0000000#ffffff0|7|8|9| @48
-|1|2|3>4|5+0#0000001#a8a8a8255|6|7|8+0#0000000#ffffff0|9| @50
+|1|2|3>4+0#0000001#a8a8a8255|5|6|7|8+0#0000000#ffffff0|9| @50
|~+0#4040ff13&| @58
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@13|4|x|4| @6|4|,|4| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_prop_with_text_above_6.dump b/src/testdir/dumps/Test_prop_with_text_above_6.dump
index ae4b1b1c6..5763c0820 100644
--- a/src/testdir/dumps/Test_prop_with_text_above_6.dump
+++ b/src/testdir/dumps/Test_prop_with_text_above_6.dump
@@ -1,6 +1,6 @@
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35
-| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000001#a8a8a8255|n|s|e|r|t|e>d+0#0000000#ffffff0| |o|n|e| |t|w|o| @37
+| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000001#a8a8a8255|n|s|e|r|t|e>d| +0#0000000#ffffff0|o|n|e| |t|w|o| @37
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000001#5fd7ff255|e|l|o|w| +0#0000000#ffffff0@48
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |t+0#0000000&|h|r|e@1| |f|o|u|r| @43
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@37
diff --git a/src/testdir/dumps/Test_prop_with_text_above_7.dump b/src/testdir/dumps/Test_prop_with_text_above_7.dump
index 3d8dd5e3c..d9f6a9be6 100644
--- a/src/testdir/dumps/Test_prop_with_text_above_7.dump
+++ b/src/testdir/dumps/Test_prop_with_text_above_7.dump
@@ -1,6 +1,6 @@
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|f+0#0000000#ffff4012|i|r|s|t| |t|h|i|n|g| |a|b|o|v|e| +0&#ffffff0@36
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|s+0#0000001#ffd7ff255|e|c|o|n|d| |t|h|i|n|g| |a|b|o|v|e| +0#0000000#ffffff0@35
-| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000001#a8a8a8255|n|s|e|r|t|e>d+0#0000000#ffffff0| +0#0000001#a8a8a8255|o|n|e| |t|w|o| +0#0000000#ffffff0@37
+| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|1| |i+0#0000001#a8a8a8255|n|s|e|r|t|e>d| |o|n|e| |t|w|o| +0#0000000#ffffff0@37
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3|b+0#0000001#5fd7ff255|e|l|o|w| +0#4040ff13#ffffff0| +0#0000000&@47
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|2| |t+0#0000000&|h|r|e@1| |f|o|u|r| @43
| +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@3| +0#0000000&@2|a+0&#ffff4012|n|o|t|h|e|r| |t|h|i|n|g| +0&#ffffff0@37
diff --git a/src/testdir/dumps/Test_prop_with_text_empty_line_6.dump b/src/testdir/dumps/Test_prop_with_text_empty_line_6.dump
index d9a055e66..e14603968 100644
--- a/src/testdir/dumps/Test_prop_with_text_empty_line_6.dump
+++ b/src/testdir/dumps/Test_prop_with_text_empty_line_6.dump
@@ -1,5 +1,5 @@
|X+0&#ffff4012@59
-|a+0#0000001#a8a8a8255@1>a+0#0000000#ffffff0| @56
+|a+0#0000001#a8a8a8255@1>a| +0#0000000#ffffff0@56
|X+0&#ffff4012@59
@1| +0&#ffffff0@58
|b+0#0000001#a8a8a8255@2|b+0#0000000#ffffff0@2| @53
diff --git a/src/testdir/dumps/Test_prop_with_text_override_2.dump b/src/testdir/dumps/Test_prop_with_text_override_2.dump
index 5311cd7a8..0ec2d9b51 100644
--- a/src/testdir/dumps/Test_prop_with_text_override_2.dump
+++ b/src/testdir/dumps/Test_prop_with_text_override_2.dump
@@ -1,4 +1,4 @@
-|s+0&#ffffff0|o|m+0#0000001#a8a8a8255|e| | +0#4040ff13#40ffff15|i|n|s|e|r|t|e|d| |t+0#0000001#a8a8a8255|e|x|t| |h|e>r+0#0000000#ffffff0|e| @35
+|s+0&#ffffff0|o|m+0#0000001#a8a8a8255|e| | +0#4040ff13#40ffff15|i|n|s|e|r|t|e|d| |t+0#0000001#a8a8a8255|e|x|t| |h|e>r|e+0#0000000#ffffff0| @35
|~+0#4040ff13&| @58
|~| @58
|~| @58
diff --git a/src/testdir/dumps/Test_syntax_c_01.dump b/src/testdir/dumps/Test_syntax_c_01.dump
index bd2ec04b5..c0ed16478 100644
--- a/src/testdir/dumps/Test_syntax_c_01.dump
+++ b/src/testdir/dumps/Test_syntax_c_01.dump
@@ -5,7 +5,7 @@
|#+0#e000e06&|e|l|s|e| +0#0000000&@69
@3|i+0#00e0003&|n|t| +0#0000000&@2|u|s|e|d|;| @60
|#+0#e000e06&|e+0#0000001#a8a8a8255|n|d|i|f| | +0#0000000#ffffff0@67
-| +0#0000001#a8a8a8255@2|p|r|i|n|t|f|(|"|J|u|s|t| |a|n| |e|x|a|m|p|l|e| |p|i|e|c|e| |o|f| >C+0#e000002#ffffff0| |c|o|d|e|\+0#e000e06&|n|"+0#e000002&|)+0#0000000&|;| @27
+| +0#0000001#a8a8a8255@2|p|r|i|n|t|f|(|"|J|u|s|t| |a|n| |e|x|a|m|p|l|e| |p|i|e|c|e| |o|f| >C| +0#e000002#ffffff0|c|o|d|e|\+0#e000e06&|n|"+0#e000002&|)+0#0000000&|;| @27
@3|r+0#af5f00255&|e|t|u|r|n| +0#0000000&|0+0#e000002&|x|0|f@1|;+0#0000000&| @58
|}| @73
| +0#ffffff16#ff404010@16| +0#0000000#ffffff0@57
diff --git a/src/testdir/dumps/Test_tabpanel_visual_0.dump b/src/testdir/dumps/Test_tabpanel_visual_0.dump
index 421a5f31d..d72345ce4 100644
--- a/src/testdir/dumps/Test_tabpanel_visual_0.dump
+++ b/src/testdir/dumps/Test_tabpanel_visual_0.dump
@@ -1,4 +1,4 @@
-|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| |a+0&#a8a8a8255@2|1| |b@2|1| >c+0#0000000#ffffff0@2|1| |d@2|1| @15
+|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| |a+0&#a8a8a8255@2|1| |b@2|1| >c|c+0#0000000#ffffff0@1|1| |d@2|1| @15
|++2&&| |[|N|o| |N|a|m|e|a+0&&@2|2| |b@2|2| |c@2|2| |d@2|2| @15
| +1&&@9|a+0&&@2|3| |b@2|3| |c@2|3| |d@2|3| @15
| +1&&@9|a+0&&@2|4| |b@2|4| |c@2|4| |d@2|4| @15
diff --git a/src/testdir/dumps/Test_tabpanel_visual_1.dump b/src/testdir/dumps/Test_tabpanel_visual_1.dump
index b96c0aca2..f35d6aeda 100644
--- a/src/testdir/dumps/Test_tabpanel_visual_1.dump
+++ b/src/testdir/dumps/Test_tabpanel_visual_1.dump
@@ -1,5 +1,5 @@
|[+8#0000001#e0e0e08|N|o| |N|a|m|e|]| |a+0#0000000#ffffff0@2|1| |b@2|1| |c@2|1| |d@2|1| @15
-|++2&&| |[|N|o| |N|a|m|e|a+0&&@2|2| |b+0#0000001#a8a8a8255@2|2| |c@2>2+0#0000000#ffffff0| |d@2|2| @15
+|++2&&| |[|N|o| |N|a|m|e|a+0&&@2|2| |b+0#0000001#a8a8a8255@2|2| |c@2>2| +0#0000000#ffffff0|d@2|2| @15
| +1&&@9|a+0&&@2|3| |b@2|3| |c@2|3| |d@2|3| @15
| +1&&@9|a+0&&@2|4| |b@2|4| |c@2|4| |d@2|4| @15
| +1&&@9|~+0#4040ff13&| @33
diff --git a/src/testdir/dumps/Test_terminal_empty_listchars.dump b/src/testdir/dumps/Test_terminal_empty_listchars.dump
index b22ebf953..595ed2720 100644
--- a/src/testdir/dumps/Test_terminal_empty_listchars.dump
+++ b/src/testdir/dumps/Test_terminal_empty_listchars.dump
@@ -1,4 +1,4 @@
->h+0&#ffffff0|e+0#0000001#a8a8a8255|l@1|o| +0#0000000#ffffff0@69
+>h+0#0000001#a8a8a8255|e|l@1|o| +0#0000000#ffffff0@69
| +0#0000001#a8a8a8255| +0#0000000#ffffff0@73
|h+0#0000001#a8a8a8255|e|l@1|o| +0#0000000#ffffff0@69
|~+0#4040ff13&| @73
diff --git a/src/testdir/dumps/Test_terminal_empty_listchars2.dump b/src/testdir/dumps/Test_terminal_empty_listchars2.dump
index 6df4d40aa..9ea51eed0 100644
--- a/src/testdir/dumps/Test_terminal_empty_listchars2.dump
+++ b/src/testdir/dumps/Test_terminal_empty_listchars2.dump
@@ -1,6 +1,6 @@
| +0#af5f00255#ffffff0@1|1| |h+0#0000001#a8a8a8255|e|l@1|o| +0#0000000#ffffff0@65
| +0#af5f00255&@1|2| | +0#0000001#a8a8a8255| +0#0000000#ffffff0@69
-| +0#af5f00255&@1|3| >h+0#0000000&|e+0#0000001#a8a8a8255|l@1|o| +0#0000000#ffffff0@65
+| +0#af5f00255&@1|3| >h+0#0000001#a8a8a8255|e|l@1|o| +0#0000000#ffffff0@65
|~+0#4040ff13&| @73
|~| @73
|~| @73
diff --git a/src/testdir/dumps/Test_terminal_hl_empty_3.dump b/src/testdir/dumps/Test_terminal_hl_empty_3.dump
index 4f146cc19..391dcd9ff 100644
--- a/src/testdir/dumps/Test_terminal_hl_empty_3.dump
+++ b/src/testdir/dumps/Test_terminal_hl_empty_3.dump
@@ -1,7 +1,7 @@
|o+0#0000001#a8a8a8255|n|e| +0#0000000#e000002@71
| +0#0000001#a8a8a8255| +0#0000000#e000002@73
|t+0#0000001#a8a8a8255|w|o| +0#0000000#e000002@71
-> @74
+> +0#0000001#a8a8a8255| +0#0000000#e000002@73
|!+2#ffffff16#00e0003|s|h| |-|c| |"|p|r|i|n|t|f| |'|o|n|e|\@1|n|\@1|n|t|w|o|\@1|n|\@1|n|'|"| |[|f|i|n|i|s|h|e|d|]| @9|4|,|0|-|1| @9|A|l@1
| +0#0000000#ffffff0@74
|~+0#4040ff13&| @73
diff --git a/src/testdir/dumps/Test_terminal_popup_7.dump b/src/testdir/dumps/Test_terminal_popup_7.dump
index 0b14d275d..427c8cdf6 100644
--- a/src/testdir/dumps/Test_terminal_popup_7.dump
+++ b/src/testdir/dumps/Test_terminal_popup_7.dump
@@ -4,7 +4,7 @@
|3| @12|╔+0#0000001#ffd7ff255|═@44|╗| +0#0000000#ffffff0@13
|4| @12|║+0#0000001#ffd7ff255|s|o|m|e| |t|e|x|t| @35|║| +0#0000000#ffffff0@13
|5| @12|║+0#0000001#ffd7ff255|t|o| |e+0&#ffff4012|d|i|t| +0&#ffd7ff255@37|║| +0#0000000#ffffff0@13
-|6| @12|║+0#0000001#ffd7ff255|i+0&#a8a8a8255|n| |a| >p+0&#ffd7ff255|o|p|u|p| |w|i|n|d|o|w| @27|║| +0#0000000#ffffff0@13
+|6| @12|║+0#0000001#ffd7ff255|i+0&#a8a8a8255|n| |a| >p|o+0&#ffd7ff255|p|u|p| |w|i|n|d|o|w| @27|║| +0#0000000#ffffff0@13
|7| @12|║+0#0000001#ffd7ff255|~+0#4040ff13&| @43|║+0#0000001&| +0#0000000#ffffff0@13
|8| @12|║+0#0000001#ffd7ff255|~+0#4040ff13&| @43|║+0#0000001&| +0#0000000#ffffff0@13
|9| @12|║+0#0000001#ffd7ff255|~+0#4040ff13&| @43|║+0#0000001&| +0#0000000#ffffff0@13
diff --git a/src/testdir/dumps/Test_terminal_visual_colored_empty.dump b/src/testdir/dumps/Test_terminal_visual_colored_empty.dump
index c44f06830..fec419b6a 100644
--- a/src/testdir/dumps/Test_terminal_visual_colored_empty.dump
+++ b/src/testdir/dumps/Test_terminal_visual_colored_empty.dump
@@ -1,7 +1,7 @@
| +0#0000001#a8a8a8255| +0#0000000#8080809@73
|o+0#0000001#a8a8a8255|l|d| +0#0000000#8080809@71
| +0#0000001#a8a8a8255| +0#0000000#8080809@73
-> +0&#ffffff0@74
+> +0#0000001#a8a8a8255| +0#0000000#ffffff0@73
|!+2#ffffff16#00e0003|s|h| |.|/|X|t|e|r|m|_|c|o|l|o|r|e|d|.|s|h| |[|f|i|n|i|s|h|e|d|]| @23|4|,|0|-|1| @9|A|l@1
| +0#0000000#ffffff0@74
|~+0#4040ff13&| @73
diff --git a/src/testdir/dumps/Test_textprop_hl_override_2.dump b/src/testdir/dumps/Test_textprop_hl_override_2.dump
index 9e677f8b3..f03417c86 100644
--- a/src/testdir/dumps/Test_textprop_hl_override_2.dump
+++ b/src/testdir/dumps/Test_textprop_hl_override_2.dump
@@ -1,6 +1,6 @@
|O+0&#ffffff0|n|e| |o+0#4040ff13#ffff4012|n|e| |o+0#0000000#ffffff0|n|e| |o+0#4040ff13#ffff4012|n|e| |o+0#0000000#ffffff0|n|e| @55
|T|w|o| |t+0#4040ff13#ffff4012|w|o| |t+0#0000000#ffffff0|w|o| |t+0#4040ff13#ffff4012|w|o| |t+0#0000000#ffffff0|w|o| @55
-|T|h|r+0#0000001#a8a8a8255|e@1| |t|h|r|e@1| |t+0#4040ff13#ffff4012|h|r|e|e+0#0000001#a8a8a8255| |t|h|r>e+0#0000000#ffffff0@1| @51
+|T|h|r+0#0000001#a8a8a8255|e@1| |t|h|r|e@1| |t+0#4040ff13#ffff4012|h|r|e|e+0#0000001#a8a8a8255| |t|h|r>e|e+0#0000000#ffffff0| @51
|~+0#4040ff13&| @73
|~| @73
|~| @73
diff --git a/src/testdir/dumps/Test_vim9_no_redraw.dump b/src/testdir/dumps/Test_vim9_no_redraw.dump
index 2f02082b3..32fbf9d87 100644
--- a/src/testdir/dumps/Test_vim9_no_redraw.dump
+++ b/src/testdir/dumps/Test_vim9_no_redraw.dump
@@ -1,4 +1,4 @@
-|s+0&#ffffff0|o+0#0000001#a8a8a8255|m|e| |t|e|x|t| | +0#0000000#ffffff0@64
+|s+0#0000001#a8a8a8255|o|m|e| |t|e|x|t| | +0#0000000#ffffff0@64
|~+0#4040ff13&| @73
|~| @73
|~| @73
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_1.dump b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_1.dump
index 5b88c7584..561b8e359 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_1.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_1.dump
@@ -4,7 +4,7 @@
@8|a+0#0000001#a8a8a8255|a+0#0000000#ffffff0@21|;| @42
@8|a+0#0000001#a8a8a8255|a+0#0000000#ffffff0@21|;| @42
@8|a+0#0000001#a8a8a8255|a+0#0000000#ffffff0@21|;| @42
-@8>a@22|;| @42
+@8>a+0#0000001#a8a8a8255|a+0#0000000#ffffff0@21|;| @42
|}| @73
|~+0#4040ff13&| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|5|x|1| @6|7|,|2|-|9| @8|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_2.dump b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_2.dump
index 86b7ba8e4..73d94ec75 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_2.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_2.dump
@@ -4,7 +4,7 @@
@8|a+0#0000001#a8a8a8255@1|a+0#0000000#ffffff0@20|;| @42
@8|a+0#0000001#a8a8a8255@1|a+0#0000000#ffffff0@20|;| @42
@8|a+0#0000001#a8a8a8255@1|a+0#0000000#ffffff0@20|;| @42
-@8|a+0#0000001#a8a8a8255>a+0#0000000#ffffff0@21|;| @42
+@8|a+0#0000001#a8a8a8255>a|a+0#0000000#ffffff0@20|;| @42
|}| @73
|~+0#4040ff13&| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|5|x|2| @6|7|,|3|-|1|0| @7|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_3.dump b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_3.dump
index 39e14eb4b..52efda09d 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_3.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_3.dump
@@ -4,7 +4,7 @@
@8|a+0#0000001#a8a8a8255@2|a+0#0000000#ffffff0@19|;| @42
@8|a+0#0000001#a8a8a8255@2|a+0#0000000#ffffff0@19|;| @42
@8|a+0#0000001#a8a8a8255@2|a+0#0000000#ffffff0@19|;| @42
-@8|a+0#0000001#a8a8a8255@1>a+0#0000000#ffffff0@20|;| @42
+@8|a+0#0000001#a8a8a8255@1>a|a+0#0000000#ffffff0@19|;| @42
|}| @73
|~+0#4040ff13&| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|5|x|3| @6|7|,|4|-|1@1| @7|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_4.dump b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_4.dump
index 99949550e..b2c06b390 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_4.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_4.dump
@@ -4,7 +4,7 @@
@8|a+0#0000001#a8a8a8255@3|a+0#0000000#ffffff0@18|;| @42
@8|a+0#0000001#a8a8a8255@3|a+0#0000000#ffffff0@18|;| @42
@8|a+0#0000001#a8a8a8255@3|a+0#0000000#ffffff0@18|;| @42
-@8|a+0#0000001#a8a8a8255@2>a+0#0000000#ffffff0@19|;| @42
+@8|a+0#0000001#a8a8a8255@2>a|a+0#0000000#ffffff0@18|;| @42
|}| @73
|~+0#4040ff13&| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|5|x|4| @6|7|,|5|-|1|2| @7|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_5.dump b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_5.dump
index f2e581bd9..8c306d6cc 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_autoselect_5.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_autoselect_5.dump
@@ -4,7 +4,7 @@
@8|a+0#0000001#a8a8a8255@4|a+0#0000000#ffffff0@17|;| @42
@8|a+0#0000001#a8a8a8255@4|a+0#0000000#ffffff0@17|;| @42
@8|a+0#0000001#a8a8a8255@4|a+0#0000000#ffffff0@17|;| @42
-@8|a+0#0000001#a8a8a8255@3>a+0#0000000#ffffff0@18|;| @42
+@8|a+0#0000001#a8a8a8255@3>a|a+0#0000000#ffffff0@17|;| @42
|}| @73
|~+0#4040ff13&| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|5|x|5| @6|7|,|6|-|1|3| @7|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_1.dump b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_1.dump
index 69bbb1677..0348ee5a3 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_1.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_1.dump
@@ -1,5 +1,5 @@
|f+0#0000001#a8a8a8255|o@1| |x+0#0000000#ffffff0@9| @5||+1&&| +0&&@53
-|f+0#0000001#a8a8a8255|o@1> +0#0000000#ffffff0@16||+1&&|~+0#4040ff13&| @52
+|f+0#0000001#a8a8a8255|o@1> | +0#0000000#ffffff0@15||+1&&|~+0#4040ff13&| @52
|x+0#0000000&@19||+1&&|~+0#4040ff13&| @52
|~| @18||+1#0000000&|~+0#4040ff13&| @52
|~| @18||+1#0000000&|~+0#4040ff13&| @52
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_2.dump b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_2.dump
index d3dae6661..900c7a5ee 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_2.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_2.dump
@@ -1,6 +1,6 @@
|f+0&#ffffff0|o+0#0000001#a8a8a8255@1| @4|b+0#0000000#ffffff0|a|r| @63
|f|o+0#0000001#a8a8a8255@1|1|2|3|4|5|b+0#0000000#ffffff0|a|r| @63
-|f>o|o+0#0000001#a8a8a8255| @4|b+0#0000000#ffffff0|a|r| @63
+|f>o+0#0000001#a8a8a8255@1| @4|b+0#0000000#ffffff0|a|r| @63
|~+0#4040ff13&| @73
|~| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|3|x|7| @6|3|,|2| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_3.dump b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_3.dump
index fe26ea2b1..119d2806a 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_3.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_3.dump
@@ -1,6 +1,6 @@
|f+0&#ffffff0|o+0#0000001#a8a8a8255@1|<|f@3|>|b+0#0000000#ffffff0|a|r| @62
|f|o+0#0000001#a8a8a8255@1|1|2|3|4|5|6|b+0#0000000#ffffff0|a|r| @62
-|f>o|o+0#0000001#a8a8a8255|<|f@3|>|b+0#0000000#ffffff0|a|r| @62
+|f>o+0#0000001#a8a8a8255@1|<|f@3|>|b+0#0000000#ffffff0|a|r| @62
|~+0#4040ff13&| @73
|~| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|3|x|8| @6|3|,|2| @10|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_4.dump b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_4.dump
index cc4c19dfe..8a00215af 100644
--- a/src/testdir/dumps/Test_visual_block_hl_with_linebreak_4.dump
+++ b/src/testdir/dumps/Test_visual_block_hl_with_linebreak_4.dump
@@ -1,6 +1,6 @@
|x+0&#ffffff0@1|x+0#0000001#a8a8a8255@7|x+0#0000000#ffffff0@4| @59
|x@1|x+0#0000001#a8a8a8255@1|f+0#0000000#ffffff0|o@1|:| |x+0#0000001#a8a8a8255|x+0#0000000#ffffff0@4| @59
-|x@1|x+0#0000001#a8a8a8255@1|b+0#0000000#ffffff0|a|r|:| >x@5| @59
+|x@1|x+0#0000001#a8a8a8255@1|b+0#0000000#ffffff0|a|r|:| >x+0#0000001#a8a8a8255|x+0#0000000#ffffff0@4| @59
|~+0#4040ff13&| @73
|~| @73
|-+2#0000000&@1| |V|I|S|U|A|L| |B|L|O|C|K| |-@1| +0&&@28|3|x|8| @6|3|,|5|-|1|0| @7|A|l@1|
diff --git a/src/testdir/dumps/Test_visual_block_with_virtualedit.dump b/src/testdir/dumps/Test_visual_block_with_virtualedit.dump
index 7a24250df..605056307 100644
--- a/src/testdir/dumps/Test_visual_block_with_virtualedit.dump
+++ b/src/testdir/dumps/Test_visual_block_with_virtualedit.dump
@@ -1,4 +1,4 @@
-|a+0#0000001#a8a8a8255@5> +0#0000000#ffffff0@43
+|a+0#0000001#a8a8a8255@5> | +0#0000000#ffffff0@42
|b+0#0000001#a8a8a8255@3| @2| +0#0000000#ffffff0@42
|c+0#0000001#a8a8a8255@1| @4| +0#0000000#ffffff0@42
|~+0#4040ff13&| @48
diff --git a/src/testdir/dumps/Test_visual_block_with_virtualedit2.dump b/src/testdir/dumps/Test_visual_block_with_virtualedit2.dump
index e68df74da..db5ef2178 100644
--- a/src/testdir/dumps/Test_visual_block_with_virtualedit2.dump
+++ b/src/testdir/dumps/Test_visual_block_with_virtualedit2.dump
@@ -1,6 +1,6 @@
|a+0#0000001#a8a8a8255@5| | +0#0000000#ffffff0@42
|b+0#0000001#a8a8a8255@3| @2| +0#0000000#ffffff0@42
-|c+0#0000001#a8a8a8255@1> +0#0000000#ffffff0| +0#0000001#a8a8a8255@3| +0#0000000#ffffff0@42
+|c+0#0000001#a8a8a8255@1> @4| +0#0000000#ffffff0@42
|~+0#4040ff13&| @48
|~| @48
|~| @48
diff --git a/src/testdir/dumps/Test_visual_ends_before_showbreak.dump b/src/testdir/dumps/Test_visual_ends_before_showbreak.dump
index ee809bab5..aec790000 100644
--- a/src/testdir/dumps/Test_visual_ends_before_showbreak.dump
+++ b/src/testdir/dumps/Test_visual_ends_before_showbreak.dump
@@ -1,5 +1,5 @@
|x+0&#ffffff0@4| @69
-|↪+0#4040ff13&| |y+0#0000001#a8a8a8255@68> +0#0000000#ffffff0| +0#0000001#a8a8a8255@2
+|↪+0#4040ff13&| |y+0#0000001#a8a8a8255@68> @3
|↪+0#4040ff13#ffffff0| |z+0#0000000&@3| @68
|~+0#4040ff13&| @73
|~| @73
diff --git a/src/testdir/dumps/Test_visual_hl_with_showbreak.dump b/src/testdir/dumps/Test_visual_hl_with_showbreak.dump
index 0bd83b009..5a930b745 100644
--- a/src/testdir/dumps/Test_visual_hl_with_showbreak.dump
+++ b/src/testdir/dumps/Test_visual_hl_with_showbreak.dump
@@ -1,5 +1,5 @@
-|a+0&#ffffff0@48>a
-|++0#4040ff13&|a+0#0000001#a8a8a8255@3|a+0#0000000#ffffff0@5| @38
+|a+0&#ffffff0@48>a+0#0000001#a8a8a8255
+|++0#4040ff13#ffffff0|a+0#0000001#a8a8a8255@3|a+0#0000000#ffffff0@5| @38
|~+0#4040ff13&| @48
|~| @48
|~| @48
diff --git a/src/testdir/dumps/Test_visual_sbr_1.dump b/src/testdir/dumps/Test_visual_sbr_1.dump
index 3c167ecae..7c6d4e3c2 100644
--- a/src/testdir/dumps/Test_visual_sbr_1.dump
+++ b/src/testdir/dumps/Test_visual_sbr_1.dump
@@ -1,4 +1,4 @@
-|>+0#4040ff13#ffffff0| +0#0000001#a8a8a8255|k|a|s|d| |g|u|b|e|r|g|r|e|n|,| |n|o| |s|e|a| |t|a|k|i|m|a|t|a| |s|a|n|c|t|u|s| |e|s|t| |L|o|r|e|m| |i|p|s|u|m| |d|o|l|o|r| |s|i|t| |a|m|e|t|.> +0#0000000#ffffff0@1
+|>+0#4040ff13#ffffff0| +0#0000001#a8a8a8255|k|a|s|d| |g|u|b|e|r|g|r|e|n|,| |n|o| |s|e|a| |t|a|k|i|m|a|t|a| |s|a|n|c|t|u|s| |e|s|t| |L|o|r|e|m| |i|p|s|u|m| |d|o|l|o|r| |s|i|t| |a|m|e|t|.> | +0#0000000#ffffff0
@75
@75
@75
diff --git a/src/testdir/dumps/Test_visual_starts_before_skipcol_1.dump b/src/testdir/dumps/Test_visual_starts_before_skipcol_1.dump
index 4cbf8d00e..39569ea8a 100644
--- a/src/testdir/dumps/Test_visual_starts_before_skipcol_1.dump
+++ b/src/testdir/dumps/Test_visual_starts_before_skipcol_1.dump
@@ -1,4 +1,4 @@
-|<+0#4040ff13#ffffff0@2| +0#0000000&@4| +0#0000001#a8a8a8255|9|3| |9|4| |9|5| |9|6| |9|7| |9|8| |9@1> +0#0000000#ffffff0@45
+|<+0#4040ff13#ffffff0@2| +0#0000000&@4| +0#0000001#a8a8a8255|9|3| |9|4| |9|5| |9|6| |9|7| |9|8| |9@1> | +0#0000000#ffffff0@44
|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|2|9|1|-|3@1|0| @5|A|l@1
| +0&&@74
|~+0#4040ff13&| @73
diff --git a/src/testdir/dumps/Test_visual_starts_before_skipcol_2.dump b/src/testdir/dumps/Test_visual_starts_before_skipcol_2.dump
index a6df79ece..1bad03ed3 100644
--- a/src/testdir/dumps/Test_visual_starts_before_skipcol_2.dump
+++ b/src/testdir/dumps/Test_visual_starts_before_skipcol_2.dump
@@ -1,4 +1,4 @@
-| +0&#ffffff0@7|++0#4040ff13&@2| +0#0000001#a8a8a8255|9|0| |9|1| |9|2| |9|3| |9|4| |9|5| |9|6| |9|7| |9|8| |9@1> +0#0000000#ffffff0@33
+| +0&#ffffff0@7|++0#4040ff13&@2| +0#0000001#a8a8a8255|9|0| |9|1| |9|2| |9|3| |9|4| |9|5| |9|6| |9|7| |9|8| |9@1> | +0#0000000#ffffff0@32
|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|2|9|1|-|3|4|2| @5|A|l@1
| +0&&@74
|~+0#4040ff13&| @73
diff --git a/src/testdir/dumps/Test_visual_starts_before_skipcol_3.dump b/src/testdir/dumps/Test_visual_starts_before_skipcol_3.dump
index 77ef541c7..ddd97b920 100644
--- a/src/testdir/dumps/Test_visual_starts_before_skipcol_3.dump
+++ b/src/testdir/dumps/Test_visual_starts_before_skipcol_3.dump
@@ -1,4 +1,4 @@
-|++0#4040ff13#ffffff0@2| +0#0000000&@4| +0#0000001#a8a8a8255|9|3| |9|4| |9|5| |9|6| |9|7| |9|8| |9@1> +0#0000000#ffffff0@45
+|++0#4040ff13#ffffff0@2| +0#0000000&@4| +0#0000001#a8a8a8255|9|3| |9|4| |9|5| |9|6| |9|7| |9|8| |9@1> | +0#0000000#ffffff0@44
|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|2|9|1|-|3@1|0| @5|A|l@1
| +0&&@74
|~+0#4040ff13&| @73
diff --git a/src/testdir/dumps/Test_visual_starts_before_skipcol_4.dump b/src/testdir/dumps/Test_visual_starts_before_skipcol_4.dump
index 0abcc3c3c..411f13ef5 100644
--- a/src/testdir/dumps/Test_visual_starts_before_skipcol_4.dump
+++ b/src/testdir/dumps/Test_visual_starts_before_skipcol_4.dump
@@ -1,4 +1,4 @@
-|++0#4040ff13#ffffff0@2| +0#0000001#a8a8a8255|9|8| |9@1> +0#0000000#ffffff0@65
+|++0#4040ff13#ffffff0@2| +0#0000001#a8a8a8255|9|8| |9@1> | +0#0000000#ffffff0@64
|[+3&&|N|o| |N|a|m|e|]| |[|+|]| @43|1|,|2|9|1|-|3|1|0| @5|A|l@1
| +0&&@74
|~+0#4040ff13&| @73
diff --git a/src/testdir/dumps/Test_win_gotoid_2.dump b/src/testdir/dumps/Test_win_gotoid_2.dump
index 8573fbe16..1318cdb98 100644
--- a/src/testdir/dumps/Test_win_gotoid_2.dump
+++ b/src/testdir/dumps/Test_win_gotoid_2.dump
@@ -6,7 +6,7 @@
|[+1&&|N|o| |N|a|m|e|]| @47|1|,|1| @11|T|o|p
|2+0&&|1| @72
|2@1| @72
-|2+0#0000001#a8a8a8255>3+0#0000000#ffffff0| @72
+|2+0#0000001#a8a8a8255>3| +0#0000000#ffffff0@72
|2|4| @72
|2|5| @72
|2|6| @72
diff --git a/src/testdir/dumps/Test_wincolor_01.dump b/src/testdir/dumps/Test_wincolor_01.dump
index c8578b2c2..6b9e49f51 100644
--- a/src/testdir/dumps/Test_wincolor_01.dump
+++ b/src/testdir/dumps/Test_wincolor_01.dump
@@ -1,6 +1,6 @@
| +0#af5f00255#ffd7ff255@1|2| | +0#0000001&@4| +0&#e0e0e08| +0&#ffd7ff255@64
| +0#af5f00255&@1|1| |1+0#0000001&@4|1+0&#a8a8a8255@4| | +0&#ffd7ff255@59
-| +8#af5f00255&@1|0| |2+0#0000001#a8a8a8255@4>2+0&#ffd7ff255@5| +8&&@59
+| +8#af5f00255&@1|0| |2+0#0000001#a8a8a8255@4>2|2+0&#ffd7ff255@4| +8&&@59
| +0#af5f00255&@1|1| |3+0#0000001&| |h|e|r|e+0&#e0e0e08| +0&#ffd7ff255|3| @62
| +0#af5f00255&@1|2| | +0#0000001&@4| +0&#e0e0e08| +0&#ffd7ff255@64
| +0#af5f00255&@1|3| |t+0#40ff4011&|h|e| |c|a+0&#e0e0e08|t+0&#ffd7ff255| |i|s| |o+1&&|u|t| +0&&|o|f| |t|h|e| |b|a|g| +0#0000001&@45
diff --git a/src/testdir/test_visual.vim b/src/testdir/test_visual.vim
index eea273e35..dd0912d1b 100644
--- a/src/testdir/test_visual.vim
+++ b/src/testdir/test_visual.vim
@@ -1620,6 +1620,42 @@ func Test_heap_buffer_overflow()
set updatecount&
endfunc

+func s:ScreenAttr(row, col)
+ redraw
+ return screenattr(a:row, a:col)
+endfunc
+
+func Test_charwise_visual_hl_inclusive_and_exclusive_selection()
+ new
+ call setline(1, '12345')
+
+ normal! V$
+ const visual_attr = s:ScreenAttr(1, 1)
+ let VisualCols = {-> range(1, strlen(getline(1)))->filter({_, c ->
+ \ s:ScreenAttr(1, c) == visual_attr})}
+
+ exe "normal! \<Esc>"
+ call assert_true(visual_attr != s:ScreenAttr(1, 1),
+ \ "sanity check: Visual displayed differently to Normal")
+
+ set selection=inclusive
+ normal! ggf2vf4
+ call assert_equal([2, 3, 4], VisualCols())
+
+ set selection=exclusive
+ exe "normal! \<Esc>ggf2vll"
+ call assert_equal([2, 3], VisualCols()) " (Character under cursor excluded.)
+ normal! o
+ call assert_equal(2, col('.'), "sanity check: cursor column after 'o'")
+ call assert_equal([2, 3], VisualCols())
+ normal! y
+ call assert_equal('23', @",
+ \ "sanity check: yanked text matches visual selection")
+
+ set selection&
+ bwipe!
+endfunc
+
" Test Visual highlight with cursor at end of screen line and 'showbreak'
func Test_visual_hl_with_showbreak()
CheckScreendump
diff --git a/src/version.c b/src/version.c
index 6f59b70b9..768fa662e 100644
--- a/src/version.c
+++ b/src/version.c
@@ -763,6 +763,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
+/**/
+ 1114,
/**/
1113,
/**/
Reply all
Reply to author
Forward
0 new messages