]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.el
Hide bodies of message that have already been read.
[notmuch] / notmuch.el
index 00a03c0ed7c1ea979f417ecc8a346b0a064bd2ef..564f47916a5cd77428949816c352d39d6c534490 100644 (file)
@@ -33,6 +33,8 @@
 
 (defvar notmuch-show-mode-map
   (let ((map (make-sparse-keymap)))
+    (define-key map "b" 'notmuch-show-toggle-body-read-visible)
+    (define-key map "h" 'notmuch-show-toggle-headers-visible)
     (define-key map "n" 'notmuch-show-next-message)
     (define-key map "p" 'notmuch-show-previous-message)
     (define-key map "q" 'kill-this-buffer)
   "Keymap for \"notmuch show\" buffers.")
 (fset 'notmuch-show-mode-map notmuch-show-mode-map)
 
-(defvar notmuch-show-message-begin-regexp "\fmessage{")
+(defvar notmuch-show-message-begin-regexp    "\fmessage{")
+(defvar notmuch-show-message-end-regexp      "\fmessage}")
+(defvar notmuch-show-header-begin-regexp     "\fheader{")
+(defvar notmuch-show-header-end-regexp       "\fheader}")
+(defvar notmuch-show-body-begin-regexp       "\fbody{")
+(defvar notmuch-show-body-end-regexp         "\fbody}")
+(defvar notmuch-show-attachment-begin-regexp "\fattachment{")
+(defvar notmuch-show-attachment-end-regexp   "\fattachment}")
+(defvar notmuch-show-part-begin-regexp       "\fpart{")
+(defvar notmuch-show-part-end-regexp         "\fpart}")
+(defvar notmuch-show-marker-regexp "\f\\(message\\|header\\|body\\|attachment\\|part\\)[{}].*$")
+(defvar notmuch-show-headers-visible t)
 
 (defun notmuch-show-next-message ()
   "Advance point to the beginning of the next message in the buffer."
@@ -49,8 +62,7 @@
   ; First, ensure we get off the current message marker
   (if (not (eobp))
       (forward-char))
-  (if (not (re-search-forward notmuch-show-message-begin-regexp nil t))
-      (goto-char (point-max)))
+  (re-search-forward notmuch-show-message-begin-regexp nil t)
   (beginning-of-line)
   (recenter 0))
 
   "Advance point to the beginning of the previous message in the buffer."
   (interactive)
   ; First, ensure we get off the current message marker
-  (if (not (eobp))
-      (forward-char))
-  (if (not (re-search-backward notmuch-show-message-begin-regexp nil t))
-      (goto-char (point-min)))
+  (if (not (bobp))
+      (previous-line))
+  (re-search-backward notmuch-show-message-begin-regexp nil t)
   (beginning-of-line)
   (recenter 0))
 
+(defun notmuch-show-markup-body (unread)
+  (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)
+    ))
+
+(defun notmuch-show-markup-header ()
+  (re-search-forward notmuch-show-header-begin-regexp)
+  (next-line 2)
+  (beginning-of-line)
+  (let ((beg (point)))
+    (re-search-forward notmuch-show-header-end-regexp)
+    (overlay-put (make-overlay beg (match-beginning 0))
+                'invisible 'notmuch-show-header)))
+
+(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)))
+    (goto-char (point-max))))
+
+(defun notmuch-show-hide-markers ()
+  (save-excursion
+    (goto-char (point-min))
+    (while (not (eobp))
+      (if (re-search-forward notmuch-show-marker-regexp nil t)
+         (progn
+           (overlay-put (make-overlay (match-beginning 0) (+ (match-end 0) 1))
+                        'invisible 'notmuch-show-marker))
+       (goto-char (point-max))))))
+
+(defun notmuch-show-markup-messages ()
+  (save-excursion
+    (goto-char (point-min))
+    (while (not (eobp))
+      (notmuch-show-markup-message)))
+  (notmuch-show-hide-markers))
+
+(defun notmuch-show-toggle-headers-visible ()
+  "Toggle visibility of header fields"
+  (interactive)
+  (if notmuch-show-headers-visible
+      (add-to-invisibility-spec 'notmuch-show-header)
+    (remove-from-invisibility-spec 'notmuch-show-header))
+  (set 'notmuch-show-headers-visible (not notmuch-show-headers-visible))
+  ; Need to force the redisplay for some reason
+  (force-window-update)
+  (redisplay t))
+
+(defun notmuch-show-toggle-body-read-visible ()
+  "Toggle visibility of message bodies of read messages"
+  (interactive)
+  (if notmuch-show-body-read-visible
+      (add-to-invisibility-spec 'notmuch-show-body-read)
+    (remove-from-invisibility-spec 'notmuch-show-body-read))
+  (set 'notmuch-show-body-read-visible (not notmuch-show-body-read-visible))
+  ; Need to force the redisplay for some reason
+  (force-window-update)
+  (redisplay t))
+
 ;;;###autoload
 (defun notmuch-show-mode ()
   "Major mode for handling the output of \"notmuch show\""
   (interactive)
   (kill-all-local-variables)
+  (set (make-local-variable 'notmuch-show-headers-visible) t)
+  (notmuch-show-toggle-headers-visible)
+  (set (make-local-variable 'notmuch-show-body-read-visible) t)
+  (notmuch-show-toggle-body-read-visible)
+  (add-to-invisibility-spec 'notmuch-show-marker)
   (use-local-map notmuch-show-mode-map)
   (setq major-mode 'notmuch-show-mode
        mode-name "notmuch-show")
       (goto-char (point-min))
       (save-excursion
        (call-process "notmuch" nil t nil "show" thread-id)
+       (notmuch-show-markup-messages)
        )
       )))