]> git.notmuchmail.org Git - notmuch/blobdiff - contrib/notmuch-pick/notmuch-pick.el
contrib: pick: move the insertion of fields up a level
[notmuch] / contrib / notmuch-pick / notmuch-pick.el
index 5dcc9426b5aa61df1e4c4d7331f504c21034376b..49f298a6e2b9f4367d024e681ad3cc4ec2e49918 100644 (file)
@@ -213,6 +213,17 @@ FUNC."
 
 (defvar notmuch-pick-mode-map
   (let ((map (make-sparse-keymap)))
+    (set-keymap-parent map notmuch-common-keymap)
+    ;; The following override the global keymap.
+    ;; Override because we want to close message pane first.
+    (define-key map "?" (notmuch-pick-close-message-pane-and #'notmuch-help))
+    ;; Override because we first close message pane and then close pick buffer.
+    (define-key map "q" 'notmuch-pick-quit)
+    ;; Override because we close message pane after the search query is entered.
+    (define-key map "s" 'notmuch-pick-to-search)
+    ;; Override because we want to close message pane first.
+    (define-key map "m" (notmuch-pick-close-message-pane-and #'notmuch-mua-new-mail))
+
     (define-key map [mouse-1] 'notmuch-pick-show-message)
     ;; these use notmuch-show functions directly
     (define-key map "|" 'notmuch-show-pipe-message)
@@ -227,20 +238,16 @@ FUNC."
     (define-key map "e" (notmuch-pick-to-message-pane #'notmuch-pick-button-activate))
 
     ;; bindings from show (or elsewhere) but we close the message pane first.
-    (define-key map "m" (notmuch-pick-close-message-pane-and #'notmuch-mua-new-mail))
     (define-key map "f" (notmuch-pick-close-message-pane-and #'notmuch-show-forward-message))
     (define-key map "r" (notmuch-pick-close-message-pane-and #'notmuch-show-reply-sender))
     (define-key map "R" (notmuch-pick-close-message-pane-and #'notmuch-show-reply))
     (define-key map "V" (notmuch-pick-close-message-pane-and #'notmuch-show-view-raw-message))
-    (define-key map "?" (notmuch-pick-close-message-pane-and #'notmuch-help))
 
     ;; The main pick bindings
-    (define-key map "q" 'notmuch-pick-quit)
     (define-key map "x" 'notmuch-pick-quit)
     (define-key map "A" 'notmuch-pick-archive-thread)
     (define-key map "a" 'notmuch-pick-archive-message-then-next)
     (define-key map "=" 'notmuch-pick-refresh-view)
-    (define-key map "s" 'notmuch-pick-to-search)
     (define-key map "z" 'notmuch-pick-to-pick)
     (define-key map "n" 'notmuch-pick-next-matching-message)
     (define-key map "p" 'notmuch-pick-prev-matching-message)
@@ -662,16 +669,19 @@ 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
      ((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))
@@ -679,13 +689,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")
@@ -696,18 +707,20 @@ 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-insert-msg (msg)
   "Insert the message MSG according to notmuch-pick-result-format"
@@ -715,7 +728,7 @@ unchanged ADDRESS if parsing fails."
   ;; 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 (car spec) (cdr spec) msg)))
     (notmuch-pick-set-message-properties msg)
     (notmuch-pick-set-prop :previous-subject previous-subject)
     (insert "\n")))
@@ -808,6 +821,7 @@ Complete list of currently available key bindings:
 
   (interactive)
   (kill-all-local-variables)
+  (setq notmuch-buffer-refresh-function #'notmuch-pick-refresh-view)
   (use-local-map notmuch-pick-mode-map)
   (setq major-mode 'notmuch-pick-mode
        mode-name "notmuch-pick")
@@ -899,7 +913,7 @@ The arguments are:
   BUFFER-NAME: the name of the buffer to show the pick tree. If
       it is nil \"*notmuch-pick\" followed by QUERY is used.
   OPEN-TARGET: If TRUE open the target message in the message pane."
-  (interactive "sNotmuch pick: ")
+  (interactive)
   (if (null query)
       (setq query (notmuch-read-query "Notmuch pick: ")))
   (let ((buffer (get-buffer-create (generate-new-buffer-name