Commit 89c6fd8d authored by Kevin J. McCarthy's avatar Kevin J. McCarthy

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.
parent 0178efcb
......@@ -2717,6 +2717,14 @@ server-side searches (=b, =B, =h) are not supported for color index
patterns.
</para>
<para>
When <link linkend="header-color-partial">$header_color_partial</link>
is unset (the default), a <emphasis>header</emphasis> matched by
<emphasis>regexp</emphasis> will have color applied to the entire header.
When set, color is applied only to the exact text matched by
<emphasis>regexp</emphasis>.
</para>
<para>
<emphasis>object</emphasis> can be one of:
</para>
......
......@@ -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
......
......@@ -366,6 +366,7 @@ enum
#endif
OPTHDRS,
OPTHEADER,
OPTHEADERCOLORPARTIAL,
OPTHELP,
OPTHIDDENHOST,
OPTHIDELIMITED,
......
......@@ -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,
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment