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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
|
;;; mu4e-contrib.el -- part of mu4e, the mu mail user agent
;;
;; Copyright (C) 2013-2016 Dirk-Jan C. Binnema
;; This file is not part of GNU Emacs.
;;
;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
;;; Commentary:
;; Some user-contributed functions for mu4e
;; Contributed by sabof
(require 'mu4e)
(defun mu4e-headers-mark-all-unread-read ()
"Put a ! \(read) mark on all visible unread messages."
(interactive)
(mu4e-headers-mark-for-each-if
(cons 'read nil)
(lambda (msg param)
(memq 'unread (mu4e-msg-field msg :flags)))))
(defun mu4e-headers-flag-all-read ()
"Flag all visible messages as \"read\"."
(interactive)
(mu4e-headers-mark-all-unread-read)
(mu4e-mark-execute-all t))
;;;
(defun mu4e-headers-mark-all ()
"Mark all messages within current query results and ask user to execute which action."
(interactive)
(mu4e-headers-mark-for-each-if
(cons 'something nil)
(lambda (msg param) t))
(mu4e-mark-execute-all))
;;;
;;; Bookmark handlers
;;
;; Allow bookmarking a mu4e buffer in regular emacs bookmarks.
;; Probably this can be moved to mu4e-view.el.
(add-hook 'mu4e-view-mode-hook
#'(lambda ()
(set (make-local-variable 'bookmark-make-record-function)
'mu4e-view-bookmark-make-record)))
;; And this can be moved to mu4e-headers.el.
(add-hook 'mu4e-headers-mode-hook
#'(lambda ()
(set (make-local-variable 'bookmark-make-record-function)
'mu4e-view-bookmark-make-record)))
(defun mu4e-view-bookmark-make-record ()
"Make a bookmark entry for a mu4e buffer."
(let* ((msg (mu4e-message-at-point))
(maildir (plist-get msg :maildir))
(date (format-time-string "%Y%m%d" (plist-get msg :date)))
(query (format "maildir:%s date:%s" maildir date))
(docid (plist-get msg :docid))
(mode (symbol-name major-mode))
(subject (or (plist-get msg :subject) "No subject")))
`(,subject
,@(bookmark-make-record-default 'no-file 'no-context)
(location . (,query . ,docid))
(mode . ,mode)
(handler . mu4e-bookmark-jump))))
(defun mu4e-bookmark-jump (bookmark)
"Handler function for record returned by `mu4e-view-bookmark-make-record'.
BOOKMARK is a bookmark name or a bookmark record."
(let* ((path (bookmark-prop-get bookmark 'location))
(mode (bookmark-prop-get bookmark 'mode))
(docid (cdr path))
(query (car path)))
(call-interactively 'mu4e)
(mu4e-headers-search query)
(sit-for 0.5)
(mu4e~headers-goto-docid docid)
(mu4e~headers-highlight docid)
(unless (string= mode "mu4e-headers-mode")
(call-interactively 'mu4e-headers-view-message)
(run-with-timer 0.1 nil
(lambda (bmk)
(bookmark-default-handler
`("" (buffer . ,(current-buffer)) .
,(bookmark-get-bookmark-record bmk))))
bookmark))))
;;; handling spam with Bogofilter with possibility to define it for SpamAssassin
;;; contributed by Gour
;; to add the actions to the menu, you can use something like:
;; (add-to-list 'mu4e-headers-actions
;; '("sMark as spam" . mu4e-register-msg-as-spam) t)
;; (add-to-list 'mu4e-headers-actions
;; '("hMark as ham" . mu4e-register-msg-as-ham) t)
(defvar mu4e-register-as-spam-cmd nil
"Command for invoking spam processor to register message as spam,
for example for bogofilter, use \"/usr/bin/bogofilter -Ns < %s\" ")
(defvar mu4e-register-as-ham-cmd nil
"Command for invoking spam processor to register message as ham.
For example for bogofile, use \"/usr/bin/bogofilter -Sn < %s\"")
(defun mu4e-register-msg-as-spam (msg)
"Mark message as spam."
(interactive)
(let* ((path (shell-quote-argument (mu4e-message-field msg :path)))
(command (format mu4e-register-as-spam-cmd path))) ;; re-register msg as spam
(shell-command command))
(mu4e-mark-at-point 'delete nil))
(defun mu4e-register-msg-as-ham (msg)
"Mark message as ham."
(interactive)
(let* ((path (shell-quote-argument(mu4e-message-field msg :path)))
(command (format mu4e-register-as-ham-cmd path))) ;; re-register msg as ham
(shell-command command))
(mu4e-mark-at-point 'something nil))
;; (add-to-list 'mu4e-view-actions
;; '("sMark as spam" . mu4e-view-register-msg-as-spam) t)
;; (add-to-list 'mu4e-view-actions
;; '("hMark as ham" . mu4e-view-register-msg-as-ham) t)
(defun mu4e-view-register-msg-as-spam (msg)
"Mark message as spam (view mode)."
(interactive)
(let* ((path (shell-quote-argument (mu4e-message-field msg :path)))
(command (format mu4e-register-as-spam-cmd path)))
(shell-command command))
(mu4e-view-mark-for-delete))
(defun mu4e-view-register-msg-as-ham (msg)
"Mark message as ham (view mode)."
(interactive)
(let* ((path (shell-quote-argument(mu4e-message-field msg :path)))
(command (format mu4e-register-as-ham-cmd path)))
(shell-command command))
(mu4e-view-mark-for-something))
;;; end of spam-filtering functions
(provide 'mu4e-contrib)
|