]> git.notmuchmail.org Git - notmuch/blobdiff - notmuch.el
Hide bodies of message that have already been read.
[notmuch] / notmuch.el
index e98a30850fdb95fc35a33e0e51ccd1050e37993b..564f47916a5cd77428949816c352d39d6c534490 100644 (file)
@@ -33,6 +33,7 @@
 
 (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)
   "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-end-regexp   "\fmessage}")
-(defvar notmuch-show-header-begin-regexp  "\fheader{")
-(defvar notmuch-show-header-end-regexp    "\fheader}")
-
+(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 ()
@@ -55,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-this-header ()
-  (if (re-search-forward notmuch-show-header-begin-regexp nil t)
+(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
-       (overlay-put (make-overlay (match-beginning 0) (+ (match-end 0) 1))
-                    'invisible 'notmuch-show-marker)
-       (next-line 1)
-       (beginning-of-line)
-       (let ((beg (point)))
-         (if (re-search-forward notmuch-show-header-end-regexp nil t)
-             (progn
-               (overlay-put (make-overlay beg (match-beginning 0))
-                            'invisible 'notmuch-show-header)
-               (overlay-put (make-overlay (match-beginning 0) (+ (match-end 0) 1))
-                            'invisible 'notmuch-show-marker)))))
+       (let ((unread (looking-at ".*unread$")))
+         (notmuch-show-markup-header)
+         (notmuch-show-markup-body unread)))
     (goto-char (point-max))))
 
-(defun notmuch-show-markup-headers ()
+(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-this-header))))
+      (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
-      (progn
-       (add-to-invisibility-spec 'notmuch-show-header)
-       (set 'notmuch-show-headers-visible nil)
-       ; Need to force the redisplay for some reason
-       (force-window-update)
-       (redisplay t))
-    (remove-from-invisibility-spec 'notmuch-show-header)
-    (set 'notmuch-show-headers-visible t)
-    (force-window-update)
-    (redisplay t)))
+      (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 ()
   (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
       (goto-char (point-min))
       (save-excursion
        (call-process "notmuch" nil t nil "show" thread-id)
-       (notmuch-show-markup-headers)
+       (notmuch-show-markup-messages)
        )
       )))