[PATCH] emacs: Add `notmuch-show-elide-same-subject', controlling the appearance of collapsed messages in notmuch-show mode.

David Edmondson dme at dme.org
Fri Nov 5 02:50:15 PDT 2010


If `notmuch-show-elide-same-subject' is set to `t' then collapsed
messages do not show a "Subject:" line if the subject is the same as
that of the previous message.
---
 emacs/notmuch-show.el |   38 ++++++++++++++++++++++++++++----------
 1 files changed, 28 insertions(+), 10 deletions(-)

diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el
index 7ec6aa5..07cf846 100644
--- a/emacs/notmuch-show.el
+++ b/emacs/notmuch-show.el
@@ -58,6 +58,12 @@ any given message."
   :group 'notmuch
   :type 'boolean)
 
+(defcustom notmuch-show-elide-same-subject nil
+  "Do not show the subject of a collapsed message if it is the
+same as that of the previous message."
+  :group 'notmuch
+  :type 'boolean)
+
 (defcustom notmuch-show-relative-dates t
   "Display relative dates in the message summary line."
   :group 'notmuch
@@ -381,17 +387,24 @@ current buffer, if possible."
 (defun notmuch-show-make-symbol (type)
   (make-symbol (concat "notmuch-show-" type)))
 
+(defun notmuch-show-strip-re (string)
+  (replace-regexp-in-string "^\\([Rr]e: *\\)+" "" string))
+
+(defvar notmuch-show-previous-subject "")
+(make-variable-buffer-local 'notmuch-show-previous-subject)
+
 (defun notmuch-show-insert-msg (msg depth)
   "Insert the message MSG at depth DEPTH in the current thread."
-  (let ((headers (plist-get msg :headers))
-	;; Indentation causes the buffer offset of the start/end
-	;; points to move, so we must use markers.
-	message-start message-end
-	content-start content-end
-	headers-start headers-end
-	body-start body-end
-	(headers-invis-spec (notmuch-show-make-symbol "header"))
-	(message-invis-spec (notmuch-show-make-symbol "message")))
+  (let* ((headers (plist-get msg :headers))
+	 ;; Indentation causes the buffer offset of the start/end
+	 ;; points to move, so we must use markers.
+	 message-start message-end
+	 content-start content-end
+	 headers-start headers-end
+	 body-start body-end
+	 (headers-invis-spec (notmuch-show-make-symbol "header"))
+	 (message-invis-spec (notmuch-show-make-symbol "message"))
+	 (bare-subject (notmuch-show-strip-re (plist-get headers :Subject))))
 
     ;; Set `buffer-invisibility-spec' to `nil' (a list), otherwise
     ;; removing items from `buffer-invisibility-spec' (which is what
@@ -428,10 +441,15 @@ current buffer, if possible."
     (insert "\n")
     (save-excursion
       (goto-char content-start)
-      (forward-line 1)
+      (when (and notmuch-show-elide-same-subject
+		 (not (string= notmuch-show-previous-subject
+			       bare-subject)))
+	(forward-line 1))
       (setq headers-start (point-marker)))
     (setq headers-end (point-marker))
 
+    (setq notmuch-show-previous-subject bare-subject)
+
     (setq body-start (point-marker))
     (notmuch-show-insert-body msg (plist-get msg :body) depth)
     ;; Ensure that the body ends with a newline.
-- 
1.7.2.3



More information about the notmuch mailing list