From: Kevin McCarthy Date: Tue, 9 May 2017 01:48:25 +0000 (-0700) Subject: Add $header_color_partial to allow partial coloring of headers. X-Git-Tag: mutt-1-9-rel~90 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=89c6fd8dc0d9f02af5753dbb214c7fe81683ebce;p=mutt Add $header_color_partial to allow partial coloring of headers. When set, a regexp match will color only the matched text in the header. When unset (the default), the entire header will have color applied. With appropriate regexps, this allows coloring of just the header field name. Of course, it can also be used to highlight arbitrary phrases in the headers too. --- diff --git a/doc/manual.xml.head b/doc/manual.xml.head index 9045d1e5..d8c0f8f8 100644 --- a/doc/manual.xml.head +++ b/doc/manual.xml.head @@ -2717,6 +2717,14 @@ server-side searches (=b, =B, =h) are not supported for color index patterns. + +When $header_color_partial +is unset (the default), a header matched by +regexp will have color applied to the entire header. +When set, color is applied only to the exact text matched by +regexp. + + object can be one of: diff --git a/init.h b/init.h index abf87a3a..82a499b3 100644 --- a/init.h +++ b/init.h @@ -1007,6 +1007,17 @@ struct option_t MuttVars[] = { */ #endif /* HAVE_GDBM || HAVE_DB4 */ #endif /* USE_HCACHE */ + { "header_color_partial", DT_BOOL, R_PAGER|R_REFLOW, OPTHEADERCOLORPARTIAL, 0 }, + /* + ** .pp + ** When \fIset\fP, color header regexps behave like color body regexps: + ** color is applied to the exact text matched by the regexp. When + ** \fIunset\fP, color is applied to the entire header. + ** .pp + ** One use of this option might be to apply color to just the header labels. + ** .pp + ** See ``$color'' for more details. + */ { "help", DT_BOOL, R_REFLOW, OPTHELP, 1 }, /* ** .pp diff --git a/mutt.h b/mutt.h index cedd630c..d19c0c13 100644 --- a/mutt.h +++ b/mutt.h @@ -366,6 +366,7 @@ enum #endif OPTHDRS, OPTHEADER, + OPTHEADERCOLORPARTIAL, OPTHELP, OPTHIDDENHOST, OPTHIDELIMITED, diff --git a/pager.c b/pager.c index ae46e2fd..baabeffb 100644 --- a/pager.c +++ b/pager.c @@ -730,39 +730,49 @@ resolve_types (char *buf, char *raw, struct line_t *lineInfo, int n, int last, if (n > 0 && (buf[0] == ' ' || buf[0] == '\t')) { lineInfo[n].type = lineInfo[n-1].type; /* wrapped line */ - (lineInfo[n].syntax)[0].color = (lineInfo[n-1].syntax)[0].color; - lineInfo[n].is_cont_hdr = 1; + if (!option (OPTHEADERCOLORPARTIAL)) + { + (lineInfo[n].syntax)[0].color = (lineInfo[n-1].syntax)[0].color; + lineInfo[n].is_cont_hdr = 1; + } } else { lineInfo[n].type = MT_COLOR_HDEFAULT; } - for (color_line = ColorHdrList; color_line; color_line = color_line->next) + /* When this option is unset, we color the entire header the + * same color. Otherwise, we handle the header patterns just + * like body patterns (further below). + */ + if (!option (OPTHEADERCOLORPARTIAL)) { - if (REGEXEC (color_line->rx, buf) == 0) - { - lineInfo[n].type = MT_COLOR_HEADER; - lineInfo[n].syntax[0].color = color_line->pair; - if (lineInfo[n].is_cont_hdr) - { - /* adjust the previous continuation lines to reflect the color of this continuation line */ - int j; - for (j = n - 1; j >= 0 && lineInfo[j].is_cont_hdr; --j) - { - lineInfo[j].type = lineInfo[n].type; - lineInfo[j].syntax[0].color = lineInfo[n].syntax[0].color; - } - /* now adjust the first line of this header field */ - if (j >= 0) - { - lineInfo[j].type = lineInfo[n].type; - lineInfo[j].syntax[0].color = lineInfo[n].syntax[0].color; - } - *force_redraw = 1; /* the previous lines have already been drawn on the screen */ - } - break; - } + for (color_line = ColorHdrList; color_line; color_line = color_line->next) + { + if (REGEXEC (color_line->rx, buf) == 0) + { + lineInfo[n].type = MT_COLOR_HEADER; + lineInfo[n].syntax[0].color = color_line->pair; + if (lineInfo[n].is_cont_hdr) + { + /* adjust the previous continuation lines to reflect the color of this continuation line */ + int j; + for (j = n - 1; j >= 0 && lineInfo[j].is_cont_hdr; --j) + { + lineInfo[j].type = lineInfo[n].type; + lineInfo[j].syntax[0].color = lineInfo[n].syntax[0].color; + } + /* now adjust the first line of this header field */ + if (j >= 0) + { + lineInfo[j].type = lineInfo[n].type; + lineInfo[j].syntax[0].color = lineInfo[n].syntax[0].color; + } + *force_redraw = 1; /* the previous lines have already been drawn on the screen */ + } + break; + } + } } } } @@ -839,8 +849,9 @@ resolve_types (char *buf, char *raw, struct line_t *lineInfo, int n, int last, lineInfo[n].type = MT_COLOR_NORMAL; /* body patterns */ - if (lineInfo[n].type == MT_COLOR_NORMAL || - lineInfo[n].type == MT_COLOR_QUOTED) + if (lineInfo[n].type == MT_COLOR_NORMAL || + lineInfo[n].type == MT_COLOR_QUOTED || + (lineInfo[n].type == MT_COLOR_HDEFAULT && option (OPTHEADERCOLORPARTIAL))) { size_t nl; @@ -859,7 +870,10 @@ resolve_types (char *buf, char *raw, struct line_t *lineInfo, int n, int last, found = 0; null_rx = 0; - color_line = ColorBodyList; + if (lineInfo[n].type == MT_COLOR_HDEFAULT) + color_line = ColorHdrList; + else + color_line = ColorBodyList; while (color_line) { if (regexec (&color_line->rx, buf + offset, 1, pmatch,