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.
Sponsors
Special thanks to our sponsors:
Jakub Jindra (@jindraj) |
Scott Kostyshak (@scottkosty) |
Ander Punnar (@4nd3r) |
Igor Serebryany (@igor47) |
Martin Spendiff (@veebch) |
Mark Korondi (@kmARC) |
Mateus Etto (@yutsuten) |
J Sheng (@lamons) |
- Robert Labudda
- Patrick Koetter (@patrickbenkoetter)
- Sebastian Kowalczyk
- 海老根蓉也
- Reiko Kaps
Thanks
Many thanks to our regular contributors:
- Alejandro Colomar (@alejandro-colomar)
- Gerrit Rüsing (@kbcb)
- Emir Sari (@bitigchi)
- Dennis Schön (@roccoblues)
- Tóth János (@g0mb4)
- Marius Gedminas (@mgedmin)
- Страхиња Радић (@strahinja)
- Mateus Etto (@yutsuten)
- Pierre Colin (@Pierre-Colin)
- Jakub Jindra (@jindraj)
and our sharp-eyed testers:
- Scott Kostyshak (@scottkosty)
- Jörg Sommer (@jo-so)
- William Casarin (@jb55)
- @dorsiflexion
- Horacio Sanson (@hsanson)
Features
- #4216 Compose: Hide MixMaster chain if chain is empty
- Expando upgrade
- version: bold labels
Contrib
- mutt_oauth2.py: Detect recipient for oauth automatically
- mutt_oauth2.py: imap_oauth_refresh_command does not need options
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 useis_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
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
Translations
- 100% Czech
- 100% German
- 100% Lithuanian
- 100% Serbian
- 100% Slovak
- 99% Turkish
- l10n: document functions
- config: add L10N support
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
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 invokingtigetstr()
andtigetflag()
- Enable CodeQL for python
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 makeresolve_types()
simpler - Rewrite
mutt_apply_replace()
to use buffers