:book: Notes

This is a feature release, sort of :-) There are lots of bug fixes too.

The biggest change is to how NeoMutt handles format strings. Thanks János!

Format strings are now parsed when they are set, rather than every time they are used. This means we can check for errors, e.g.

set index_format = "%Q"
Option index_format: Unknown expando: %Q

Next, 8 config strings have been Localized. Localization (L10N) allows translators to provide language-specific defaults, e.g. $attribution_intro

  • English: “On %d, %n wrote:
  • Serbian: “Дана %d, %n написа:”
  • German: “Am %d, schrieb %n:”

These are the defaults: they can still be overridden.

:heart: Thanks

Many thanks to our regular contributors:

and our sharp-eyed testers:

:gift: Features

  • #4216 Compose: Hide MixMaster chain if chain is empty
  • Expando upgrade
  • version: bold labels

:sparkles: Contrib

  • mutt_oauth2.py: Detect recipient for oauth automatically
  • mutt_oauth2.py: imap_oauth_refresh_command does not need options

:beetle: Bug Fixes

  • #4210 mbox: fix sorting for mbox_resync()
  • #4241 only wrap after first address in header lines
  • status: reset Buffer before reuse
  • history: truncate file before writing over it
  • notmuch: strip leading / from short path
  • Fix smtp client $envelope_from_address possible dangling pointer
  • Fix non-printable keyname printing to use <octal> syntax
  • Filter Arabic Letter Mark due to display corruption
  • Loosen imap_open_mailbox() SELECT response data parsing
  • Change mailto_allow to be exact match only
  • Fix mutt_read_rfc822_line() to use is_email_wsp()
  • Improve pattern compiler whitespace skipping
  • Fix gpgme crash when listing keys in a public key block
  • Add SigInt handler for pattern functions
  • Fix some mailbox prompts to use mailbox history ring
  • Improve GPGME inline processing
  • Reset SIGPIPE signal handler in child process before exec()
  • Filter headers passed via the command line
  • Remove trailing slashes when opening maildir/mh mailboxes
  • Fix mutt_paddstr() to properly filter unprintable chars
  • Minor fixes to match_body_patterns()
  • Fix mutt_ts_capability() fallback list loop
  • Ensure SIGALRM interrupts connect() in batch mode
  • Tighten $query_command parsing to allow empty name field

:wrench: Changed Config

  • #4224 config: add L10N support
  • New: set compose_confirm_detach_first = yes Prevent the accidental deletion of the composed message
  • Changed: set reply_regex = "^((re)(\\[[0-9]+\\])*:[ \t]*)*" Regex to match message reply subjects like ‘re: ‘
  • Changed: set pager = "" External command for viewing messages, or empty to use NeoMutt’s

:black_flag: Translations

  • 100% :czech_republic: Czech
  • 100% :de: German
  • 100% :lithuania: Lithuanian
  • 100% :serbia: Serbian
  • 100% :slovakia: Slovak
  • 99% :tr: Turkish
  • l10n: document functions
  • config: add L10N support

:books: Docs

  • Clarify the manual section on POP3 support
  • Document the <1234> key syntax for bind
  • Document $sendmail invocation behavior
  • Clarify -H usage in batch mode is not a “pass through” option

:building_construction: Build

  • test: remove unnecessary setting of TZ var
  • build: make conn/getdomain.c dependent on DOMAIN
  • Improve w3m invocation for manual.txt generation
  • Include <term.h> before invoking tigetstr() and tigetflag()
  • Enable CodeQL for python

:gear: Code

  • factor out buf_make()
  • drop dupe signal_init() on startup
  • Convert mutt_create_alias() and helpers to use buffer pool
  • Factor out match_body_patterns() to make resolve_types() simpler
  • Rewrite mutt_apply_replace() to use buffers