contrib: pick: allow recursive message field formats
authorMark Walters <markwalters1009@gmail.com>
Mon, 2 Sep 2013 03:28:07 +0000 (04:28 +0100)
committerDavid Bremner <bremner@debian.org>
Sun, 15 Sep 2013 11:58:03 +0000 (08:58 -0300)
Previously, the message format was fixed: each part had to be a
certain width and either left or right justified. This allows the user
to specify that two parts can be variable width but that combined they
should be some fixed width. We do this by allowing the user to set as
a "field" a list of the normal result-format form which is formatted
and then itself inserted according to the format string specified.

This means all existing formats work but allows more general things
too. This will be used in the next patch to allow the user to specify
where the tree box graphics are drawn but allow, e.g., the total width
of the tree box graphics and subject to be specified.

contrib/notmuch-pick/notmuch-pick.el

index 49f298a6e2b9f4367d024e681ad3cc4ec2e49918..98750c0317307a38f0915ccde10163247bdce13b 100644 (file)
@@ -675,6 +675,10 @@ unchanged ADDRESS if parsing fails."
        (match (plist-get msg :match))
        formatted-field)
     (cond
+     ((listp field)
+      (setq formatted-field
+           (format format-string (notmuch-pick-format-field-list field msg))))
+
      ((string-equal field "date")
       (let ((face (if match
                      'notmuch-pick-match-date-face
@@ -722,13 +726,19 @@ unchanged ADDRESS if parsing fails."
                          'face face)))))
     formatted-field))
 
+(defun notmuch-pick-format-field-list (field-list msg)
+  "Format fields of MSG according to FIELD-LIST and return string"
+  (let (result-string)
+    (dolist (spec field-list result-string)
+      (let ((field-string (notmuch-pick-format-field (car spec) (cdr spec) msg)))
+       (setq result-string (concat result-string field-string))))))
+
 (defun notmuch-pick-insert-msg (msg)
   "Insert the message MSG according to notmuch-pick-result-format"
   ;; We need to save the previous subject as it will get overwritten
   ;; by the insert-field calls.
   (let ((previous-subject notmuch-pick-previous-subject))
-    (dolist (spec notmuch-pick-result-format)
-      (insert (notmuch-pick-format-field (car spec) (cdr spec) msg)))
+    (insert (notmuch-pick-format-field-list notmuch-pick-result-format msg))
     (notmuch-pick-set-message-properties msg)
     (notmuch-pick-set-prop :previous-subject previous-subject)
     (insert "\n")))