aboutsummaryrefslogtreecommitdiff
path: root/.emacs.local.d/modes/notmuch.el
blob: f5096c8aa8ea6be98507d2ce5cdc16c04487ac98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
;; --------
;; 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))))
nihil fit ex nihilo