<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>
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;
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;
ps.dptr++;
not = !not;
break;
+ case '@':
+ ps.dptr++;
+ isalias = !isalias;
+ break;
case '|':
if (!or)
{
implicit = 0;
not = 0;
alladdr = 0;
+ isalias = 0;
break;
case '%':
case '=':
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)
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;
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:
{
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 */