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
| | ;;; notmuch-message.el --- message-mode functions specific to notmuch
;;
;; Copyright © Jesse Rosenthal
;;
;; This file is part of Notmuch.
;;
;; Notmuch 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.
;;
;; Notmuch 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 Notmuch. If not, see <http://www.gnu.org/licenses/>.
;;
;; Authors: Jesse Rosenthal <jrosenthal@jhu.edu>
;;; Code:
(require 'message)
(require 'notmuch-tag)
(require 'notmuch-mua)
(declare-function notmuch-show-get-message-id "notmuch-show" (&optional bare))
(defcustom notmuch-message-replied-tags '("+replied")
"List of tag changes to apply to a message when it has been replied to.
Tags starting with \"+\" (or not starting with either \"+\" or
\"-\") in the list will be added, and tags starting with \"-\"
will be removed from the message being replied to.
For example, if you wanted to add a \"replied\" tag and remove
the \"inbox\" and \"todo\" tags, you would set:
(\"+replied\" \"-inbox\" \"-todo\"\)"
:type '(repeat string)
:group 'notmuch-send)
(defcustom notmuch-message-draft-tags '("+draft")
"List of tags changes to apply to a draft message when it is saved in the database.
Tags starting with \"+\" (or not starting with either \"+\" or
\"-\") in the list will be added, and tags starting with \"-\"
will be removed from the message being stored.
For example, if you wanted to give the message a \"draft\" tag
but not the (normally added by default) \"inbox\" tag, you would
set:
(\"+draft\" \"-inbox\")"
:type '(repeat string)
:group 'notmuch-send)
(defcustom notmuch-message-draft-folder "drafts"
"Folder to save draft messages in.
This should be specified relative to the root of the notmuch
database. It will be created if necessary."
:type 'string
:group 'notmuch-send)
(defun notmuch-message-mark-replied ()
;; get the in-reply-to header and parse it for the message id.
(let ((rep (mail-header-parse-addresses (message-field-value "In-Reply-To"))))
(when (and notmuch-message-replied-tags rep)
(notmuch-tag (notmuch-id-to-query (car (car rep)))
(notmuch-tag-change-list notmuch-message-replied-tags)))))
(defun notmuch-message-postpone ()
"Save the current draft message in the notmuch database.
This saves the current message in the database with tags
`notmuch-message-draft-tags` (in addition to any default tags
applied to newly inserted messages)."
;; This is taken from message-do-fcc but modified for our needs. In
;; particular we don't want to process other fcc lines, nor remove
;; them. Note some of the following may not be needed -- I tried to
;; stay close to the original function.
(interactive)
(let ((case-fold-search t)
(buf (current-buffer))
(mml-externalize-attachments nil))
(with-current-buffer (get-buffer-create " *message temp*")
(erase-buffer)
(insert-buffer-substring buf)
(message-encode-message-body)
(save-restriction
(message-narrow-to-headers)
(let ((mail-parse-charset message-default-charset)
(rfc2047-header-encoding-alist
(cons '("Newsgroups" . default)
rfc2047-header-encoding-alist)))
(mail-encode-encoded-word-buffer)))
(goto-char (point-min))
(when (re-search-forward
(concat "^" (regexp-quote mail-header-separator) "$")
nil t)
(replace-match "" t t ))
;; Unless the user has entered a message-id manually the message
;; does not have one -- thus notmuch will use the sha1 of the
;; message. Hence we should only get a collision if the message
;; is identical to a previous draft. In this case we should
;; remove the deleted tag, but it is not clear howto.
(apply 'notmuch-call-notmuch-process :stdin-string (buffer-string)
"insert" "--create-folder"
(concat "--folder=" notmuch-message-draft-folder)
notmuch-message-draft-tags)))
;; The function notmuch-call-notmuch-process signals an error on failure, so
;; to get to this point it must have succeeded.
(set-buffer-modified-p nil)
(kill-buffer))
(defun notmuch-message-resume (&optional id)
"View the original source of the current message."
(interactive)
(let* ((id (or id (notmuch-show-get-message-id)))
(buf (get-buffer-create (concat "*notmuch-draft-" id "*")))
(inhibit-read-only t))
(switch-to-buffer buf)
(setq buffer-read-only nil)
(erase-buffer)
(let ((coding-system-for-read 'no-conversion))
(call-process notmuch-command nil t nil "show" "--format=raw" id))
(mime-to-mml)
(goto-char (point-min))
(when (re-search-forward "^$" nil t)
(replace-match mail-header-separator t t))
(notmuch-message-mode)
(set-buffer-modified-p t)
;; Delete the message (since we can't do this yet just tag it deleted).
(notmuch-tag id '("+deleted"))))
(add-hook 'message-send-hook 'notmuch-message-mark-replied)
(provide 'notmuch-message)
;;; notmuch-message.el ends here
|