]> granicus.if.org Git - neomutt/commitdiff
Adds the '@' pattern modifier to limit matches to known aliases.
authorDavid Champion <dgc@bikeshed.us>
Thu, 17 Nov 2016 00:05:02 +0000 (16:05 -0800)
committerRichard Russon <rich@flatcap.org>
Thu, 24 Nov 2016 19:28:14 +0000 (19:28 +0000)
Example: ~f joe matches messages from joe. @~f joe matches messages from
any joe who is defined as an alias.

Pushed by Kevin McCarthy with two minor cosmetic fixes.

doc/manual.xml.head
mutt.h
pattern.c

index cf336efdde00ea1b21cb8289f03f05553fe97881..8b5fabdabfb6477d5c4d17f07d7bb21bcf5240fb 100644 (file)
@@ -5018,6 +5018,29 @@ configuration command, preventing Mutt from recording the
 <command>macro</command>'s commands into its history.
 </para>
 
+<para>
+You can restrict address pattern matching to aliases that you have
+defined with the "@" modifier.  This example matches messages whose
+recipients are all from Germany, and who are known to your alias list.
+</para>
+
+<para>
+<screen>
+^@~C \.de$
+</screen>
+</para>
+
+<para>
+To match any defined alias, use a regular expression that matches any
+string.  This example matches messages whose senders are known aliases.
+</para>
+
+<para>
+<screen>
+@~f .
+</screen>
+</para>
+
 </sect3>
 
 </sect2>
diff --git a/mutt.h b/mutt.h
index c3d001d74cb8df429825cddf1168d57bb957ba44..4e31f56ae74dcc3b0ca72bca36f7a5353e56f04d 100644 (file)
--- a/mutt.h
+++ b/mutt.h
@@ -945,6 +945,7 @@ typedef struct pattern_t
   unsigned int stringmatch : 1;
   unsigned int groupmatch : 1;
   unsigned int ign_case : 1;           /* ignore case for local stringmatch searches */
+  unsigned int isalias : 1;
   int min;
   int max;
   struct pattern_t *next;
index c225377d3500805201fe2c52a02aacb9197f8612..7750151a9d3e6f9b6c910addacc38db524ac9d58 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -834,6 +834,7 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err)
   int alladdr = 0;
   int or = 0;
   int implicit = 1;    /* used to detect logical AND operator */
+  int isalias = 0;
   const struct pattern_flags *entry;
   char *p;
   char *buf;
@@ -856,6 +857,10 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err)
        ps.dptr++;
        not = !not;
        break;
+      case '@':
+       ps.dptr++;
+       isalias = !isalias;
+       break;
       case '|':
        if (!or)
        {
@@ -881,6 +886,7 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err)
        implicit = 0;
        not = 0;
        alladdr = 0;
+       isalias = 0;
        break;
       case '%':
       case '=':
@@ -910,8 +916,10 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err)
          last = tmp;
          tmp->not ^= not;
          tmp->alladdr |= alladdr;
+         tmp->isalias |= isalias;
          not = 0;
          alladdr = 0;
+         isalias = 0;
          /* compile the sub-expression */
          buf = mutt_substrdup (ps.dptr + 1, p);
          if ((tmp2 = mutt_pattern_comp (buf, flags, err)) == NULL)
@@ -939,10 +947,12 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err)
        tmp = new_pattern ();
        tmp->not = not;
        tmp->alladdr = alladdr;
+       tmp->isalias = isalias;
         tmp->stringmatch = (*ps.dptr == '=') ? 1 : 0;
         tmp->groupmatch  = (*ps.dptr == '%') ? 1 : 0;
        not = 0;
        alladdr = 0;
+       isalias = 0;
 
        if (last)
          last->next = tmp;
@@ -1008,8 +1018,10 @@ pattern_t *mutt_pattern_comp (/* const */ char *s, int flags, BUFFER *err)
        last = tmp;
        tmp->not ^= not;
        tmp->alladdr |= alladdr;
+       tmp->isalias |= isalias;
        not = 0;
        alladdr = 0;
+       isalias = 0;
        ps.dptr = p + 1; /* restore location */
        break;
       default:
@@ -1061,8 +1073,10 @@ static int match_adrlist (pattern_t *pat, int match_personal, int n, ...)
   {
     for (a = va_arg (ap, ADDRESS *) ; a ; a = a->next)
     {
-      if (pat->alladdr ^ ((a->mailbox && patmatch (pat, a->mailbox) == 0) ||
-          (match_personal && a->personal && patmatch (pat, a->personal) == 0)))
+      if (pat->alladdr ^
+          ((!pat->isalias || alias_reverse_lookup (a)) &&
+           ((a->mailbox && !patmatch (pat, a->mailbox)) ||
+           (match_personal && a->personal && !patmatch (pat, a->personal) ))))
       {
        va_end (ap);
        return (! pat->alladdr); /* Found match, or non-match if alladdr */