Description: Add pattern modifier ~a to match addresses in all headers.
 More precisely, the headers with addresses taken into account by Mutt
 in its envelope structure are "From:", "Sender:", "To:", "Cc:", "Bcc:",
 "Return-Path:", "Reply-To:", and "Mail-Followup-To:".
 Patch written on 2008-05-30.
Bug: https://gitlab.com/muttmua/trac-tickets/-/blob/master/tickets/open/3065-new_pattern_modifiers_a_and_a_to_search_all_address_fields_o.txt
Author: Vincent Lefevre <vincent@vinc17.net>
Last-Update: 2022-06-09

diff --git a/PATCHES b/PATCHES
index e69de29b..98189c1e 100644
--- a/PATCHES
+++ b/PATCHES
@@ -0,0 +1,1 @@
+patch-20220609.vl.address_all_patt.1
diff --git a/doc/manual.xml.head b/doc/manual.xml.head
index c35b63f4..2e73eff0 100644
--- a/doc/manual.xml.head
+++ b/doc/manual.xml.head
@@ -5879,6 +5879,8 @@ shows several ways to select messages.
 <row><entry>Pattern modifier</entry><entry>Description</entry></row>
 </thead>
 <tbody>
+<row><entry>~a <emphasis>EXPR</emphasis></entry><entry>messages which contain EXPR in some envelope address field</entry></row>
+<row><entry>%a <emphasis>GROUP</emphasis></entry><entry>messages which contain a member of GROUP in some envelope address field</entry></row>
 <row><entry>~A</entry><entry>all messages</entry></row>
 <row><entry>~b <emphasis>EXPR</emphasis></entry><entry>messages which contain <emphasis>EXPR</emphasis> in the message body ***)</entry></row>
 <row><entry>=b <emphasis>STRING</emphasis></entry><entry>If IMAP is enabled, like ~b but searches for <emphasis>STRING</emphasis> on the server, rather than downloading each message and searching it locally.</entry></row>
diff --git a/mutt.h b/mutt.h
index bb29e7a6..4aa5153b 100644
--- a/mutt.h
+++ b/mutt.h
@@ -268,6 +268,7 @@ enum
   MUTT_PERSONAL_RECIP,
   MUTT_PERSONAL_FROM,
   MUTT_ADDRESS,
+  MUTT_ADDRESS_ALL,
   MUTT_CRYPT_SIGN,
   MUTT_CRYPT_VERIFIED,
   MUTT_CRYPT_ENCRYPT,
diff --git a/pattern.c b/pattern.c
index 28a33d81..3004be6b 100644
--- a/pattern.c
+++ b/pattern.c
@@ -64,6 +64,11 @@ static const struct pattern_flags
 }
 Flags[] =
 {
+  { 'a', MUTT_ADDRESS_ALL, 0, EAT_REGEXP,
+    /* L10N:
+       Pattern Completion Menu description for ~a
+    */
+    N_("messages with an address from headers matching EXPR") },
   { 'A', MUTT_ALL, 0, 0,
     /* L10N:
        Pattern Completion Menu description for ~A
@@ -1694,6 +1699,12 @@ mutt_pattern_exec (struct pattern_t *pat, pattern_exec_flag flags, CONTEXT *ctx,
       return (pat->not ^ match_adrlist (pat, flags & MUTT_MATCH_FULL_ADDRESS, 4,
                                         h->env->from, h->env->sender,
                                         h->env->to, h->env->cc));
+    case MUTT_ADDRESS_ALL:
+      return (pat->not ^ match_adrlist (pat, flags & MUTT_MATCH_FULL_ADDRESS, 8,
+                                        h->env->from, h->env->sender,
+                                        h->env->to, h->env->cc, h->env->bcc,
+                                        h->env->return_path, h->env->reply_to,
+                                        h->env->mail_followup_to));
     case MUTT_RECIPIENT:
       return (pat->not ^ match_adrlist (pat, flags & MUTT_MATCH_FULL_ADDRESS,
                                         2, h->env->to, h->env->cc));
