aboutsummaryrefslogtreecommitdiffhomepage
path: root/emacs
diff options
context:
space:
mode:
authorGravatar Dmitry Kurochkin <dmitry.kurochkin@gmail.com>2012-02-05 11:13:48 +0400
committerGravatar David Bremner <bremner@debian.org>2012-02-08 11:17:45 -0400
commit26d5b0efe4160b789670fbb059bea4630a352212 (patch)
tree76e8486770514199d61a483e72959c84d969ce45 /emacs
parentf643f1bac039a26471d46d8871bb73d9cabe5f7c (diff)
emacs: add "*" binding for notmuch-show view
The patch adds `notmuch-show-tag-all' function bound to "*" in notmuch-show view. The function is similar to the `notmuch-search-tag-all' function for the notmuch-search view: it changes tags for all messages in the current thread.
Diffstat (limited to 'emacs')
-rw-r--r--emacs/notmuch-show.el35
1 files changed, 35 insertions, 0 deletions
diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 48a2a60f..faa9f9b4 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -1084,6 +1084,7 @@ thread id. If a prefix is given, crypto processing is toggled."
(define-key map "c" 'notmuch-show-stash-map)
(define-key map "=" 'notmuch-show-refresh-view)
(define-key map "h" 'notmuch-show-toggle-headers)
+ (define-key map "*" 'notmuch-show-tag-all)
(define-key map "-" 'notmuch-show-remove-tag)
(define-key map "+" 'notmuch-show-add-tag)
(define-key map "x" 'notmuch-show-archive-thread-then-exit)
@@ -1181,6 +1182,15 @@ All currently available key bindings:
(notmuch-show-move-to-message-top)
t))
+(defun notmuch-show-mapc (function)
+ "Iterate through all messages in the current thread with
+`notmuch-show-goto-message-next' and call FUNCTION for side
+effects."
+ (save-excursion
+ (goto-char (point-min))
+ (loop do (funcall function)
+ while (notmuch-show-goto-message-next))))
+
;; Functions relating to the visibility of messages and their
;; components.
@@ -1233,6 +1243,18 @@ Some useful entries are:
"Return the message id of the current message."
(concat "id:\"" (notmuch-show-get-prop :id) "\""))
+(defun notmuch-show-get-messages-ids ()
+ "Return all message ids of messages in the current thread."
+ (let ((message-ids))
+ (notmuch-show-mapc
+ (lambda () (push (notmuch-show-get-message-id) message-ids)))
+ message-ids))
+
+(defun notmuch-show-get-messages-ids-search ()
+ "Return a search string for all message ids of messages in the
+current thread."
+ (mapconcat 'identity (notmuch-show-get-messages-ids) " or "))
+
;; dme: Would it make sense to use a macro for many of these?
(defun notmuch-show-get-filename ()
@@ -1513,6 +1535,19 @@ TAG-CHANGES is a list of tag operations for `notmuch-tag'."
initial-input (notmuch-show-get-message-id))))
(apply 'notmuch-show-tag-message tag-changes)))
+(defun notmuch-show-tag-all (&rest tag-changes)
+ "Change tags for all messages in the current thread.
+
+TAG-CHANGES is a list of tag operations for `notmuch-tag'."
+ (interactive (notmuch-read-tag-changes nil notmuch-show-thread-id))
+ (apply 'notmuch-tag (notmuch-show-get-messages-ids-search) tag-changes)
+ (notmuch-show-mapc
+ (lambda ()
+ (let* ((current-tags (notmuch-show-get-tags))
+ (new-tags (notmuch-update-tags current-tags tag-changes)))
+ (unless (equal current-tags new-tags)
+ (notmuch-show-set-tags new-tags))))))
+
(defun notmuch-show-add-tag ()
"Same as `notmuch-show-tag' but sets initial input to '+'."
(interactive)