;; -------- ;; 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 (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))) (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)))))) (setq notmuch-folders '(("inbox" . "tag:inbox") ("debian-announce" . "tag:inbox AND tag:debian-announce") ("debian-devel" . "tag:inbox AND tag:debian-devel") ("debian-haskell" . "tag:inbox AND tag:debian-haskell") )) (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) (defun my-notmuch-show-view-as-patch () "View the the current message as a patch." (interactive) (let* ((id (notmuch-show-get-message-id)) (subject (concat "Subject: " (notmuch-show-get-subject) "\n")) (diff-default-read-only t) (buf (get-buffer-create (concat "*notmuch-patch-" id "*"))) (map (make-sparse-keymap))) (define-key map "q" 'notmuch-kill-this-buffer) (switch-to-buffer buf) (let ((inhibit-read-only t)) (erase-buffer) (insert subject) (insert (notmuch-get-bodypart-internal id 1 nil))) (set-buffer-modified-p nil) (diff-mode) (lexical-let ((new-ro-bind (cons 'buffer-read-only map))) (add-to-list 'minor-mode-overriding-map-alist new-ro-bind)) (goto-char (point-min))))