The attached patch causes mutt to expand mutt variables in the same way that it expands environment variables. For example, you could do something like this in a hook: set sendmail="mysmtp -f $from" A couple of gotchas: environment variables take precedence, and I haven't gotten around to expanding them in a couple of places (notably shell-escape). At the very least it sets the stage for an easy way of doing xterm titles :) feedback welcome...
Index: init.c =================================================================== RCS file: /home/roessler/cvs/mutt/init.c,v retrieving revision 3.39 diff -u -p -r3.39 init.c --- init.c 6 Sep 2005 03:16:11 -0000 3.39 +++ init.c 17 Sep 2005 04:16:11 -0000 @@ -49,6 +49,8 @@ #include <errno.h> #include <sys/wait.h> +static int var_to_string (int idx, char* val, size_t len); + void toggle_quadoption (int opt) { int n = opt/4; @@ -260,6 +262,7 @@ int mutt_extract_token (BUFFER *dest, BU else if (ch == '$' && (!qc || qc == '"') && (*tok->dptr == '{' || isalpha ((unsigned char) *tok->dptr))) { char *env = NULL, *var = NULL; + int idx; if (*tok->dptr == '{') { @@ -279,6 +282,14 @@ int mutt_extract_token (BUFFER *dest, BU } if (var && (env = getenv (var))) mutt_buffer_addstr (dest, env); + else if ((idx = mutt_option_index (var)) != -1) + { + /* expand settable mutt variables */ + char val[LONG_STRING]; + + if (var_to_string (idx, val, sizeof (val))) + mutt_buffer_addstr (dest, val); + } FREE (&var); } else @@ -1991,108 +2002,112 @@ int mutt_var_value_complete (char *buffe if (mutt_strncmp (buffer, "set", 3) == 0) { int idx; + char val[LONG_STRING]; + strfcpy (var, pt, sizeof (var)); /* ignore the trailing '=' when comparing */ var[mutt_strlen (var) - 1] = 0; if ((idx = mutt_option_index (var)) == -1) return 0; /* no such variable. */ - else + else if (var_to_string (idx, val, sizeof (val))) { - char tmp [LONG_STRING], tmp2[LONG_STRING]; - char *s, *d; - size_t dlen = buffer + len - pt - spaces; - char *vals[] = { "no", "yes", "ask-no", "ask-yes" }; + snprintf (pt, len - (pt - buffer), "%s=\"%s\"", var, val); + return 1; + } + } + return 0; +} - tmp[0] = '\0'; +static int var_to_string (int idx, char* val, size_t len) +{ + char tmp[LONG_STRING]; + char *s, *d; + char *vals[] = { "no", "yes", "ask-no", "ask-yes" }; - if ((DTYPE(MuttVars[idx].type) == DT_STR) || - (DTYPE(MuttVars[idx].type) == DT_PATH) || - (DTYPE(MuttVars[idx].type) == DT_RX)) - { - strfcpy (tmp, NONULL (*((char **) MuttVars[idx].data)), sizeof (tmp)); - if (DTYPE (MuttVars[idx].type) == DT_PATH) - mutt_pretty_mailbox (tmp); - } - else if (DTYPE (MuttVars[idx].type) == DT_ADDR) - { - rfc822_write_address (tmp, sizeof (tmp), *((ADDRESS **) MuttVars[idx].data), 0); - } - else if (DTYPE (MuttVars[idx].type) == DT_QUAD) - strfcpy (tmp, vals[quadoption (MuttVars[idx].data)], sizeof (tmp)); - else if (DTYPE (MuttVars[idx].type) == DT_NUM) - snprintf (tmp, sizeof (tmp), "%d", (*((short *) MuttVars[idx].data))); - else if (DTYPE (MuttVars[idx].type) == DT_SORT) - { - const struct mapping_t *map; - char *p; + tmp[0] = '\0'; - switch (MuttVars[idx].type & DT_SUBTYPE_MASK) - { - case DT_SORT_ALIAS: - map = SortAliasMethods; - break; - case DT_SORT_BROWSER: - map = SortBrowserMethods; - break; - case DT_SORT_KEYS: - if ((WithCrypto & APPLICATION_PGP)) - map = SortKeyMethods; - else - map = SortMethods; - break; - default: - map = SortMethods; - break; - } - p = mutt_getnamebyvalue (*((short *) MuttVars[idx].data) & SORT_MASK, map); - snprintf (tmp, sizeof (tmp), "%s%s%s", - (*((short *) MuttVars[idx].data) & SORT_REVERSE) ? "reverse-" : "", - (*((short *) MuttVars[idx].data) & SORT_LAST) ? "last-" : "", - p); - } - else if (DTYPE (MuttVars[idx].type) == DT_MAGIC) - { - char *p; + if ((DTYPE(MuttVars[idx].type) == DT_STR) || + (DTYPE(MuttVars[idx].type) == DT_PATH) || + (DTYPE(MuttVars[idx].type) == DT_RX)) + { + strfcpy (tmp, NONULL (*((char **) MuttVars[idx].data)), sizeof (tmp)); + if (DTYPE (MuttVars[idx].type) == DT_PATH) + mutt_pretty_mailbox (tmp); + } + else if (DTYPE (MuttVars[idx].type) == DT_ADDR) + { + rfc822_write_address (tmp, sizeof (tmp), *((ADDRESS **) MuttVars[idx].data), 0); + } + else if (DTYPE (MuttVars[idx].type) == DT_QUAD) + strfcpy (tmp, vals[quadoption (MuttVars[idx].data)], sizeof (tmp)); + else if (DTYPE (MuttVars[idx].type) == DT_NUM) + snprintf (tmp, sizeof (tmp), "%d", (*((short *) MuttVars[idx].data))); + else if (DTYPE (MuttVars[idx].type) == DT_SORT) + { + const struct mapping_t *map; + char *p; - switch (DefaultMagic) - { - case M_MBOX: - p = "mbox"; - break; - case M_MMDF: - p = "MMDF"; - break; - case M_MH: - p = "MH"; - break; - case M_MAILDIR: - p = "Maildir"; - break; - default: - p = "unknown"; - } - strfcpy (tmp, p, sizeof (tmp)); - } - else if (DTYPE (MuttVars[idx].type) == DT_BOOL) - strfcpy (tmp, option (MuttVars[idx].data) ? "yes" : "no", sizeof (tmp)); - else - return 0; - - for (s = tmp, d = tmp2; *s && (d - tmp2) < sizeof (tmp2) - 2;) - { - if (*s == '\\' || *s == '"') - *d++ = '\\'; - *d++ = *s++; - } - *d = '\0'; - - strfcpy (tmp, pt, sizeof (tmp)); - snprintf (pt, dlen, "%s\"%s\"", tmp, tmp2); - - return 1; + switch (MuttVars[idx].type & DT_SUBTYPE_MASK) + { + case DT_SORT_ALIAS: + map = SortAliasMethods; + break; + case DT_SORT_BROWSER: + map = SortBrowserMethods; + break; + case DT_SORT_KEYS: + if ((WithCrypto & APPLICATION_PGP)) + map = SortKeyMethods; + else + map = SortMethods; + break; + default: + map = SortMethods; + break; } + p = mutt_getnamebyvalue (*((short *) MuttVars[idx].data) & SORT_MASK, map); + snprintf (tmp, sizeof (tmp), "%s%s%s", + (*((short *) MuttVars[idx].data) & SORT_REVERSE) ? "reverse-" : "", + (*((short *) MuttVars[idx].data) & SORT_LAST) ? "last-" : "", + p); } - return 0; + else if (DTYPE (MuttVars[idx].type) == DT_MAGIC) + { + char *p; + + switch (DefaultMagic) + { + case M_MBOX: + p = "mbox"; + break; + case M_MMDF: + p = "MMDF"; + break; + case M_MH: + p = "MH"; + break; + case M_MAILDIR: + p = "Maildir"; + break; + default: + p = "unknown"; + } + strfcpy (tmp, p, sizeof (tmp)); + } + else if (DTYPE (MuttVars[idx].type) == DT_BOOL) + strfcpy (tmp, option (MuttVars[idx].data) ? "yes" : "no", sizeof (tmp)); + else + return 0; + + for (s = tmp, d = val; *s && len - (d - val) > 2; len--) + { + if (*s == '\\' || *s == '"') + *d++ = '\\'; + *d++ = *s++; + } + *d = '\0'; + + return 1; } /* Implement the -Q command line flag */
Attachment:
pgp6huhgoMLzh.pgp
Description: PGP signature