On Thu, Feb 26, 2026 at 12:19:48PM +0800, Kevin J. McCarthy wrote:
> This option, when unset, modifies the display of email headers when
> $weed is enabled.
>
> The default behavior is to unfold headers when $weed is set, and to
> leave them folded when $weed is unset (in effect, displaying them as
> they appear in the original email, subject to screen width wrapping).
>
> When $weed_unfold is unset and $weed is set, the headers will be
> weeded, but will not be unfolded: displaying as they appear in the
> original email.
>
> The option could be useful for those who 'unignore' long headers, such
> as from Spam Assassin, that are formatted to be more readable in the
> original email, but become unreadable when unfolded/refolded to screen
> width.
This left me a bit confused, but maybe it's just me. Just to clarify:
$weed_unfold unset is the new behaviour while setting $weed_unfold is
the old default? If so, wouldn't it make more sense to use $weed_fold?
Also, unfolding in that case means that a nicely formatted header, a
header that goes over multiple lines to be read by humans, is 'unfolded'
to be a single line header, right?
> ---
> This is in response to ticket #511.
>
> I originally started on a version of this that made unfolding and
> weeding orthogonal. However there were two problems with that approach:
>
> 1. The implementation was much more invasive, requiring more state flags
> and commands and modifications all over the place.
>
> 2. It ended up being confusing to control. The current default behavior
> of mutt is to unfold when $weed is toggled, but display as original
> when $weed is toggled off. When the options are orthogonal, keeping the
> current behavior required toggling two flags: weed and unfold when
> switching between those states. It would have been confusing to
> existing users and likely generated a lot of complaints.
>
> Since this option is probably only interesting to a small number of
> users, I decided to instead just have a modifier state when $weed is
> set.
>
> init.h | 11 +++++++++++
> mutt.h | 1 +
> sendlib.c | 2 +-
> 3 files changed, 13 insertions(+), 1 deletion(-)
>
> diff --git a/init.h b/init.h
> index 84e62fb4..eb331a37 100644
> --- a/init.h
> +++ b/init.h
> @@ -4911,6 +4911,17 @@ struct option_t MuttVars[] = {
> ** .pp
> ** Also see $$copy_decode_weed, $$pipe_decode_weed, $$print_decode_weed.
> */
> + { "weed_unfold", DT_BOOL, R_NONE, {.l=OPTWEEDUNFOLD}, {.l=1} },
> + /*
> + ** .pp
> + ** When \fIset\fP, mutt will unfold (and then refold) headers when
> + ** displaying messages with $$weed set. When \fIunset\fP, headers
> + ** will be displayed as they appear in the original email, but still
> + ** subject to display width wrapping.
> + ** .pp
> + ** Note that when $$weed is unset, mutt always displays the headers
> + ** as they appear in the original email.
> + */
> { "wrap", DT_NUM, R_PAGER_FLOW, {.p=&Wrap}, {.l=0} },
> /*
> ** .pp
> diff --git a/mutt.h b/mutt.h
> index 75a45999..36f92a31 100644
> --- a/mutt.h
> +++ b/mutt.h
> @@ -582,6 +582,7 @@ enum
> #endif
> OPTWAITKEY,
> OPTWEED,
> + OPTWEEDUNFOLD,
> OPTWRAP,
> OPTWRAPSEARCH,
> OPTWRITEBCC, /* write out a bcc header? */
> diff --git a/sendlib.c b/sendlib.c
> index a700d500..476865ac 100644
> --- a/sendlib.c
> +++ b/sendlib.c
> @@ -2183,7 +2183,7 @@ int mutt_write_one_header (FILE *fp, const char *tag,
> const char *value,
> int pfxw = mutt_strwidth (pfx);
> char *v = safe_strdup (value);
>
> - if (!(flags & CH_DISPLAY) || option (OPTWEED))
> + if (!(flags & CH_DISPLAY) || (option (OPTWEED) && option (OPTWEEDUNFOLD)))
> v = unfold_header (v);
>
> /* when not displaying, use sane wrap value */
> --
> 2.53.0
>