]> granicus.if.org Git - mutt/commitdiff
Add $header_color_partial to allow partial coloring of headers.
authorKevin McCarthy <kevin@8t8.us>
Tue, 9 May 2017 01:48:25 +0000 (18:48 -0700)
committerKevin McCarthy <kevin@8t8.us>
Tue, 9 May 2017 01:48:25 +0000 (18:48 -0700)
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.

doc/manual.xml.head
init.h
mutt.h
pager.c

index 9045d1e5c0a710cdbde808e5957df6f721beacfe..d8c0f8f8a0f07fff716bcf171cb376522309fe56 100644 (file)
@@ -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>
diff --git a/init.h b/init.h
index abf87a3a03cecdac7f6e78d851d38af1124a0d8d..82a499b315e481c29f1438cc75e36782f5599e61 100644 (file)
--- 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 cedd630c01cd330a01ef0c9f23acdf210dc959ab..d19c0c13233ce4f8c86fc17e18cbb6a3b31b1aad 100644 (file)
--- 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 ae46e2fd4a6135144a27fbdfbbd1d31eb57cac8d..baabeffb3fc69b0314045b96743221f79e68b4be 100644 (file)
--- 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,