]> git.notmuchmail.org Git - notmuch/blobdiff - contrib/notmuch-pick/notmuch-pick.el
contrib: pick: allow recursive message field formats
[notmuch] / contrib / notmuch-pick / notmuch-pick.el
index 2f20aa7d7cc112dcc7213f5a48ec4ff114b14738..98750c0317307a38f0915ccde10163247bdce13b 100644 (file)
@@ -669,16 +669,23 @@ unchanged ADDRESS if parsing fails."
     ;; If we have a name return that otherwise return the address.
     (or p-name p-address)))
 
-(defun notmuch-pick-insert-field (field format-string msg)
+(defun notmuch-pick-format-field (field format-string msg)
+  "Format a FIELD of MSG according to FORMAT-STRING and return string"
   (let* ((headers (plist-get msg :headers))
-       (match (plist-get msg :match)))
+       (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
                    'notmuch-pick-no-match-date-face)))
-       (insert (propertize (format format-string (plist-get msg :date_relative))
-                           'face face))))
+       (setq formatted-field
+             (propertize (format format-string (plist-get msg :date_relative))
+                         'face face))))
 
      ((string-equal field "subject")
       (let ((tree-status (plist-get msg :tree-status))
@@ -686,13 +693,14 @@ unchanged ADDRESS if parsing fails."
            (face (if match
                      'notmuch-pick-match-subject-face
                    'notmuch-pick-no-match-subject-face)))
-       (insert (propertize (format format-string
-                                   (concat
-                                    (mapconcat #'identity (reverse tree-status) "")
-                                    (if (string= notmuch-pick-previous-subject bare-subject)
-                                        " ..."
-                                      bare-subject)))
-                           'face face))
+       (setq formatted-field
+             (propertize (format format-string
+                                 (concat
+                                  (mapconcat #'identity (reverse tree-status) "")
+                                  (if (string= notmuch-pick-previous-subject bare-subject)
+                                      " ..."
+                                    bare-subject)))
+                         'face face))
        (setq notmuch-pick-previous-subject bare-subject)))
 
      ((string-equal field "authors")
@@ -703,26 +711,34 @@ unchanged ADDRESS if parsing fails."
                    'notmuch-pick-no-match-author-face)))
        (when (> (length author) len)
          (setq author (substring author 0 len)))
-       (insert (propertize (format format-string author)
-                           'face face))))
+       (setq formatted-field
+             (propertize (format format-string author)
+                         'face face))))
 
      ((string-equal field "tags")
       (let ((tags (plist-get msg :tags))
            (face (if match
                          'notmuch-pick-match-tag-face
                        'notmuch-pick-no-match-tag-face)))
-       (when tags
-         (insert (propertize (format format-string
-                                     (mapconcat #'identity tags ", "))
-                             'face face))))))))
+       (setq formatted-field
+             (propertize (format format-string
+                                 (mapconcat #'identity tags ", "))
+                         '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)
-      (notmuch-pick-insert-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")))