···43594359<command>macro</command>'s commands into its history.
43604360</para>
4361436143624362+<para>
43634363+You can restrict address pattern matching to aliases that you have
43644364+defined with the "@" modifier. This example matches messages whose
43654365+recipients are all from Germany, and who are known to your alias list.
43664366+</para>
43674367+43684368+<para>
43694369+<screen>
43704370+^@~C \.de$
43714371+</screen>
43724372+</para>
43734373+43744374+<para>
43754375+To match any defined alias, use a regular expression that matches any
43764376+string. This example matches messages whose senders are known aliases.
43774377+</para>
43784378+43794379+<para>
43804380+<screen>
43814381+@~f .
43824382+</screen>
43834383+</para>
43844384+43624385</sect3>
4363438643644387</sect2>
+1
mutt.h
···860860 unsigned int stringmatch : 1;
861861 unsigned int groupmatch : 1;
862862 unsigned int ign_case : 1; /* ignore case for local stringmatch searches */
863863+ unsigned int isalias : 1;
863864 int min;
864865 int max;
865866 struct pattern_t *next;
+16-2
pattern.c
···783783 int alladdr = 0;
784784 int or = 0;
785785 int implicit = 1; /* used to detect logical AND operator */
786786+ int isalias = 0;
786787 const struct pattern_flags *entry;
787788 char *p;
788789 char *buf;
···804805 case '!':
805806 ps.dptr++;
806807 not = !not;
808808+ break;
809809+ case '@':
810810+ ps.dptr++;
811811+ isalias = !isalias;
807812 break;
808813 case '|':
809814 if (!or)
···830835 implicit = 0;
831836 not = 0;
832837 alladdr = 0;
838838+ isalias = 0;
833839 break;
834840 case '%':
835841 case '=':
···859865 last = tmp;
860866 tmp->not ^= not;
861867 tmp->alladdr |= alladdr;
868868+ tmp->isalias |= isalias;
862869 not = 0;
863870 alladdr = 0;
871871+ isalias = 0;
864872 /* compile the sub-expression */
865873 buf = mutt_substrdup (ps.dptr + 1, p);
866874 if ((tmp2 = mutt_pattern_comp (buf, flags, err)) == NULL)
···888896 tmp = new_pattern ();
889897 tmp->not = not;
890898 tmp->alladdr = alladdr;
899899+ tmp->isalias = isalias;
891900 tmp->stringmatch = (*ps.dptr == '=') ? 1 : 0;
892901 tmp->groupmatch = (*ps.dptr == '%') ? 1 : 0;
893902 not = 0;
894903 alladdr = 0;
904904+ isalias = 0;
895905896906 if (last)
897907 last->next = tmp;
···957967 last = tmp;
958968 tmp->not ^= not;
959969 tmp->alladdr |= alladdr;
970970+ tmp->isalias |= isalias;
960971 not = 0;
961972 alladdr = 0;
973973+ isalias = 0;
962974 ps.dptr = p + 1; /* restore location */
963975 break;
964976 default:
···10101022 {
10111023 for (a = va_arg (ap, ADDRESS *) ; a ; a = a->next)
10121024 {
10131013- if (pat->alladdr ^ ((a->mailbox && patmatch (pat, a->mailbox) == 0) ||
10141014- (match_personal && a->personal && patmatch (pat, a->personal) == 0)))
10251025+ if (pat->alladdr ^
10261026+ ((!pat->isalias || alias_reverse_lookup (a)) &&
10271027+ ((a->mailbox && !patmatch (pat, a->mailbox)) ||
10281028+ (match_personal && a->personal && !patmatch (pat, a->personal) ))))
10151029 {
10161030 va_end (ap);
10171031 return (! pat->alladdr); /* Found match, or non-match if alladdr */