From 372d2f12df2ad3c15def6a34bd5e6ad33f77d117 Mon Sep 17 00:00:00 2001 From: Raul Benencia Date: Sat, 20 Aug 2022 11:30:58 -0700 Subject: emacs: notmuch --- .emacs.local.d/modes/notmuch.el | 97 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 .emacs.local.d/modes/notmuch.el (limited to '.emacs.local.d') 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) -- cgit v1.2.3