feat: r/R/C-y reply/forward from the search list #25

Merged
clanker merged 1 commit from pr/reply-from-list into master 2026-08-14 21:49:01 +00:00
Member

r / R / C-y now work from the search list — no need to open the thread.

Reply/forward resolve by focused context:

  • Thread preview focused → its current message (J/K selection), exactly as before
  • Search list focused (or no preview open) → the selected thread's most recent email, fetched on demand via notmuch show (new SearchPanel.reply/forward + _thread_latest_message; latest_message() helper in thread_model)

So: navigate the list with j/k, press r → reply to that thread's latest email without opening it. Unopened threads just work.

Implementation:

  • keymap r/R/C-y route through controller.reply()/forward() (focus resolution: preview-focused → ThreadView.reply; else list → ThreadList.reply)
  • PanelApp/ThreadList protocols extended; Dodo shims added
  • no-message case warns instead of silently doing nothing

Tests: 7 new — list reply picks the most recent message (not the first), reply/reply-all/forward modes, no-message warning, controller focus resolution in both directions, latest_message helper. Suite: 142 passed, mypy 0.

Worth eyeballing: r from the list opens compose with the thread's latest message; r with the preview focused still uses the J/K-selected message.

**r / R / C-y now work from the search list — no need to open the thread.** Reply/forward resolve by **focused context**: - **Thread preview focused** → its current message (J/K selection), exactly as before - **Search list focused** (or no preview open) → the selected thread's **most recent email**, fetched on demand via `notmuch show` (new `SearchPanel.reply`/`forward` + `_thread_latest_message`; `latest_message()` helper in `thread_model`) So: navigate the list with `j`/`k`, press `r` → reply to that thread's latest email without opening it. Unopened threads just work. Implementation: - keymap `r`/`R`/`C-y` route through `controller.reply()`/`forward()` (focus resolution: preview-focused → `ThreadView.reply`; else list → `ThreadList.reply`) - `PanelApp`/`ThreadList` protocols extended; Dodo shims added - no-message case warns instead of silently doing nothing Tests: 7 new — list reply picks the **most recent** message (not the first), reply/reply-all/forward modes, no-message warning, controller focus resolution in both directions, `latest_message` helper. Suite: **142 passed**, mypy **0**. Worth eyeballing: `r` from the list opens compose with the thread's latest message; `r` with the preview focused still uses the J/K-selected message.
Reply/forward now resolve by focused context:
- Thread preview focused -> its current message (J/K selection), as before.
- Search list focused (or no preview open) -> the selected thread's most
  recent email, fetched via notmuch show (new SearchPanel.reply/forward
  + _thread_latest_message; latest_message() helper in thread_model).

Keymap: r/R/C-y now route through controller.reply()/forward() (focus
resolution) instead of delegate_to_thread. PanelApp/ThreadList
protocols extended; Dodo shims added.

Tests: 7 new — list reply uses the most-recent message (not the
first), reply-all/plain/forward modes, no-message warning, controller
focus resolution both ways, latest_message helper. 142 passed, mypy 0.
clanker merged commit 73931a8736 into master 2026-08-14 21:49:01 +00:00
clanker deleted branch pr/reply-from-list 2026-08-14 21:49:02 +00:00
Sign in to join this conversation.
No reviewers
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Home/lazarus!25
No description provided.