emacs: Record part p-list in a text property
authorAustin Clements <amdragon@MIT.EDU>
Thu, 30 May 2013 01:13:45 +0000 (21:13 -0400)
committerDavid Bremner <bremner@debian.org>
Sat, 1 Jun 2013 01:00:52 +0000 (22:00 -0300)
This is similar to what we already do with the message p-list, though
we apply the part's text property to the whole part's text, in
contrast with the message p-list, which is (rather obscurely) only
applied to the first character.

emacs/notmuch-lib.el
emacs/notmuch-show.el

index 59b1ce3ffecfaf1e310ac3667446e93cc260d39f..7c6cf61ac53ff498706cd3edf10514aa88cc07de 100644 (file)
@@ -360,6 +360,18 @@ OBJECT."
    below
    string))
 
+(defun notmuch-map-text-property (start end prop func &optional object)
+  "Transform text property PROP using FUNC.
+
+Applies FUNC to each distinct value of the text property PROP
+between START and END of OBJECT, setting PROP to the value
+returned by FUNC."
+  (while (< start end)
+    (let ((value (get-text-property start prop object))
+         (next (next-single-property-change start prop object end)))
+      (put-text-property start next prop (funcall func value) object)
+      (setq start next))))
+
 (defun notmuch-logged-error (msg &optional extra)
   "Log MSG and EXTRA to *Notmuch errors* and signal MSG.
 
index a080134ff7e5dbea69528267c277dad6fef062fd..e84e1baf03d0a94fb7d121bbffd51313cd891166 100644 (file)
@@ -900,7 +900,17 @@ If HIDE is non-nil then initially hide this part."
     ;; Ensure that the part ends with a carriage return.
     (unless (bolp)
       (insert "\n"))
-    (notmuch-show-create-part-overlays msg beg (point) hide)))
+    (notmuch-show-create-part-overlays msg beg (point) hide)
+    ;; Record part information.  Since we already inserted subparts,
+    ;; don't override existing :notmuch-part properties.
+    (notmuch-map-text-property beg (point) :notmuch-part
+                              (lambda (v) (or v part)))
+    ;; Make :notmuch-part front sticky and rear non-sticky so it stays
+    ;; applied to the beginning of each line when we indent the message.
+    (notmuch-map-text-property beg (point) 'front-sticky
+                              (lambda (v) (pushnew :notmuch-part v)))
+    (notmuch-map-text-property beg (point) 'rear-nonsticky
+                              (lambda (v) (pushnew :notmuch-part v)))))
 
 (defun notmuch-show-insert-body (msg body depth)
   "Insert the body BODY at depth DEPTH in the current thread."
@@ -1404,6 +1414,14 @@ Some useful entries are:
     (notmuch-show-move-to-message-top)
     (get-text-property (point) :notmuch-message-properties)))
 
+(defun notmuch-show-get-part-properties ()
+  "Return the properties of the innermost part containing point.
+
+This is the part property list retrieved from the CLI.  Signals
+an error if there is no part containing point."
+  (or (get-text-property (point) :notmuch-part)
+      (error "No message part here")))
+
 (defun notmuch-show-set-prop (prop val &optional props)
   (let ((inhibit-read-only t)
        (props (or props