# HG changeset patch # User Christian Brabandt # Date 1502543704 -7200 # Node ID e1b34958f11851a8ee163590d0594944e7c4acd9 # Parent 8b7edea4be26418fa493d7aec9b13ce9f232e6ef patch 8.0.0914: highlight attributes are always combined commit https://github.com/vim/vim/commit/0cd2a94a4030f6bd12eaec44db92db108e33c913 Author: Bram Moolenaar Date: Sat Aug 12 15:12:30 2017 +0200 patch 8.0.0914: highlight attributes are always combined Problem: Highlight attributes are always combined. Solution: Add the 'nocombine' value to replace attributes instead of combining them. (scauligi, closes #1963) diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt --- a/runtime/doc/syntax.txt +++ b/runtime/doc/syntax.txt @@ -4689,6 +4689,7 @@ 1. highlight arguments for normal termin *bold* *underline* *undercurl* *inverse* *italic* *standout* + *nocombine* term={attr-list} *attr-list* *highlight-term* *E418* attr-list is a comma separated list (without spaces) of the following items (in any order): @@ -4699,6 +4700,7 @@ term={attr-list} *attr-list* *highligh inverse same as reverse italic standout + 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/syntax.c b/src/syntax.c --- a/src/syntax.c +++ b/src/syntax.c @@ -86,9 +86,10 @@ static int include_link = 0; /* when 2 i */ static char *(hl_name_table[]) = {"bold", "standout", "underline", "undercurl", - "italic", "reverse", "inverse", "NONE"}; + "italic", "reverse", "inverse", "nocombine", "NONE"}; static int hl_attr_table[] = - {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE, HL_INVERSE, 0}; + {HL_BOLD, HL_STANDOUT, HL_UNDERLINE, HL_UNDERCURL, HL_ITALIC, HL_INVERSE, HL_INVERSE, HL_NOCOMBINE, 0}; +#define ATTR_COMBINE(attr_a, attr_b) ((((attr_b) & HL_NOCOMBINE) ? attr_b : (attr_a)) | (attr_b)) static int get_attr_entry(garray_T *table, attrentry_T *aep); static void syn_unadd_group(void); @@ -8912,7 +8913,7 @@ hl_combine_attr(int char_attr, int prim_ if (char_attr == 0) return prim_attr; if (char_attr <= HL_ALL && prim_attr <= HL_ALL) - return char_attr | prim_attr; + return ATTR_COMBINE(char_attr, prim_attr); #ifdef FEAT_GUI if (gui.in_use) { @@ -8931,13 +8932,14 @@ hl_combine_attr(int char_attr, int prim_ } if (prim_attr <= HL_ALL) - new_en.ae_attr |= prim_attr; + new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, prim_attr); else { spell_aep = syn_gui_attr2entry(prim_attr); if (spell_aep != NULL) { - new_en.ae_attr |= spell_aep->ae_attr; + new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, + spell_aep->ae_attr); if (spell_aep->ae_u.gui.fg_color != INVALCOLOR) new_en.ae_u.gui.fg_color = spell_aep->ae_u.gui.fg_color; if (spell_aep->ae_u.gui.bg_color != INVALCOLOR) @@ -8974,13 +8976,14 @@ hl_combine_attr(int char_attr, int prim_ } if (prim_attr <= HL_ALL) - new_en.ae_attr |= prim_attr; + new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, prim_attr); else { spell_aep = syn_cterm_attr2entry(prim_attr); if (spell_aep != NULL) { - new_en.ae_attr |= spell_aep->ae_attr; + new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, + spell_aep->ae_attr); if (spell_aep->ae_u.cterm.fg_color > 0) new_en.ae_u.cterm.fg_color = spell_aep->ae_u.cterm.fg_color; if (spell_aep->ae_u.cterm.bg_color > 0) @@ -9008,13 +9011,13 @@ hl_combine_attr(int char_attr, int prim_ } if (prim_attr <= HL_ALL) - new_en.ae_attr |= prim_attr; + new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, prim_attr); else { spell_aep = syn_term_attr2entry(prim_attr); if (spell_aep != NULL) { - new_en.ae_attr |= spell_aep->ae_attr; + new_en.ae_attr = ATTR_COMBINE(new_en.ae_attr, spell_aep->ae_attr); if (spell_aep->ae_u.term.start != NULL) { new_en.ae_u.term.start = spell_aep->ae_u.term.start; diff --git a/src/version.c b/src/version.c --- a/src/version.c +++ b/src/version.c @@ -770,6 +770,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 914, +/**/ 913, /**/ 912, diff --git a/src/vim.h b/src/vim.h --- a/src/vim.h +++ b/src/vim.h @@ -680,7 +680,8 @@ extern int (*dyn_libintl_putenv)(const c #define HL_UNDERLINE 0x08 #define HL_UNDERCURL 0x10 #define HL_STANDOUT 0x20 -#define HL_ALL 0x3f +#define HL_NOCOMBINE 0x40 +#define HL_ALL 0x7f /* special attribute addition: Put message in history */ #define MSG_HIST 0x1000