9 Notmuch Mail

Notmuch is a separately installed mail index and Emacs interface. Emacsvox adds speech and semantic presentation to its Hello, Search, and Show views; it does not configure a mail store, build the Notmuch database, fetch or send mail, or replace Notmuch’s commands. Install compatible Notmuch command-line and Emacs components and complete their setup first. The official Notmuch Emacs manual covers that setup and the complete upstream command set.

The generated emacsvox-notmuch in Emacsvox Reference Manual section is the exhaustive Emacsvox command and option reference. This chapter follows the tasks a user performs and explains when automatic feedback occurs.

9.1 Start Notmuch

Run M-x notmuch to open Notmuch Hello. With the standard Emacsvox global maps loaded, C-' m runs notmuch-search directly and prompts for a query. Emacsvox loads its live integration when Notmuch loads and marks new Hello, Search, Show, and Tree buffers with Notmuch semantic context.

Notmuch remains the authority for every database, tag, archive, attachment, and message-composition operation. Emacsvox observes the result of an explicit upstream command and presents it; loading the integration by itself does not alter mail, tags, files, or Notmuch configuration.

9.4 Read a thread and its MIME parts

Opening a thread speaks one semantic message summary and the first visible body line. Hidden alternative bodies are skipped. If a message has no visible body text, point falls back to a leaf MIME-part button when possible. Moving onto such a button identifies its bounded filename, content type, and size.

n

Run notmuch-show-next-open-message.

p

Run notmuch-show-previous-open-message.

N

Run notmuch-show-next-message, including closed messages.

P

Run notmuch-show-previous-message, including closed messages.

SPC

Run notmuch-show-advance-and-archive. Within one message Emacsvox reads the newly visible page; on a message transition it reads the new message; at the thread end it reports the actual archive outcome and destination.

DEL

Run notmuch-show-rewind and read the resulting page or message.

RET

Run notmuch-show-toggle-message and cue the current message’s resulting visibility.

M-RET

Run notmuch-show-open-or-close-all. It opens every message and reports the resulting thread state and total, such as “Opened all 5 messages.” Use a prefix argument, C-u M-RET, to close every message and receive the corresponding total.

C-c C-p

Run emacsvox-notmuch-speak-show-position. It reports the message ordinal and total plus complete configured message details. On a MIME-part button it instead gives the complete part description, including its full filename.

TAB

Run notmuch-show-next-button and identify the button or MIME part.

<backtab>

Run notmuch-show-previous-button and identify the button or MIME part.

w

Run notmuch-show-save-attachments. Emacsvox confirms when the upstream command returns, but Notmuch does not expose a per-attachment result through this command, so the confirmation cannot distinguish partial skips.

. s

Run notmuch-show-save-part on the current MIME part.

. v

Run notmuch-show-view-part.

. o

Run notmuch-show-interactively-view-part and choose an external action.

. m

Run notmuch-show-choose-mime-of-part.

Viewing, saving, overwriting, or launching a MIME part remains an explicit Notmuch operation. Merely navigating or requesting details never opens an attachment or external viewer.

9.5 Change tags and archive state

Emacsvox compares displayed tags before and after interactive mutation. It reports only the actual additions and removals. Adding an existing tag or removing an absent one reports “Tags unchanged” rather than claiming a change. An error or cancelled upstream command does not produce success feedback.

The following common Show commands receive that result-aware feedback:

+

Run notmuch-show-add-tag on the current message.

-

Run notmuch-show-remove-tag.

*

Run notmuch-show-tag-all across the thread.

a

Run notmuch-show-archive-message-then-next-or-next-thread.

A

Run notmuch-show-archive-thread-then-next.

Archive feedback distinguishes a real change, unchanged archive tags, and an unset notmuch-archive-tags configuration. Movement wrappers give one combined result rather than duplicating feedback from their nested tag or archive command.

9.6 Choose fields, status, and privacy

Run M-x customize-group RET emacsvox-notmuch RET to change Notmuch speech without altering Notmuch’s own database or display.

emacsvox-notmuch-search-result-fields

Defaults to (authors subject date count tags). Remove subject or another field to keep it out of Search navigation speech, reorder fields, or add a formatter function.

emacsvox-notmuch-show-message-fields

Defaults to (from date to cc tags attachments). The subject is omitted by default in Show, while To and Cc recipients are included. Remove to, cc, or any other field when recipient privacy matters.

emacsvox-notmuch-search-field-separator
emacsvox-notmuch-show-field-separator

Control the text placed between configured fields; both default to comma and space.

emacsvox-notmuch-search-status-icons
emacsvox-notmuch-show-status-icons

Map unread, replied, forwarded, flagged, and personal status tags to cues or silence. Removing an entry makes that status available to ordinary tag speech. The optional Aural Presentation feature mail-message-status-cues can own shared semantic mail-state cues.

emacsvox-notmuch-search-completion-style

Choose adaptive, summary, cue, or silent as described under asynchronous completion.

Mail-controlled text is bounded before automatic speech and Aural history. The defaults are 256 characters and 1,024 UTF-8 bytes per field, then 1,000 characters and 4,096 bytes for the complete automatic presentation:

emacsvox-notmuch-automatic-field-character-limit
emacsvox-notmuch-automatic-field-byte-limit

Bound each automatic field before formatting and submission.

emacsvox-notmuch-automatic-total-character-limit
emacsvox-notmuch-automatic-total-byte-limit

Provide the final defense for one automatic Notmuch presentation.

emacsvox-notmuch-mime-node-limit
emacsvox-notmuch-mime-depth-limit

Default to 4,096 cons nodes and depth 64. They keep malformed, cyclic, broad, or deeply nested MIME metadata from exhausting automatic inspection. An incomplete scan reports a conservative attachment lower bound instead of claiming that no attachment exists.

A shortened Search or Show presentation states what was omitted and points to C-c C-p for explicit full configured details; a shortened Hello item points to RET. The explicit Search and Show inspection commands deliberately bypass the automatic content limits; use them only when speaking the complete configured fields is appropriate.

9.6.1 Understand retained and notification content

Primary-stream Notmuch presentations can enter bounded Aural Presentation history. By default Emacsvox retains at most 20 presentations and at most 4,096 UTF-8 bytes of speech preview per record; records contain frozen data, source names, and positions, but never retain source buffers. Run M-x emacsvox-aural-list-recent-feedback to inspect what was retained, or set emacsvox-aural-presentation-history-limit to zero to disable that history.

Generic asynchronous completion uses the notification stream and contains no query or message metadata, but notification text may be retained by the notification subsystem. Choose cue or silent when even a generic thread count is unwanted, and review the global notification-device and log settings separately.

9.7 Know the support boundaries

Hello

Widget navigation, view lifecycle, and searches have Notmuch-specific semantic feedback.

Search

Result navigation, asynchronous lifecycle, tags, archive operations, opening, and configured detail inspection have Notmuch-specific feedback.

Show

Message and part navigation, page reading, visibility, tags, archive operations, and explicit detail inspection have Notmuch-specific feedback.

Tree

Tree buffers receive emacsvox-aural-module context only. Generic core speech can still operate, but this module currently has no Tree-specific row formatter, navigation, mutation, visibility, or asynchronous lifecycle.

Composition

Notmuch uses standard Message-mode composition. Speech support after notmuch-mua-new-mail, reply, forward, or resume transitions belongs to emacsvox-message, not to the Notmuch integration.

There is no independent Notmuch speech disable or unload command. Advice, hooks, and the Search arrow bindings remain installed for the Emacs session once the module loads. Repeated loading is idempotent and does not duplicate them.

9.8 Troubleshoot the live integration

Use ? or C-h m in the affected Notmuch buffer to confirm the keys provided by the installed Notmuch version. Run M-x notmuch-version to identify that package, and use the official manual linked at the beginning of this chapter for its current behavior.

Run M-x emacsvox-aural-doctor when speech bindings, loaded source versus byte-code, Aural rules, sound resources, or the backend appear wrong. Use M-x emacsvox-aural-list-recent-feedback to inspect the exact bounded presentation submitted for a Notmuch action. These diagnostics do not query or modify the mail database.

If you are changing the integration rather than using it, see Integration Maintenance for the build, test, renderer, and asynchronous lifecycle contracts.