aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.emacs1
-rw-r--r--.emacs.local.d/modes/notmuch.el97
2 files changed, 98 insertions, 0 deletions
diff --git a/.emacs b/.emacs
index 4fd46f7..d598c5d 100644
--- a/.emacs
+++ b/.emacs
@@ -20,6 +20,7 @@
(load-file "~/.emacs.local.d/modes/mail-mode.el")
(load-file "~/.emacs.local.d/modes/markdown.el")
(load-file "~/.emacs.local.d/modes/magit.el")
+(load-file "~/.emacs.local.d/modes/notmuch.el")
(load-file "~/.emacs.local.d/modes/org.el")
(load-file "~/.emacs.local.d/modes/org-journal.el")
(load-file "~/.emacs.local.d/modes/org-roam.el")
diff --git a/.emacs.local.d/modes/notmuch.el b/.emacs.local.d/modes/notmuch.el
new file mode 100644
index 0000000..208e051
--- /dev/null
+++ b/.emacs.local.d/modes/notmuch.el
@@ -0,0 +1,97 @@
+;; --------
+;; notmuch mode
+;; --------
+(require 'notmuch)
+
+;; This should be upstream
+(require 'notmuch-show)
+(require 'notmuch-tag)
+(defun notmuch-tree-show-message-in ()
+ "Show the current message (in split-pane)."
+ (interactive)
+ (let ((id (notmuch-tree-get-message-id))
+ (inhibit-read-only t)
+ buffer)
+ (when id
+ ;; We close and reopen the window to kill off un-needed buffers
+ ;; this might cause flickering but seems ok.
+ (notmuch-tree-close-message-window)
+ (setq notmuch-tree-message-window
+ (split-window-vertically (/ (window-height) 4)))
+ (with-selected-window notmuch-tree-message-window
+ ;; Since we are only displaying one message do not indent.
+ (let ((notmuch-show-indent-messages-width 0)
+ (notmuch-show-only-matching-messages t))
+ (setq buffer (notmuch-show id))))
+ ;; We need the `let' as notmuch-tree-message-window is buffer local.
+ (let ((window notmuch-tree-message-window))
+ (with-current-buffer buffer
+ (setq notmuch-tree-message-window window)
+ (add-hook 'kill-buffer-hook 'notmuch-tree-message-window-kill-hook)))
+ (when notmuch-show-mark-read-tags
+ (notmuch-tree-tag-update-display notmuch-show-mark-read-tags)
+ (notmuch-tree-tag notmuch-show-mark-read-tags))
+ (setq notmuch-tree-message-buffer buffer))))
+;; End upstream
+
+;; Keymaps
+
+; Spam
+(define-key notmuch-show-mode-map "S"
+ (lambda ()
+ "mark message as spam"
+ (interactive)
+ (notmuch-show-tag (list "+spam" "-inbox" "-unread"))))
+
+(define-key notmuch-search-mode-map "S"
+ (lambda (&optional beg end)
+ "mark thread as spam"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "+spam" "-inbox" "-unread") beg end)))
+
+; Archive
+(define-key notmuch-show-mode-map "A"
+ (lambda ()
+ "archive"
+ (interactive)
+ (notmuch-show-tag (list "+archive" "-inbox" "-unread"))))
+
+(define-key notmuch-search-mode-map "A"
+ (lambda (&optional beg end)
+ "mark thread as spam"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "+archive" "-inbox" "-unread") beg end)))
+
+; Mark as read
+(define-key notmuch-search-mode-map "R"
+ (lambda (&optional beg end)
+ "mark thread as read"
+ (interactive (notmuch-search-interactive-region))
+ (notmuch-search-tag (list "-unread") beg end)
+ (notmuch-search-next-thread)))
+
+(define-key notmuch-search-mode-map (kbd "RET")
+ (lambda ()
+ "Show the selected thread with notmuch-tree if it has more
+than one email. Use notmuch-show otherwise."
+ (interactive)
+ (if (= (plist-get (notmuch-search-get-result) :total) 1)
+ (notmuch-search-show-thread)
+ (notmuch-tree (notmuch-search-find-thread-id)
+ notmuch-search-query-string
+ nil
+ (notmuch-prettify-subject (notmuch-search-find-subject))))))
+
+(defun color-inbox-if-unread () (interactive)
+ (save-excursion
+ (goto-char (point-min))
+ (let ((cnt (car (process-lines "notmuch" "count" "tag:inbox and tag:unread"))))
+ (when (> (string-to-number cnt) 0)
+ (save-excursion
+ (when (search-forward "inbox" (point-max) t)
+ (let* ((overlays (overlays-in (match-beginning 0) (match-end 0)))
+ (overlay (car overlays)))
+ (when overlay
+ (overlay-put overlay 'face '((:inherit bold) (:foreground "green")))))))))))
+
+(add-hook 'notmuch-hello-refresh-hook 'color-inbox-if-unread)
nihil fit ex nihilo