From f503abc45070557ef4614dccce3f0a7fd5260108 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 16 Mar 2026 18:34:01 +0900 Subject: [PATCH 1/6] fix: use P_RWIN instead of P_RCLR for 'signcolumn' option The 'signcolumn' option was using P_RCLR which triggers UPD_CLEAR (full screen clear + redraw), causing visible flicker especially in gVim. Other options that similarly affect the left margin width, such as 'number', 'relativenumber', and 'foldcolumn', all use P_RWIN. Change 'signcolumn' to use P_RWIN as well. --- src/optiondefs.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/optiondefs.h b/src/optiondefs.h index a40c4a77f40ef..33d0a711032a1 100644 --- a/src/optiondefs.h +++ b/src/optiondefs.h @@ -2416,7 +2416,7 @@ static struct vimoption options[] = {"sidescrolloff", "siso", P_NUM|P_VI_DEF|P_VIM|P_RBUF, (char_u *)&p_siso, PV_SISO, NULL, NULL, {(char_u *)0L, (char_u *)0L} SCTX_INIT}, - {"signcolumn", "scl", P_STRING|P_ALLOCED|P_VI_DEF|P_RCLR, + {"signcolumn", "scl", P_STRING|P_ALLOCED|P_VI_DEF|P_RWIN, #ifdef FEAT_SIGNS (char_u *)VAR_WIN, PV_SCL, did_set_signcolumn, expand_set_signcolumn, {(char_u *)"auto", (char_u *)0L} From 09c00b9211167d7829d276d4bef654404da495d7 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 16 Mar 2026 20:49:35 +0900 Subject: [PATCH 2/6] update screendump expectations for Test_cursorline_screenline The command line now shows the ':set ...' text instead of being cleared, because signcolumn no longer uses P_RCLR (UPD_CLEAR). --- src/testdir/dumps/Test_Xcursorline_13.dump | 2 +- src/testdir/dumps/Test_Xcursorline_14.dump | 2 +- src/testdir/dumps/Test_Xcursorline_15.dump | 2 +- src/testdir/dumps/Test_Xcursorline_16.dump | 2 +- src/testdir/dumps/Test_Xcursorline_17.dump | 2 +- src/testdir/dumps/Test_Xcursorline_18.dump | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/testdir/dumps/Test_Xcursorline_13.dump b/src/testdir/dumps/Test_Xcursorline_13.dump index 16cac6ad69c84..a368585b31616 100644 --- a/src/testdir/dumps/Test_Xcursorline_13.dump +++ b/src/testdir/dumps/Test_Xcursorline_13.dump @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|i+0#0000000&|n|s|-+0#0000e05&|z+0#0000000&|w|e|i|-+0#0000e05&|d+0#0000000&|r|e|i|-+0#0000e05&|v+0#0000000&|i||+1&&|~+0#4040ff13&| @47 | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|e+0#0000000&|r|-+0#0000e05&|f+0#0000000&|ü|n|f|-+0#0000e05&|s+0#0000000&|e|c|h|s|@+0#4040ff13&@2||+1#0000000&|~+0#4040ff13&| @47 |<+3#0000000&|o| |N|a|m|e|]| |[|+|]| |1|,|1| @5|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @17|5|,|0|-|1| @9|A|l@1 -| +0&&@74 +|:+0&&|s|e|t| |b|r|e|a|k|i|n|d|e|n|t| |f|o|l|d|c|o|l|u|m|n|=|2| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @30 diff --git a/src/testdir/dumps/Test_Xcursorline_14.dump b/src/testdir/dumps/Test_Xcursorline_14.dump index c6c8b7eb50cdd..2e2d701d3bac8 100644 --- a/src/testdir/dumps/Test_Xcursorline_14.dump +++ b/src/testdir/dumps/Test_Xcursorline_14.dump @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|i+0#0000000&|n|s|-+0#0000e05&|z+0#0000000&|w|e|i|-+0#0000e05&|d+0#0000000&|r|e|i|-+0#0000e05&|v+0#0000000&|i||+1&&|~+0#4040ff13&| @47 | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|e+0#0000000&|r|-+0#0000e05&|f+0#0000000&|ü|n|f|-+0#0000e05&|s+0#0000000&|e|c|h|s|@+0#4040ff13&@2||+1#0000000&|~+0#4040ff13&| @47 |<+3#0000000&|o| |N|a|m|e|]| |[|+|]| |1|,|2|6|-|3|0| @1|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @17|5|,|0|-|1| @9|A|l@1 -| +0&&@74 +|:+0&&|s|e|t| |b|r|e|a|k|i|n|d|e|n|t| |f|o|l|d|c|o|l|u|m|n|=|2| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @30 diff --git a/src/testdir/dumps/Test_Xcursorline_15.dump b/src/testdir/dumps/Test_Xcursorline_15.dump index fc3b62f0a1c48..881dfd5e76426 100644 --- a/src/testdir/dumps/Test_Xcursorline_15.dump +++ b/src/testdir/dumps/Test_Xcursorline_15.dump @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|i+0#0000000&|n|s|-+0#0000e05&|z+0#0000000&|w|e|i|-+0#0000e05&|d+0#0000000&|r|e|i|-+0#0000e05&|v+0#0000000&|i||+1&&|~+0#4040ff13&| @47 | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|e+0#0000000&|r|-+0#0000e05&|f+0#0000000&|ü|n|f|-+0#0000e05&|s+0#0000000&|e|c|h|s|@+0#4040ff13&@2||+1#0000000&|~+0#4040ff13&| @47 |<+3#0000000&|o| |N|a|m|e|]| |[|+|]| |1|,|4|3|-|4|7| @1|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @17|5|,|0|-|1| @9|A|l@1 -| +0&&@74 +|:+0&&|s|e|t| |b|r|e|a|k|i|n|d|e|n|t| |f|o|l|d|c|o|l|u|m|n|=|2| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @30 diff --git a/src/testdir/dumps/Test_Xcursorline_16.dump b/src/testdir/dumps/Test_Xcursorline_16.dump index 998205643231d..d8636aebb4069 100644 --- a/src/testdir/dumps/Test_Xcursorline_16.dump +++ b/src/testdir/dumps/Test_Xcursorline_16.dump @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|i+0#0000000&|n|s|-+0#0000e05&|z+0#0000000&|w|e|i|-+0#0000e05&|d+0#0000000&|r|e|i|-+0#0000e05&|v+0#0000000&|i||+1&&|~+0#4040ff13&| @47 | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|e+0#0000000&|r|-+0#0000e05&|f+0#0000000&|ü|n|f|-+0#0000e05&|s+0#0000000&|e|c|h|s|@+0#4040ff13&@2||+1#0000000&|~+0#4040ff13&| @47 |<+3#0000000&|o| |N|a|m|e|]| |[|+|]| |1|,|5|9|-|6|4| @1|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @17|5|,|0|-|1| @9|A|l@1 -| +0&&@74 +|:+0&&|s|e|t| |b|r|e|a|k|i|n|d|e|n|t| |f|o|l|d|c|o|l|u|m|n|=|2| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @30 diff --git a/src/testdir/dumps/Test_Xcursorline_17.dump b/src/testdir/dumps/Test_Xcursorline_17.dump index 9639e15e4be61..f3a631cf18719 100644 --- a/src/testdir/dumps/Test_Xcursorline_17.dump +++ b/src/testdir/dumps/Test_Xcursorline_17.dump @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|i+0#0000000&|n|s|-+0#0000e05&|z+0#0000000&|w|e|i|-+0#0000e05&|d+0#0000000&|r|e|i|-+0#0000e05&|v+0#0000000&|i||+1&&|~+0#4040ff13&| @47 | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|e+0#0000000&|r|-+0#0000e05&|f+0#0000000&|ü|n|f|-+0#0000e05&|s+0#0000000&|e|c|h|s|@+0#4040ff13&@2||+1#0000000&|~+0#4040ff13&| @47 |<+3#0000000&|o| |N|a|m|e|]| |[|+|]| |1|,|7|5|-|8|1| @1|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @17|5|,|0|-|1| @9|A|l@1 -| +0&&@74 +|:+0&&|s|e|t| |b|r|e|a|k|i|n|d|e|n|t| |f|o|l|d|c|o|l|u|m|n|=|2| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @30 diff --git a/src/testdir/dumps/Test_Xcursorline_18.dump b/src/testdir/dumps/Test_Xcursorline_18.dump index 4af55f2d50b42..ba6f379e57c1c 100644 --- a/src/testdir/dumps/Test_Xcursorline_18.dump +++ b/src/testdir/dumps/Test_Xcursorline_18.dump @@ -17,4 +17,4 @@ | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|i+0#0000000&|n|s|-+0#0000e05&|z+0#0000000&|w|e|i|-+0#0000e05&|d+0#0000000&|r|e|i|-+0#0000e05&|v+0#0000000&|i||+1&&|~+0#4040ff13&| @47 | +0#0000e05#a8a8a8255@3| +0#af5f00255#ffffff0@3|>+0#4040ff13&|e+0#0000000&|r|-+0#0000e05&|f+0#0000000&|ü|n|f|-+0#0000e05&|s+0#0000000&|e|c|h|s|@+0#4040ff13&@2||+1#0000000&|~+0#4040ff13&| @47 |<+3#0000000&|o| |N|a|m|e|]| |[|+|]| |1|,|9|1|-|9|8| @1|T|o|p| |[+1&&|N|o| |N|a|m|e|]| |[|+|]| @17|5|,|0|-|1| @9|A|l@1 -| +0&&@74 +|:+0&&|s|e|t| |b|r|e|a|k|i|n|d|e|n|t| |f|o|l|d|c|o|l|u|m|n|=|2| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @30 From 2055ec3e1a5da7311369a3730de7b549cef2d39f Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 16 Mar 2026 22:06:19 +0900 Subject: [PATCH 3/6] update screendump expectations for test_textprop Same as the cursorline dump update: the command line now retains the ':set ...' text because signcolumn no longer triggers UPD_CLEAR. --- src/testdir/dumps/Test_prop_inserts_text_2.dump | 2 +- src/testdir/dumps/Test_prop_inserts_text_3.dump | 2 +- src/testdir/dumps/Test_prop_inserts_text_4.dump | 2 +- src/testdir/dumps/Test_prop_inserts_text_5.dump | 2 +- src/testdir/dumps/Test_prop_inserts_text_6.dump | 2 +- src/testdir/dumps/Test_prop_linebreak_2.dump | 2 +- src/testdir/dumps/Test_prop_right_align_twice_3.dump | 2 +- src/testdir/dumps/Test_prop_with_text_above_4.dump | 2 +- src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump | 2 +- src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/testdir/dumps/Test_prop_inserts_text_2.dump b/src/testdir/dumps/Test_prop_inserts_text_2.dump index c9c325f8baa49..aa3fc6f285a2e 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_2.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_2.dump @@ -5,4 +5,4 @@ | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|o@1|k| |n|o| |h|i|g|h|l|i|g|h|t| @40 |~+0#4040ff13&| @58 -| +0#0000000&@41|1|,|7|6|-|9|2| @6|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @22|1|,|7|6|-|9|2| @6|A|l@1| diff --git a/src/testdir/dumps/Test_prop_inserts_text_3.dump b/src/testdir/dumps/Test_prop_inserts_text_3.dump index 2b935540f410f..2866105f2ecd0 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_3.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_3.dump @@ -5,4 +5,4 @@ | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|o@1|k| |n|o| |h|i|g|h|l|i|g|h|t| @40 |~+0#4040ff13&| @58 -| +0#0000000&@41|2|,|7|-|1|9| @7|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @22|2|,|7|-|1|9| @7|A|l@1| diff --git a/src/testdir/dumps/Test_prop_inserts_text_4.dump b/src/testdir/dumps/Test_prop_inserts_text_4.dump index 83e656a27af34..d42bc833ec546 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_4.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_4.dump @@ -5,4 +5,4 @@ | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|o@1|k| |n|o| |h|i|g|h|l|i|g|h|t| @40 |~+0#4040ff13&| @58 -| +0#0000000&@41|3|,|1|3|-|1|6| @6|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @22|3|,|1|3|-|1|6| @6|A|l@1| diff --git a/src/testdir/dumps/Test_prop_inserts_text_5.dump b/src/testdir/dumps/Test_prop_inserts_text_5.dump index 2885d4d08a448..bf2203d58dbb3 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_5.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_5.dump @@ -5,4 +5,4 @@ | +0#0000e05#a8a8a8255@1|e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|o@1|k| |n|o| |h|i|g|h|l|i|g|h|t| @40 |~+0#4040ff13&| @58 -| +0#0000000&@41|3|,|1|6|-|2@1| @6|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @22|3|,|1|6|-|2@1| @6|A|l@1| diff --git a/src/testdir/dumps/Test_prop_inserts_text_6.dump b/src/testdir/dumps/Test_prop_inserts_text_6.dump index 5aeddb4da1028..9b4bfa1cfc3e0 100644 --- a/src/testdir/dumps/Test_prop_inserts_text_6.dump +++ b/src/testdir/dumps/Test_prop_inserts_text_6.dump @@ -5,4 +5,4 @@ | +0#0000e05#a8a8a8255@1>e+0#ffffff16#e000002|m|p|t|y| |l|i|n|e| +0#0000000#ffffff0@47 | +0#0000e05#a8a8a8255@1|l+0#0000000#ffffff0|o@1|k| |n|o| |h|i|g|h|l|i|g|h|t| @40 |~+0#4040ff13&| @58 -| +0#0000000&@41|4|,|0|-|1| @8|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @22|4|,|0|-|1| @8|A|l@1| diff --git a/src/testdir/dumps/Test_prop_linebreak_2.dump b/src/testdir/dumps/Test_prop_linebreak_2.dump index e705f71938181..e16fa7e5ab2e9 100644 --- a/src/testdir/dumps/Test_prop_linebreak_2.dump +++ b/src/testdir/dumps/Test_prop_linebreak_2.dump @@ -7,4 +7,4 @@ |~| @73 |~| @73 |~| @73 -| +0#0000000&@56|1|,|1| @10|A|l@1| +|:+0#0000000&|c|a|l@1| |A|d@1|M|a|t|c|h|(|)| @40|1|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_right_align_twice_3.dump b/src/testdir/dumps/Test_prop_right_align_twice_3.dump index 2c4cbeee54c96..23839bc58a857 100644 --- a/src/testdir/dumps/Test_prop_right_align_twice_3.dump +++ b/src/testdir/dumps/Test_prop_right_align_twice_3.dump @@ -5,4 +5,4 @@ |~+0#4040ff13&| @73 |~| @73 |~| @73 -| +0#0000000&@56|2|,|8| @10|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @37|2|,|8| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_with_text_above_4.dump b/src/testdir/dumps/Test_prop_with_text_above_4.dump index 2a207ebe7e9ba..06040a8d5ad02 100644 --- a/src/testdir/dumps/Test_prop_with_text_above_4.dump +++ b/src/testdir/dumps/Test_prop_with_text_above_4.dump @@ -6,4 +6,4 @@ | +0#0000e05#a8a8a8255@1| +0#af5f00255#ffffff0@1|3| |f+0#0000000&|i|v|e| |s|i|x| @45 |~+0#4040ff13&| @58 |~| @58 -| +0#0000000&@41|1|,|9|-|1@1|7| @6|A|l@1| +|:+0#0000000&|s|e|t| |n|u|m|b|e|r| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| @15|1|,|9|-|1@1|7| @6|A|l@1| diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump index 1d5c534834d9c..b981380606c6e 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_2.dump @@ -9,4 +9,4 @@ |~+0#4040ff13&| @58 |~| @58 |~| @58 -| +0#0000000&@41|3|,|5| @10|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| |f|o|l|d|c|o|l|u|m|n|=|3| |c|u|r|s|o|r|l|i|n|3|,|5| @10|A|l@1| diff --git a/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump b/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump index ca849123a5b96..5342f5ba1625f 100644 --- a/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump +++ b/src/testdir/dumps/Test_prop_with_text_after_nowrap_3.dump @@ -9,4 +9,4 @@ |~+0#4040ff13#ffffff0| @58 |~| @58 |~| @58 -| +0#0000000&@41|4|,|4| @10|A|l@1| +|:+0#0000000&|s|e|t| |s|i|g|n|c|o|l|u|m|n|=|y|e|s| |f|o|l|d|c|o|l|u|m|n|=|3| @9|4|,|4| @10|A|l@1| From a630f712bb07936f4f3f6cf0d74eef5e0284f538 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 17 Mar 2026 02:14:50 +0900 Subject: [PATCH 4/6] add UPD_CLEAR for GUI sign icons when changing 'signcolumn' When sign icons are used in the GUI, changing 'signcolumn' still needs a full screen clear to properly redraw the sign icons (see patch 8.1.1587). This adds a conditional UPD_CLEAR in did_set_signcolumn() for that case, matching the approach used for 'number'/'relativenumber' in patch 8.1.1910. --- src/optionstr.c | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/optionstr.c b/src/optionstr.c index 8fefcb035326c..8f964b9837d73 100644 --- a/src/optionstr.c +++ b/src/optionstr.c @@ -4080,6 +4080,13 @@ did_set_signcolumn(optset_T *args) curwin->w_nrwidth_line_count = 0; # endif +# if defined(FEAT_GUI) + // In the GUI, when sign icons are used, a full screen clear is needed + // to properly redraw the sign icons. + if (gui.in_use && curbuf->b_signlist != NULL) + redraw_all_later(UPD_CLEAR); +# endif + return NULL; } From a060b31adb10749b393c7e6713b2d395ee93778e Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Mon, 23 Mar 2026 10:57:59 +0900 Subject: [PATCH 5/6] add test for signcolumn change not triggering unnecessary UPD_CLEAR Verify that changing 'signcolumn' correctly redraws signs and does not cause a full screen clear (flicker) by checking that the command line content is preserved after the option change. --- src/testdir/test_signs.vim | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim index 83cfc5f2f1ab6..4eea52941f180 100644 --- a/src/testdir/test_signs.vim +++ b/src/testdir/test_signs.vim @@ -2121,4 +2121,41 @@ func Test_sign_number_without_signtext() call StopVimInTerminal(buf) endfunc +func Test_sign_signcolumn_change_no_clear() + new + call setline(1, ['a', 'b', 'c']) + set number signcolumn=auto + sign define SignA text=>> texthl=Search + exe 'sign place 1 line=1 name=SignA buffer=' .. bufnr() + redraw! + + " Put a marker on the command line + echon 'SIGNTEST' + " Change signcolumn - with P_RWIN this should NOT trigger UPD_CLEAR, + " so the command line should retain the marker text. + " With P_RCLR, UPD_CLEAR would blank the entire screen including + " the command line, causing the marker to disappear. + set signcolumn=number + redraw + + " Verify sign and number column are correctly displayed after the change. + " Line 1 has sign '>>' shown in the number column. + " Line 2 has no sign, so line number '2' is shown. + call assert_equal(' >> a', s:ScreenLine(1, 1, 5)) + call assert_equal(' 2 b', s:ScreenLine(2, 1, 5)) + + " Verify the command line was NOT cleared (P_RWIN does not trigger + " UPD_CLEAR, unlike P_RCLR). + let cmdline = '' + for i in range(1, 8) + let cmdline ..= screenstring(&lines, i) + endfor + call assert_equal('SIGNTEST', cmdline) + + sign unplace * group=* + sign undefine SignA + set signcolumn& number& + bwipe! +endfunc + " vim: shiftwidth=2 sts=2 expandtab From 23b584c59eff1dc37c8c1707a5bfeb52c111df91 Mon Sep 17 00:00:00 2001 From: Yasuhiro Matsumoto Date: Tue, 24 Mar 2026 09:08:18 +0900 Subject: [PATCH 6/6] skip Test_sign_signcolumn_change_no_clear in GUI mode The signcolumn UPD_CLEAR optimization only applies to non-GUI mode. In the GUI, sign icons still require a full screen clear (UPD_CLEAR) to redraw properly, so the command line marker test is not applicable. --- src/testdir/test_signs.vim | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/testdir/test_signs.vim b/src/testdir/test_signs.vim index 4eea52941f180..bde3d047606c2 100644 --- a/src/testdir/test_signs.vim +++ b/src/testdir/test_signs.vim @@ -2122,6 +2122,9 @@ func Test_sign_number_without_signtext() endfunc func Test_sign_signcolumn_change_no_clear() + " In the GUI, sign icons need UPD_CLEAR to redraw properly, + " so this optimization only applies to non-GUI mode. + CheckNotGui new call setline(1, ['a', 'b', 'c']) set number signcolumn=auto