aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Hahler <git@thequod.de>2019-06-17 22:35:07 +0200
committerDaniel Hahler <git@thequod.de>2019-09-26 00:50:54 +0200
commitcb252071718a58c2d9747177ebeb81ff1210ddd1 (patch)
tree3c5a5ae77471901e9904c96f9bd11638dc639031
parent2621f4455d6409427a57ea5d4a123e860e27eacd (diff)
downloadrneovim-cb252071718a58c2d9747177ebeb81ff1210ddd1.tar.gz
rneovim-cb252071718a58c2d9747177ebeb81ff1210ddd1.tar.bz2
rneovim-cb252071718a58c2d9747177ebeb81ff1210ddd1.zip
vim-patch:8.0.0914: highlight attributes are always combined (#10256)
Problem: Highlight attributes are always combined. Solution: Add the 'nocombine' value to replace attributes instead of combining them. (scauligi, closes vim/vim#1963) https://github.com/vim/vim/commit/0cd2a94a4030f6bd12eaec44db92db108e33c913 Closes https://github.com/neovim/neovim/pull/10256.
-rw-r--r--runtime/doc/syntax.txt5
-rw-r--r--src/nvim/highlight.c12
-rw-r--r--src/nvim/highlight_defs.h1
-rw-r--r--src/nvim/syntax.c4
-rw-r--r--test/functional/ui/highlight_spec.lua48
5 files changed, 64 insertions, 6 deletions
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 0a4257e2b2..5424ad00ec 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -4720,18 +4720,19 @@ the same syntax file on all UIs.
*bold* *underline* *undercurl*
*inverse* *italic* *standout*
- *strikethrough*
+ *nocombine* *strikethrough*
cterm={attr-list} *attr-list* *highlight-cterm* *E418*
attr-list is a comma separated list (without spaces) of the
following items (in any order):
bold
underline
undercurl curly underline
+ strikethrough
reverse
inverse same as reverse
italic
standout
- strikethrough
+ nocombine override attributes instead of combining them
NONE no attributes used (used to reset it)
Note that "bold" can be used here and by using a bold font. They
diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c
index 093cc4923b..83ee89b2a1 100644
--- a/src/nvim/highlight.c
+++ b/src/nvim/highlight.c
@@ -308,8 +308,16 @@ int hl_combine_attr(int char_attr, int prim_attr)
// start with low-priority attribute, and override colors if present below.
HlAttrs new_en = char_aep;
- new_en.cterm_ae_attr |= spell_aep.cterm_ae_attr;
- new_en.rgb_ae_attr |= spell_aep.rgb_ae_attr;
+ if (spell_aep.cterm_ae_attr & HL_NOCOMBINE) {
+ new_en.cterm_ae_attr = spell_aep.cterm_ae_attr;
+ } else {
+ new_en.cterm_ae_attr |= spell_aep.cterm_ae_attr;
+ }
+ if (spell_aep.rgb_ae_attr & HL_NOCOMBINE) {
+ new_en.rgb_ae_attr = spell_aep.rgb_ae_attr;
+ } else {
+ new_en.rgb_ae_attr |= spell_aep.rgb_ae_attr;
+ }
if (spell_aep.cterm_fg_color > 0) {
new_en.cterm_fg_color = spell_aep.cterm_fg_color;
diff --git a/src/nvim/highlight_defs.h b/src/nvim/highlight_defs.h
index f9c2c03fc6..255699c8e0 100644
--- a/src/nvim/highlight_defs.h
+++ b/src/nvim/highlight_defs.h
@@ -18,6 +18,7 @@ typedef enum {
HL_UNDERCURL = 0x10,
HL_STANDOUT = 0x20,
HL_STRIKETHROUGH = 0x40,
+ HL_NOCOMBINE = 0x80,
} HlAttrFlags;
/// Stores a complete highlighting entry, including colors and attributes
diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c
index 675d484d67..ac8ace9fff 100644
--- a/src/nvim/syntax.c
+++ b/src/nvim/syntax.c
@@ -116,10 +116,10 @@ static int include_link = 0; /* when 2 include "nvim/link" and "clear" */
/// following names, separated by commas (but no spaces!).
static char *(hl_name_table[]) =
{ "bold", "standout", "underline", "undercurl",
- "italic", "reverse", "inverse", "strikethrough", "NONE" };
+ "italic", "reverse", "inverse", "strikethrough", "nocombine", "NONE" };
static int hl_attr_table[] =
{ HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE,
- HL_INVERSE, HL_STRIKETHROUGH, 0 };
+ HL_INVERSE, HL_STRIKETHROUGH, HL_NOCOMBINE, 0 };
// The patterns that are being searched for are stored in a syn_pattern.
// A match item consists of one pattern.
diff --git a/test/functional/ui/highlight_spec.lua b/test/functional/ui/highlight_spec.lua
index 95a19aec81..1b25570997 100644
--- a/test/functional/ui/highlight_spec.lua
+++ b/test/functional/ui/highlight_spec.lua
@@ -438,6 +438,54 @@ describe('highlight', function()
})
end)
+ it('nocombine', function()
+ screen:detach()
+ screen = Screen.new(25,6)
+ screen:set_default_attr_ids{
+ [1] = {foreground = Screen.colors.SlateBlue, underline = true},
+ [2] = {bold = true, foreground = Screen.colors.Blue1},
+ [3] = {underline = true, reverse = true, foreground = Screen.colors.SlateBlue},
+ [4] = {background = Screen.colors.Yellow, reverse = true, foreground = Screen.colors.SlateBlue},
+ [5] = {foreground = Screen.colors.Red},
+ }
+ screen:attach()
+ feed_command('syntax on')
+ feed_command('hi! Underlined cterm=underline gui=underline')
+ feed_command('syn keyword Underlined foobar')
+ feed_command('hi Search cterm=inverse,nocombine gui=inverse,nocombine')
+ insert([[
+ foobar
+ foobar
+ ]])
+ screen:expect{grid=[[
+ {1:foobar} |
+ {1:foobar} |
+ ^ |
+ {2:~ }|
+ {2:~ }|
+ |
+ ]]}
+
+ feed('/foo')
+ screen:expect{grid=[[
+ {3:foo}{1:bar} |
+ {4:foo}{1:bar} |
+ |
+ {2:~ }|
+ {2:~ }|
+ /foo^ |
+ ]]}
+ feed('<cr>')
+ screen:expect{grid=[[
+ {4:^foo}{1:bar} |
+ {4:foo}{1:bar} |
+ |
+ {2:~ }|
+ {2:~ }|
+ {5:search hit...uing at TOP} |
+ ]]}
+ end)
+
it('guisp (special/undercurl)', function()
feed_command('syntax on')
feed_command('syn keyword TmpKeyword neovim')