From: Dima Kogan <dima@secretsauce.net> --- Hi. I made a few improvements to the emacs UI. This patch allows the user to scroll through the most recent searches with C-up and C-down while in the search box. dima emacs/notmuch-hello.el | 49 +++++++++++++++++++++++++++++++++++++++++------ 1 files changed, 42 insertions(+), 7 deletions(-) diff --git a/emacs/notmuch-hello.el b/emacs/notmuch-hello.el index 916cda1..56f853f 100644 --- a/emacs/notmuch-hello.el +++ b/emacs/notmuch-hello.el @@ -123,6 +123,12 @@ Typically \",\" in the US and UK and \".\" in Europe." (defvar notmuch-hello-recent-searches nil) +(defvar notmuch-hello-cyclerecent-index 0 + "The current index of the most-recent searches" ) + +(defvar notmuch-hello-search-widget nil + "The search widget") + (defun notmuch-hello-remember-search (search) (if (not (member search notmuch-hello-recent-searches)) (push search notmuch-hello-recent-searches)) @@ -148,6 +154,28 @@ Typically \",\" in the US and UK and \".\" in Europe." (match-string 1 search) search)) +(defun notmuch-hello-cyclerecent-next () + "Cycle through the most recently-searched queries, going forwards" + (interactive) + (notmuch-hello-cyclerecent 1)) + +(defun notmuch-hello-cyclerecent-prev () + "Cycle through the most recently-searched queries, going backwards" + (interactive) + (notmuch-hello-cyclerecent -1)) + +(defun notmuch-hello-cyclerecent (d) () + + (when notmuch-hello-recent-searches ; if no recent searches, do nothing + (let ((N (length notmuch-hello-recent-searches))) + (setq notmuch-hello-cyclerecent-index + (% (+ notmuch-hello-cyclerecent-index d N) N))) ; update the index + + (widget-value-set notmuch-hello-search-widget + (nth notmuch-hello-cyclerecent-index notmuch-hello-recent-searches)) + (widget-setup)) +) + (defun notmuch-hello-search (search) (let ((search (notmuch-hello-trim search))) (notmuch-hello-remember-search search) @@ -455,13 +483,19 @@ Complete list of currently available key bindings: (widget-insert "\nSearch: ") (setq notmuch-hello-search-bar-marker (point-marker)) - (widget-create 'editable-field - ;; Leave some space at the start and end of the - ;; search boxes. - :size (max 8 (- (window-width) notmuch-hello-indent - (length "Search: "))) - :action (lambda (widget &rest ignore) - (notmuch-hello-search (widget-value widget)))) + (setq notmuch-hello-search-widget + (widget-create 'editable-field + ;; Leave some space at the start and end of the + ;; search boxes. + :size (max 8 (- (window-width) notmuch-hello-indent + (length "Search: "))) + :action (lambda (widget &rest ignore) + (notmuch-hello-search (widget-value widget))) + :keymap (let ((map (make-sparse-keymap))) + (set-keymap-parent map widget-field-keymap) + (define-key map (kbd "<C-up>") 'notmuch-hello-cyclerecent-prev) + (define-key map (kbd "<C-down>") 'notmuch-hello-cyclerecent-next) + map))) (widget-insert "\n") (when notmuch-hello-recent-searches @@ -535,6 +569,7 @@ Complete list of currently available key bindings: (widget-insert "Type a search query and hit RET to view matching threads.\n") (when notmuch-hello-recent-searches (widget-insert "Hit RET to re-submit a previous search. Edit it first if you like.\n") + (widget-insert "In the search box, C-up/C-down cycles through the recent searches.\n") (widget-insert "Save recent searches with the `save' button.\n")) (when notmuch-saved-searches (widget-insert "Edit saved searches with the `edit' button.\n")) -- 1.7.4.4