···7979 os.Exit(1)
8080 }
81818282+ ui.Version = version
8283 model := ui.New(cfg, imapClients, sc)
83848485 p := tea.NewProgram(
+4-2
docs/keybindings.md
···6868| `Mm` | move to Someday |
696970707171-### Multi-select
7171+### Multi-select & Undo
72727373| Key | Action |
7474|-----|--------|
···111111| `shift+R` | reply-all — reply to sender + all CC recipients (from reader) |
112112| `f` | forward email (from reader or inbox) |
113113| `c` | compose new email |
114114-| `ctrl+b (compose)` | toggle Cc+Bcc fields (both hidden by default) |
114114+| `ctrl+b (compose/pre-send)` | toggle Cc+Bcc fields (both hidden by default) |
115115| `ctrl+f (compose/pre-send)` | cycle From address through all accounts + [[senders]] aliases |
116116| `a (pre-send)` | attach file via yazi file picker (or $NEOMD_FILE_PICKER) |
117117| `D (pre-send)` | remove last attachment |
118118| `d (pre-send)` | save to Drafts folder (IMAP APPEND with \Draft flag) |
119119+| `s (pre-send)` | spell check — open in nvim with spell on, jump to first error |
119120| `p (pre-send)` | preview email in $BROWSER (images rendered, same as recipient sees) |
120121| `e (pre-send)` | re-open editor to edit body |
121122| `enter (pre-send)` | confirm and send |
···145146| `:empty-trash / :et` | permanently delete ALL emails in Trash (y/n) |
146147| `:create-folders / :cf` | create missing IMAP folders from config (safe, idempotent) |
147148| `:go-spam / :spam` | open Spam folder (not in tab rotation) |
149149+| `:debug / :dbg` | diagnostic report — IMAP ping, config, folders, state (saved to /tmp/neomd/debug.log) |
148150| `:quit / :q` | quit neomd |
149151150152
+4
internal/ui/model.go
···9595 }
9696)
97979898+// Version is set by main.go at startup (from build-time ldflags).
9999+var Version = "dev"
100100+98101// neomdTempDir returns /tmp/neomd/, creating it if needed.
99102// Using a dedicated subdirectory keeps temp files discoverable (e.g. recovering
100103// a draft after a crash) and avoids cluttering /tmp/.
···135138 return func() tea.Msg {
136139 var b strings.Builder
137140 b.WriteString("# neomd debug report\n\n")
141141+ b.WriteString(fmt.Sprintf("Version: %s\n", Version))
138142 b.WriteString(fmt.Sprintf("Time: %s\n", time.Now().Format(time.RFC3339)))
139143 b.WriteString(fmt.Sprintf("Config: %s\n\n", config.DefaultPath()))
140144