]> git.notmuchmail.org Git - notmuch/blobdiff - contrib/notmuch-pick/notmuch-pick.el
contrib: pick: remove unused notmuch-pick-from-hello
[notmuch] / contrib / notmuch-pick / notmuch-pick.el
index 2f20aa7d7cc112dcc7213f5a48ec4ff114b14738..69bea2a45add4ad30a4f61fd7f5556d1230098c9 100644 (file)
 (defcustom notmuch-pick-result-format
   `(("date" . "%12s  ")
     ("authors" . "%-20s")
-    ("subject" . " %-54s ")
+    ((("tree" . "%s")("subject" . "%s")) ." %-54s ")
     ("tags" . "(%s)"))
   "Result formatting for Pick. Supported fields are: date,
-        authors, subject, tags Note: subject includes the tree
-        structure graphics, and the author string should not
-        contain whitespace (put it in the neighbouring fields
-        instead).  For example:
+        authors, subject, tree, tags.  Tree means the thread tree
+        box graphics. The field may also be a list in which case
+        the formatting rules are applied recursively and then the
+        output of all the fields in the list is inserted
+        according to format-string.
+
+Note the author string should not contain
+        whitespace (put it in the neighbouring fields instead).
+        For example:
         (setq notmuch-pick-result-format \(\(\"authors\" . \"%-40s\"\)
                                              \(\"subject\" . \"%s\"\)\)\)"
   :type '(alist :key-type (string) :value-type (string))
   :group 'notmuch-pick
   :group 'notmuch-faces)
 
+(defface notmuch-pick-match-tree-face
+  '((t :inherit default))
+  "Face used in pick mode for the thread tree block graphics in messages matching the query."
+  :group 'notmuch-pick
+  :group 'notmuch-faces)
+
 (defface notmuch-pick-match-tag-face
   '((((class color)
       (background dark))
   :group 'notmuch-pick
   :group 'notmuch-faces)
 
+(defface notmuch-pick-no-match-tree-face
+  '((t (:foreground "gray")))
+  "Face used in pick mode for the thread tree block graphics in messages matching the query."
+  :group 'notmuch-pick
+  :group 'notmuch-faces)
+
 (defface notmuch-pick-no-match-author-face
   '((t (:foreground "gray")))
   "Face used in pick mode for the date in messages matching the query."
@@ -411,17 +428,6 @@ Does NOT change the database."
     (notmuch-pick-close-message-window)
     (notmuch-pick query)))
 
-;; This function should be in notmuch-hello.el but we are trying to
-;; minimise impact on the rest of the codebase.
-(defun notmuch-pick-from-hello (&optional search)
-  "Run a query and display results in experimental notmuch-pick mode"
-  (interactive)
-  (unless (null search)
-    (setq search (notmuch-hello-trim search))
-    (let ((history-delete-duplicates t))
-      (add-to-history 'notmuch-search-history search)))
-  (notmuch-pick search))
-
 ;; This function should be in notmuch-show.el but be we trying to
 ;; minimise impact on the rest of the codebase.
 (defun notmuch-pick-from-show-current-query ()
@@ -669,30 +675,46 @@ 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")
+     ((string-equal field "tree")
       (let ((tree-status (plist-get msg :tree-status))
-           (bare-subject (notmuch-show-strip-re (plist-get headers :Subject)))
+           (face (if match
+                     'notmuch-pick-match-tree-face
+                   'notmuch-pick-no-match-tree-face)))
+
+       (setq formatted-field
+             (propertize (format format-string
+                                 (mapconcat #'identity (reverse tree-status) ""))
+                         'face face))))
+
+     ((string-equal field "subject")
+      (let ((bare-subject (notmuch-show-strip-re (plist-get headers :Subject)))
            (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
+                                 (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 +725,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")))
@@ -925,12 +955,10 @@ The arguments are:
 
 
 ;; Set up key bindings from the rest of notmuch.
-(define-key 'notmuch-search-mode-map "z" 'notmuch-pick)
-(define-key 'notmuch-search-mode-map "Z" 'notmuch-pick-from-search-current-query)
-(define-key 'notmuch-search-mode-map (kbd "M-RET") 'notmuch-pick-from-search-thread)
-(define-key 'notmuch-hello-mode-map "z" 'notmuch-pick-from-hello)
-(define-key 'notmuch-show-mode-map "z" 'notmuch-pick)
-(define-key 'notmuch-show-mode-map "Z" 'notmuch-pick-from-show-current-query)
+(define-key notmuch-common-keymap "z" 'notmuch-pick)
+(define-key notmuch-search-mode-map "Z" 'notmuch-pick-from-search-current-query)
+(define-key notmuch-search-mode-map (kbd "M-RET") 'notmuch-pick-from-search-thread)
+(define-key notmuch-show-mode-map "Z" 'notmuch-pick-from-show-current-query)
 (notmuch-pick-setup-show-out)
 (message "Initialised notmuch-pick")