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).
This commit is contained in:
Carl Worth 2009-11-03 12:54:10 -08:00
parent 02aa1391be
commit 0ceef70efd

View file

@ -48,6 +48,8 @@
(define-key map "q" 'kill-this-buffer) (define-key map "q" 'kill-this-buffer)
(define-key map "s" 'notmuch-show-toggle-signatures-visible) (define-key map "s" 'notmuch-show-toggle-signatures-visible)
(define-key map "x" 'kill-this-buffer) (define-key map "x" 'kill-this-buffer)
(define-key map "+" 'notmuch-show-add-tag)
(define-key map "-" 'notmuch-show-remove-tag)
map) map)
"Keymap for \"notmuch show\" buffers.") "Keymap for \"notmuch show\" buffers.")
(fset 'notmuch-show-mode-map notmuch-show-mode-map) (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-marker-regexp " \\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$")
(defvar notmuch-show-id-regexp "ID: \\([^ ]*\\)") (defvar notmuch-show-id-regexp "ID: \\([^ ]*\\)")
(defvar notmuch-show-tags-regexp "(\\([^)]*\\))$")
(defun notmuch-show-get-message-id () (defun notmuch-show-get-message-id ()
(save-excursion (save-excursion
@ -74,12 +77,43 @@
(re-search-forward notmuch-show-id-regexp) (re-search-forward notmuch-show-id-regexp)
(buffer-substring (match-beginning 1) (match-end 1)))) (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 () (defun notmuch-show-next-message ()
"Advance point to the beginning of the next message in the buffer. "Advance point to the beginning of the next message in the buffer.
Before moving, also remove the \"unread\" tag from the current message." Before moving, also remove the \"unread\" tag from the current message."
(interactive) (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 ; First, ensure we get off the current message marker
(if (not (eobp)) (if (not (eobp))
(forward-char)) (forward-char))