Re: [PATCH v2] emacs: Add support for saved search accelerators

Subject: Re: [PATCH v2] emacs: Add support for saved search accelerators

Date: Thu, 08 May 2014 10:14:47 +0100

To: David Edmondson, notmuch@notmuchmail.org

Cc:

From: Mark Walters


Hi

This version looks good to me.

The only slight query I have is which key to bind it to: Austin used g
in notmuch-go and this uses j. Austin said on irc that he chose g
because it wasn't bound and matched gmail's shortcut.

Personally I like j (as it starts fewer words than g) and given that we
don't match any of gmail's other bindings I don't think there is much
advantage to doing so in this case.

In any case that's all bikeshedding: I like this patch with either
binding.

Best wishes

Mark



On Wed, 07 May 2014, David Edmondson <dme@dme.org> wrote:
> 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

Thread: