aboutsummaryrefslogtreecommitdiffhomepage
path: root/notmuch.el
diff options
context:
space:
mode:
authorGravatar Carl Worth <cworth@cworth.org>2009-11-03 12:54:10 -0800
committerGravatar Carl Worth <cworth@cworth.org>2009-11-03 12:54:10 -0800
commit0ceef70efdfaa082506e5298c0a031e626d83ea9 (patch)
tree82a4161f5777e79badfa81b51c7f51e2a70f5c1b /notmuch.el
parent02aa1391beae37e1c4641a9543871d96afdae1bb (diff)
notmuch.el: Add + and - bindings to add/remove tags from messages.
This is in notmuch-show mode rather than in notmuch-search mode, (where we had + and - working already). This gives the same visual feedback as in notmuch-search-mode, (the tags are manipulated first in the database and then the list of tags in the buffer is updated).
Diffstat (limited to 'notmuch.el')
-rw-r--r--notmuch.el36
1 files changed, 35 insertions, 1 deletions
diff --git a/notmuch.el b/notmuch.el
index a7e334e4..0863c6b7 100644
--- a/notmuch.el
+++ b/notmuch.el
@@ -48,6 +48,8 @@
(define-key map "q" 'kill-this-buffer)
(define-key map "s" 'notmuch-show-toggle-signatures-visible)
(define-key map "x" 'kill-this-buffer)
+ (define-key map "+" 'notmuch-show-add-tag)
+ (define-key map "-" 'notmuch-show-remove-tag)
map)
"Keymap for \"notmuch show\" buffers.")
(fset 'notmuch-show-mode-map notmuch-show-mode-map)
@@ -65,6 +67,7 @@
(defvar notmuch-show-marker-regexp " \\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$")
(defvar notmuch-show-id-regexp "ID: \\([^ ]*\\)")
+(defvar notmuch-show-tags-regexp "(\\([^)]*\\))$")
(defun notmuch-show-get-message-id ()
(save-excursion
@@ -74,12 +77,43 @@
(re-search-forward notmuch-show-id-regexp)
(buffer-substring (match-beginning 1) (match-end 1))))
+(defun notmuch-show-set-tags (tags)
+ (save-excursion
+ (beginning-of-line)
+ (if (not (looking-at notmuch-show-message-begin-regexp))
+ (re-search-backward notmuch-show-message-begin-regexp))
+ (re-search-forward notmuch-show-tags-regexp)
+ (let ((inhibit-read-only t)
+ (beg (match-beginning 1))
+ (end (match-end 1)))
+ (delete-region beg end)
+ (goto-char beg)
+ (insert (mapconcat 'identity tags " ")))))
+
+(defun notmuch-show-get-tags ()
+ (save-excursion
+ (beginning-of-line)
+ (if (not (looking-at notmuch-show-message-begin-regexp))
+ (re-search-backward notmuch-show-message-begin-regexp))
+ (re-search-forward notmuch-show-tags-regexp)
+ (split-string (buffer-substring (match-beginning 1) (match-end 1)))))
+
+(defun notmuch-show-add-tag (tag)
+ (interactive "sTag to add: ")
+ (notmuch-call-notmuch-process "tag" (concat "+" tag) (concat "id:" (notmuch-show-get-message-id)))
+ (notmuch-show-set-tags (delete-dups (sort (cons tag (notmuch-show-get-tags)) 'string<))))
+
+(defun notmuch-show-remove-tag (tag)
+ (interactive "sTag to remove: ")
+ (notmuch-call-notmuch-process "tag" (concat "-" tag) (concat "id:" (notmuch-show-get-message-id)))
+ (notmuch-show-set-tags (delete tag (notmuch-show-get-tags))))
+
(defun notmuch-show-next-message ()
"Advance point to the beginning of the next message in the buffer.
Before moving, also remove the \"unread\" tag from the current message."
(interactive)
- (notmuch-call-notmuch-process "tag" "-unread" (concat "id:" (notmuch-show-get-message-id)))
+ (notmuch-show-remove-tag "unread")
; First, ensure we get off the current message marker
(if (not (eobp))
(forward-char))