diff options
Diffstat (limited to 'lisp/+notmuch.el')
-rw-r--r-- | lisp/+notmuch.el | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/lisp/+notmuch.el b/lisp/+notmuch.el new file mode 100644 index 0000000..74b9b77 --- /dev/null +++ b/lisp/+notmuch.el | |||
@@ -0,0 +1,105 @@ | |||
1 | ;;; +notmuch.el --- Notmuch extras -*- lexical-binding: t; -*- | ||
2 | |||
3 | ;;; Commentary: | ||
4 | |||
5 | ;; This is stuff that I suppose /could/ go in notmuch/init.el, but ... doesn't. | ||
6 | |||
7 | ;;; Code: | ||
8 | |||
9 | (require 'cl-lib) | ||
10 | (require 'notmuch) | ||
11 | |||
12 | (defvar +notmuch-send-dispatch-rules nil | ||
13 | "Alist of from addresses and variables to set when sending.") | ||
14 | |||
15 | (defun +notmuch-query-concat (&rest queries) | ||
16 | "Concatenate notmuch queries." | ||
17 | (mapconcat #'identity queries " AND ")) | ||
18 | |||
19 | (defun +send-mail-dispatch () | ||
20 | "Dispatch mail sender, depending on account." | ||
21 | (let ((from (message-fetch-field "from"))) | ||
22 | (dolist (vars (cl-loop for (addr . vars) in +notmuch-send-dispatch-rules | ||
23 | if (string-match-p addr from) return vars)) | ||
24 | (set (car vars) (cdr vars))))) | ||
25 | |||
26 | (defun +notmuch-correct-tags (args) | ||
27 | (list (car args) (mapcar #'string-trim (cadr args)))) | ||
28 | |||
29 | (defun +notmuch-goto (&optional prefix) | ||
30 | "Go straight to a `notmuch' search. | ||
31 | Without PREFIX argument, go to the first one in | ||
32 | `notmuch-saved-searches'; with a PREFIX argument, prompt the user | ||
33 | for which saved search to go to; with a double PREFIX | ||
34 | argument (\\[universal-argument] \\[universal-argument]), prompt | ||
35 | for search." | ||
36 | (interactive "P") | ||
37 | (pcase prefix | ||
38 | ('nil (notmuch-search (plist-get (car notmuch-saved-searches) :query))) | ||
39 | ('(4) (notmuch-search (plist-get (cl-find (completing-read "Saved Search: " | ||
40 | (mapcar (lambda (el) | ||
41 | (plist-get el :name)) | ||
42 | notmuch-saved-searches)) | ||
43 | notmuch-saved-searches | ||
44 | :key (lambda (el) (plist-get el :name)) | ||
45 | :test #'equal) | ||
46 | :query))) | ||
47 | (_ (notmuch-search)))) | ||
48 | |||
49 | ;; Don't add an initial input when completing addresses | ||
50 | (eval-after notmuch | ||
51 | (cond ((featurep 'el-patch) | ||
52 | (el-patch-feature notmuch) | ||
53 | (el-patch-defun notmuch-address-selection-function (prompt collection initial-input) | ||
54 | "Call (`completing-read' | ||
55 | PROMPT COLLECTION nil nil INITIAL-INPUT 'notmuch-address-history)" | ||
56 | (completing-read | ||
57 | prompt collection nil nil | ||
58 | (el-patch-swap initial-input | ||
59 | nil) | ||
60 | 'notmuch-address-history))) | ||
61 | (:else | ||
62 | (defun notmuch-address-selection-function (prompt collection initial-input) | ||
63 | "Call (`completing-read' | ||
64 | PROMPT COLLECTION nil nil INITIAL-INPUT 'notmuch-address-history)" | ||
65 | (completing-read | ||
66 | prompt collection nil nil nil | ||
67 | 'notmuch-address-history))))) | ||
68 | |||
69 | (defcustom +notmuch-spam-tags '("+spam" "+Spam") | ||
70 | "A list of tag changes to apply when marking a thread as spam." | ||
71 | :type '(repeat string)) | ||
72 | |||
73 | (defun +notmuch-tree-mark-spam-then-next (&optional ham beg end) | ||
74 | "Mark the current message as spam and move to the next." | ||
75 | (interactive "P") | ||
76 | (+notmuch-tree-mark-spam ham) | ||
77 | (notmuch-tree-next-matching-message)) | ||
78 | |||
79 | (defun +notmuch-tree-mark-spam (&optional ham) | ||
80 | "Mark the current message as spam. | ||
81 | That is, apply the tag changes in `+notmuch-spam-tags' to it. If | ||
82 | an optional prefix HAM argument is given, the message will be | ||
83 | marked as not-spam (\"ham\"), i.e., the tag changes in | ||
84 | `+notmuch-spam-tags' will be reversed." | ||
85 | (interactive "P") | ||
86 | (when +notmuch-spam-tags | ||
87 | (notmuch-tree-tag | ||
88 | (notmuch-tag-change-list +notmuch-spam-tags ham)))) | ||
89 | |||
90 | (defun +notmuch-search-mark-spam (&optional ham beg end) | ||
91 | "Mark the current thread or region as spam. | ||
92 | This adds the tags in `+notmuch-spam-tags' to the message. With | ||
93 | an optional HAM prefix argument, mark the messages as | ||
94 | not-spam (\"ham\"). | ||
95 | |||
96 | This function advances the next thread when finished." | ||
97 | (interactive (cons current-prefix-arg (notmuch-interactive-region))) | ||
98 | (when +notmuch-spam-tags | ||
99 | (notmuch-search-tag | ||
100 | (notmuch-tag-change-list +notmuch-spam-tags ham) beg end)) | ||
101 | (when (eq beg end) | ||
102 | (notmuch-search-next-thread))) | ||
103 | |||
104 | (provide '+notmuch) | ||
105 | ;;; +notmuch.el ends here | ||