summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2017-08-12 15:12:30 +0200
committerBram Moolenaar <Bram@vim.org>2017-08-12 15:12:30 +0200
commit0cd2a94a4030f6bd12eaec44db92db108e33c913 (patch)
treedac79357ed2b9035ffe377d56bf87c2dfdda0e2d
parent9698ad7201ca1a3acec69679f1ab8b15323ff406 (diff)
patch 8.0.0914: highlight attributes are always combinedv8.0.0914
Problem: Highlight attributes are always combined. Solution: Add the 'nocombine' value to replace attributes instead of combining them. (scauligi, closes #1963)
-rw-r--r--runtime/doc/syntax.txt2
-rw-r--r--src/syntax.c21
-rw-r--r--src/version.c2
-rw-r--r--src/vim.h3
4 files changed, 18 insertions, 10 deletions
diff --git a/runtime/doc/syntax.txt b/runtime/doc/syntax.txt
index 9bf38882a3..dda2e662e3 100644
--- a/runtime/doc/syntax.txt
+++ b/runtime/doc/syntax.txt
@@ -4689,6 +4689,7 @@ the same syntax file on all terminals, and use the optimal highlighting.
*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* *highlight-term* *E418*
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
index a4c0340a4a..2b06b464bf 100644
--- a/src/syntax.c
+++ b/src/syntax.c
@@ -86,9 +86,10 @@ static int include_link = 0; /* when 2 include "link" and "clear" */
*/
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_attr)
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_attr)
}
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_attr)
}
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_attr)
}
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
index 314b62dbfe..72701c94b3 100644
--- 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
index d7d3556c1f..23a000eef7 100644
--- a/src/vim.h
+++ b/src/vim.h
@@ -680,7 +680,8 @@ extern int (*dyn_libintl_putenv)(const char *envstring);
#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