# HG changeset patch # User Bram Moolenaar # Date 1659716108 -7200 # Node ID 33d7c1fa2dacf29c93558a90f3f803dec8ebccf1 # Parent 3e5d197e698ea0554ac292fc9f399840553df104 patch 9.0.0144: text property cannot override 'cursorline' highlight Commit: https://github.com/vim/vim/commit/f4ba8bc47eb3c6b5899ef31d083b9b8f0d4ca456 Author: Bram Moolenaar Date: Fri Aug 5 17:05:04 2022 +0100 patch 9.0.0144: text property cannot override 'cursorline' highlight Problem: Text property cannot override 'cursorline' highlight. Solution: Add the "override" flag to prop_type_add(). (closes https://github.com/vim/vim/issues/5533, closes #8225). diff --git a/runtime/doc/textprop.txt b/runtime/doc/textprop.txt --- a/runtime/doc/textprop.txt +++ b/runtime/doc/textprop.txt @@ -377,6 +377,8 @@ prop_type_add({name}, {props}) *prop_ty combine when omitted or TRUE combine the highlight with any syntax highlight; when FALSE syntax highlight will not be used + override when TRUE the highlight overrides any other, + including 'cursorline' and Visual start_incl when TRUE inserts at the start position will be included in the text property end_incl when TRUE inserts at the end position will be diff --git a/src/structs.h b/src/structs.h --- a/src/structs.h +++ b/src/structs.h @@ -834,6 +834,7 @@ typedef struct proptype_S #define PT_FLAG_INS_START_INCL 1 // insert at start included in property #define PT_FLAG_INS_END_INCL 2 // insert at end included in property #define PT_FLAG_COMBINE 4 // combine with syntax highlight +#define PT_FLAG_OVERRIDE 8 // override any highlight // Sign group typedef struct signgroup_S diff --git a/src/testdir/dumps/Test_textprop_hl_override_1.dump b/src/testdir/dumps/Test_textprop_hl_override_1.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_textprop_hl_override_1.dump @@ -0,0 +1,8 @@ +|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+10#ff404010#40ff4011|w|o| |t|w|o| |t|w|o| |t+10#4040ff13#ffff4012|w|o| |t+10#ff404010#40ff4011|w|o| @55 +|T+0#0000000#ffffff0|h|r|e|e+0#4040ff13#ffff4012| |t|h|r+0#0000000#ffffff0|e@1| |t+0#4040ff13#ffff4012|h|r|e|e+0#0000000#ffffff0| |t|h|r|e@1| @51 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +| +0#0000000&@56|2|,|1| @10|A|l@1| diff --git a/src/testdir/dumps/Test_textprop_hl_override_2.dump b/src/testdir/dumps/Test_textprop_hl_override_2.dump new file mode 100644 --- /dev/null +++ b/src/testdir/dumps/Test_textprop_hl_override_2.dump @@ -0,0 +1,8 @@ +|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&#e0e0e08|e|e+0#4040ff13&| |t|h|r+0#0000000&|e@1| |t+0#4040ff13#ffff4012|h|r|e|e+0#0000000#e0e0e08| |t|h|r>e+0&#ffffff0@1| @51 +|~+0#4040ff13&| @73 +|~| @73 +|~| @73 +|~| @73 +|-+2#0000000&@1| |V|I|S|U|A|L| |-@1| +0&&@34|2|0| @7|3|,|2@1| @9|A|l@1| diff --git a/src/testdir/test_textprop.vim b/src/testdir/test_textprop.vim --- a/src/testdir/test_textprop.vim +++ b/src/testdir/test_textprop.vim @@ -1133,6 +1133,38 @@ func Test_textprop_screenshot_various() call delete('XtestProp') endfunc +func Test_textprop_hl_override() + CheckScreendump + + let lines =<< trim END + call setline(1, ['One one one one one', 'Two two two two two', 'Three three three three']) + hi OverProp ctermfg=blue ctermbg=yellow + hi CursorLine cterm=bold,underline ctermfg=red ctermbg=green + hi Vsual ctermfg=cyan ctermbg=grey + call prop_type_add('under', #{highlight: 'OverProp'}) + call prop_type_add('over', #{highlight: 'OverProp', override: 1}) + call prop_add(1, 5, #{type: 'under', length: 4}) + call prop_add(1, 13, #{type: 'over', length: 4}) + call prop_add(2, 5, #{type: 'under', length: 4}) + call prop_add(2, 13, #{type: 'over', length: 4}) + call prop_add(3, 5, #{type: 'under', length: 4}) + call prop_add(3, 13, #{type: 'over', length: 4}) + set cursorline + 2 + END + call writefile(lines, 'XtestOverProp') + let buf = RunVimInTerminal('-S XtestOverProp', {'rows': 8}) + call VerifyScreenDump(buf, 'Test_textprop_hl_override_1', {}) + + call term_sendkeys(buf, "3Gllv$hh") + call VerifyScreenDump(buf, 'Test_textprop_hl_override_2', {}) + call term_sendkeys(buf, "\") + + " clean up + call StopVimInTerminal(buf) + call delete('XtestOverProp') +endfunc + func RunTestVisualBlock(width, dump) call writefile([ \ "call setline(1, [" diff --git a/src/textprop.c b/src/textprop.c --- a/src/textprop.c +++ b/src/textprop.c @@ -238,9 +238,10 @@ prop_add_one( goto theend; ((char_u **)gap->ga_data)[gap->ga_len++] = text; - // change any Tab to a Space to make it simpler to compute the size + // change any control character (Tab, Newline, etc.) to a Space to make + // it simpler to compute the size for (p = text; *p != NUL; MB_PTR_ADV(p)) - if (*p == TAB) + if (*p < ' ') *p = ' '; text = NULL; } @@ -1542,6 +1543,15 @@ prop_type_set(typval_T *argvars, int add prop->pt_flags &= ~PT_FLAG_COMBINE; } + di = dict_find(dict, (char_u *)"override", -1); + if (di != NULL) + { + if (tv_get_bool(&di->di_tv)) + prop->pt_flags |= PT_FLAG_OVERRIDE; + else + prop->pt_flags &= ~PT_FLAG_OVERRIDE; + } + di = dict_find(dict, (char_u *)"priority", -1); if (di != NULL) prop->pt_priority = tv_get_number(&di->di_tv); diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -736,6 +736,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 144, +/**/ 143, /**/ 142,