]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0144: text property cannot override 'cursorline' highlight v9.0.0144
authorBram Moolenaar <Bram@vim.org>
Fri, 5 Aug 2022 16:05:04 +0000 (17:05 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 5 Aug 2022 16:05:04 +0000 (17:05 +0100)
Problem:    Text property cannot override 'cursorline' highlight.
Solution:   Add the "override" flag to prop_type_add(). (closes #5533,
            closes #8225).

runtime/doc/textprop.txt
src/structs.h
src/testdir/dumps/Test_textprop_hl_override_1.dump [new file with mode: 0644]
src/testdir/dumps/Test_textprop_hl_override_2.dump [new file with mode: 0644]
src/testdir/test_textprop.vim
src/textprop.c
src/version.c

index 150d466e27dc3235323349a3ccf41f70d0393933..fd9133327fb3ad493161b3068c99992fb9dc0339 100644 (file)
@@ -377,6 +377,8 @@ prop_type_add({name}, {props})              *prop_type_add()* *E969* *E970*
                   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
index e6b9f0dbef3ccd1c6ad42fcc19c12ea14a268cb5..5b05c6487cf549617d51f462c584f589e8287755 100644 (file)
@@ -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 (file)
index 0000000..ce447e7
--- /dev/null
@@ -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 (file)
index 0000000..187233d
--- /dev/null
@@ -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| 
index 03af37ac3ca6b88d6e0ae1d141d43908d08a3df5..4d41a15c5dab5c082be30f352479483e1a974f85 100644 (file)
@@ -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, "\<Esc>")
+
+  " clean up
+  call StopVimInTerminal(buf)
+  call delete('XtestOverProp')
+endfunc
+
 func RunTestVisualBlock(width, dump)
   call writefile([
        \ "call setline(1, ["
index 9a9544c503e17ebe89b8666f4bc1eb576af5d1f5..86b0dbf883d57c0c9b620c5f2a74b2b5bc06de53 100644 (file)
@@ -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);
index e13e92cec68c07e1a88d0e7c74a8141dacd14648..aa3af5ccdd9aeceffb7006f48fc1116bb6fcc3f3 100644 (file)
@@ -735,6 +735,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    144,
 /**/
     143,
 /**/