]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.el
notmuch show: Remove custom "unread" hack, (printing tag in two locations).
[notmuch] / notmuch.el
index 545b09c68b8c9cf1938ff025ffa0282f90adc699..89089c53e7c40f032330a28bbc871aa7911376fa 100644 (file)
@@ -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)
@@ -64,7 +66,8 @@
 (defvar notmuch-show-part-end-regexp         "\fpart}")
 (defvar notmuch-show-marker-regexp "\f\\(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 ()
   (save-excursion
     (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))
@@ -144,17 +178,17 @@ Before moving, also remove the \"unread\" tag from the current message."
            (goto-char end)))
       (next-line))))
 
-(defun notmuch-show-markup-body (unread)
+(defun notmuch-show-markup-body ()
   (re-search-forward notmuch-show-body-begin-regexp)
   (next-line 1)
   (beginning-of-line)
   (let ((beg (point)))
     (re-search-forward notmuch-show-body-end-regexp)
-    (if (not unread)
-       (overlay-put (make-overlay beg (match-beginning 0))
-                    'invisible 'notmuch-show-body-read))
-    (notmuch-show-markup-citations-region beg (point))
-    ))
+    (let ((end (match-beginning 0)))
+      (if (not (member "unread" (notmuch-show-get-tags)))
+         (overlay-put (make-overlay beg end)
+                      'invisible 'notmuch-show-body-read))
+      (notmuch-show-markup-citations-region beg end))))
 
 (defun notmuch-show-markup-header ()
   (re-search-forward notmuch-show-header-begin-regexp)
@@ -168,9 +202,8 @@ Before moving, also remove the \"unread\" tag from the current message."
 (defun notmuch-show-markup-message ()
   (if (re-search-forward notmuch-show-message-begin-regexp nil t)
       (progn
-       (let ((unread (looking-at ".*unread$")))
-         (notmuch-show-markup-header)
-         (notmuch-show-markup-body unread)))
+       (notmuch-show-markup-header)
+       (notmuch-show-markup-body))
     (goto-char (point-max))))
 
 (defun notmuch-show-hide-markers ()
@@ -286,6 +319,7 @@ Before moving, also remove the \"unread\" tag from the current message."
     (define-key map "-" 'notmuch-search-remove-tag)
     (define-key map "<" 'beginning-of-buffer)
     (define-key map ">" 'notmuch-search-goto-last-thread)
+    (define-key map "=" 'notmuch-search-refresh-view)
     (define-key map "\M->" 'notmuch-search-goto-last-thread)
     map)
   "Keymap for \"notmuch search\" buffers.")
@@ -415,6 +449,25 @@ Before moving, also remove the \"unread\" tag from the current message."
          )
        ))))
 
+(defun notmuch-search-refresh-view ()
+  "Refresh the current view.
+
+Kills the current buffer and runs a new search with the same
+query string as the current search. If the current thread is in
+the new search results, then point will be placed on the same
+thread. Otherwise, point will be moved to attempt to be in the
+same relative position within the new buffer."
+  (interactive)
+  (let ((here (point))
+       (thread (notmuch-search-find-thread-id))
+       (query notmuch-search-query-string))
+    (kill-this-buffer)
+    (notmuch-search query)
+    (goto-char (point-min))
+    (if (re-search-forward (concat "^" thread) nil t)
+       (beginning-of-line)
+      (goto-char here))))
+
 (defun notmuch-search-filter (query)
   "Run \"notmuch search\" to refine the current search results.