Extended the saved search definition to allow the inclusion of an
accelerator key for the search. Bind 'j' in the common mode map as a
leader for such accelerator keys.
---
 emacs/notmuch-hello.el |  5 ++++-
 emacs/notmuch-lib.el   | 46 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 50 insertions(+), 1 deletion(-)

diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el
index 3de5238..64d5aa1 100644
--- a/emacs/notmuch-hello.el
+++ b/emacs/notmuch-hello.el
@@ -85,6 +85,7 @@ searches so they still work in customize."
                (group :format "%v" :inline t (const :format "  Query: " 
:query) (string :format "%v")))
          (checklist :inline t
                     :format "%v"
+                    (group :format "%v" :inline t (const :format "    Key: " 
:key) (key-sequence :format "%v"))
                     (group :format "%v" :inline t (const :format "Count-Query: 
" :count-query) (string :format "%v"))
                     (group :format "%v" :inline t (const :format "" 
:sort-order)
                            (choice :tag " Sort Order"
@@ -101,6 +102,7 @@ a plist. Supported properties are
 
   :name            Name of the search (required).
   :query           Search to run (required).
+  :key             Optional accelerator key.
   :count-query     Optional extra query to generate the count
                    shown. If not present then the :query property
                    is used.
@@ -551,7 +553,8 @@ with `notmuch-hello-query-counts'."
            (when elem
              (if (> column-indent 0)
                  (widget-insert (make-string column-indent ? )))
-             (let* ((name (plist-get elem :name))
+             (let* ((key (plist-get elem :key))
+                    (name (plist-get elem :name))
                     (query (plist-get elem :query))
                     (oldest-first (case (plist-get elem :sort-order)
                                     (newest-first nil)
diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el
index 2941da3..f8c5f96 100644
--- a/emacs/notmuch-lib.el
+++ b/emacs/notmuch-lib.el
@@ -25,6 +25,10 @@
 (require 'mm-decode)
 (require 'cl)
 
+(declare-function notmuch-search "notmuch" (&optional query oldest-first 
target-thread target-line continuation))
+(declare-function notmuch-saved-search-get "notmuch-hello" (saved-search 
field))
+(defvar notmuch-saved-searches) ;; In `notmuch-hello.el'.
+
 (defvar notmuch-command "notmuch"
   "Command to run the notmuch binary.")
 
@@ -130,6 +134,7 @@ For example, if you wanted to remove an \"inbox\" tag and 
add an
     (define-key map "m" 'notmuch-mua-new-mail)
     (define-key map "=" 'notmuch-refresh-this-buffer)
     (define-key map "G" 'notmuch-poll-and-refresh-this-buffer)
+    (define-key map "j" 'notmuch-jump)
     map)
   "Keymap shared by all notmuch modes.")
 
@@ -845,6 +850,47 @@ status."
 (defvar notmuch-show-process-crypto nil)
 (make-variable-buffer-local 'notmuch-show-process-crypto)
 
+;; Jump key support:
+
+(defvar notmuch-jump-search nil)
+(defun notmuch-jump-map ()
+  (let ((map (make-sparse-keymap))
+       help)
+    (set-keymap-parent map minibuffer-local-map)
+    (suppress-keymap map)
+    (dolist (saved-search notmuch-saved-searches)
+      (let ((key (notmuch-saved-search-get saved-search :key)))
+       (when key
+         (define-key map key `(lambda ()
+                                (interactive)
+                                (setq notmuch-jump-search ',saved-search)
+                                (exit-minibuffer)))
+         (push (format "%s: %s"
+                       (propertize key 'face 'minibuffer-prompt)
+                       (notmuch-saved-search-get saved-search :name))
+               help))))
+    ;; Hitting ? displays a quick hint of the accelerators.
+    (define-key map "?" `(lambda ()
+                          (interactive)
+                          (message "%s"
+                                   (mapconcat #'identity
+                                              ;; Reverse the list so
+                                              ;; that elements appear
+                                              ;; in the same order as
+                                              ;; `notmuch-saved-searches'.
+                                              (reverse ',help)
+                                              " "))))
+    map))
+
+(defun notmuch-jump ()
+  "Read a saved search accelerator key and perform the search."
+  (interactive)
+  (setq notmuch-jump-search nil)
+  (read-from-minibuffer "Jump to saved search: " nil (notmuch-jump-map))
+  (when notmuch-jump-search
+    (notmuch-search (notmuch-saved-search-get notmuch-jump-search :query)
+                   (notmuch-saved-search-get notmuch-jump-search 
:oldest-first))))
+
 (provide 'notmuch-lib)
 
 ;; Local Variables:
-- 
2.0.0.rc0

_______________________________________________
notmuch mailing list
notmuch@notmuchmail.org
http://notmuchmail.org/mailman/listinfo/notmuch

Reply via email to