From 602e857dc3b7a475ae9d21c5b29f402a40ce05e7 Mon Sep 17 00:00:00 2001 From: djcb Date: Sat, 5 May 2012 11:07:58 +0300 Subject: [PATCH] * refactor search / search-editing a bit --- emacs/mu4e-headers.el | 128 +++++++++++++++++++++--------------------- emacs/mu4e-main.el | 2 +- emacs/mu4e-view.el | 4 +- 3 files changed, 67 insertions(+), 67 deletions(-) diff --git a/emacs/mu4e-headers.el b/emacs/mu4e-headers.el index 3fe9a927..3bf041ab 100644 --- a/emacs/mu4e-headers.el +++ b/emacs/mu4e-headers.el @@ -106,42 +106,6 @@ are of the form: (erase-buffer) (mu4e~mark-clear))))) - -(defvar mu4e~headers-search-hist nil - "History list of searches.") - - -(defun mu4e-headers-search (expr search-all) - "Search in the mu database for EXPR, and switch to the output -buffer for the results. If SEARCH-ALL is non-nil return all -results, otherwise, limit number of results to -`mu4e-search-results-limit'. This is an interactive function which -ask user for EXPR, and SEARCH-ALL as prefix-argument." - (interactive - (let ((expr (read-string - (mu4e-format "Search for: ") - nil - 'mu4e~headers-search-hist nil t)) - (search-all current-prefix-arg)) - (list expr search-all))) - (let ((buf (get-buffer-create mu4e~headers-buffer-name)) - (inhibit-read-only t)) - (mu4e-mark-handle-when-leaving) - (with-current-buffer buf - (mu4e-headers-mode) - (setq - global-mode-string (propertize expr 'face 'mu4e-title-face) - mu4e~headers-query expr - mu4e~headers-buffer buf - mode-name "mu4e-headers")) - (switch-to-buffer buf) - (mu4e~proc-find - (replace-regexp-in-string "\"" "\\\\\"" expr) ;; escape "\" - (unless search-all mu4e-search-results-limit)) - ;;; when we're starting a new search, we also kill the - ;;; view buffer, if any - (mu4e-view-kill-buffer-and-window))) - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; handler functions ;; @@ -264,7 +228,7 @@ if provided, or at the end of the buffer otherwise." (from (and from-lst (cdar from-lst)))) (if (and from (string-match mu4e-user-mail-address-regexp from)) - (concat (or mu4e~headers-from-or-to-prefix "") + (concat (or mu4e~headers-from-or-to-prefix "") (mu4e~headers-contact-str (plist-get msg :to))) (mu4e~headers-contact-str from-lst)))) (:date (format-time-string mu4e-headers-date-format val)) @@ -324,15 +288,15 @@ after the end of the search results." (defun mu4e~headers-mark-read()(interactive)(mu4e-headers-mark-and-next 'read)) (defun mu4e~headers-mark-unread()(interactive)(mu4e-headers-mark-and-next 'unread)) - + (setq mu4e-headers-mode-map (let ((map (make-sparse-keymap))) (define-key map "s" 'mu4e-headers-search) (define-key map "b" 'mu4e-headers-search-bookmark) - (define-key map "B" 'mu4e-headers-search-bookmark-edit-first) - + (define-key map "B" 'mu4e-headers-search-bookmark-edit) + (define-key map "q" 'mu4e~headers-kill-buffer-and-window) (define-key map "z" 'mu4e~headers-kill-buffer-and-window) @@ -441,7 +405,7 @@ after the end of the search results." "Major mode for displaying mu4e search results. \\{mu4e-headers-mode-map}." (use-local-map mu4e-headers-mode-map) - + (make-local-variable 'mu4e~headers-query) (make-local-variable 'mu4e~headers-proc) (make-local-variable 'mu4e~highlighted-docid) @@ -608,6 +572,27 @@ non-nill, don't raise an error when the docid is not found." (error "Cannot find message with docid %S" docid))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; +(defun mu4e~headers-search-execute (expr search-all) + "Search in the mu database for EXPR, and switch to the output +buffer for the results. If SEARCH-ALL is non-nil return all +results, otherwise, limit number of results to +`mu4e-search-results-limit'." + (let ((buf (get-buffer-create mu4e~headers-buffer-name)) + (inhibit-read-only t)) + (with-current-buffer buf + (mu4e-headers-mode) + (setq + global-mode-string (propertize expr 'face 'mu4e-title-face) + mu4e~headers-query expr + mu4e~headers-buffer buf + mode-name "mu4e-headers")) + (switch-to-buffer buf) + (mu4e~proc-find + (replace-regexp-in-string "\"" "\\\\\"" expr) ;; escape "\" + (unless search-all mu4e-search-results-limit)) +;;; when we're starting a new search, we also kill the +;;; view buffer, if any + (mu4e-view-kill-buffer-and-window))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; search-based marking @@ -713,7 +698,7 @@ limited to the message at point and its descendants." (setq last-marked-point (point))))))) (when last-marked-point (goto-char last-marked-point) - (mu4e-headers-next)))) + (mu4e-headers-next)))) (defun mu4e-headers-mark-subthread () "Like `mu4e-mark-thread', but only for a sub-thread." @@ -726,31 +711,46 @@ limited to the message at point and its descendants." ;;; interactive functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; - (defun mu4e-headers-search-bookmark (query search-all) - "Search using some bookmarked query. when search-all (prefix -argument) is non-nil, show /all/ results, otherwise, limit to up to -`mu4e-search-results-limit'." - (interactive - (let ((query (mu4e-ask-bookmark "Bookmark: "))) - (list query current-prefix-arg))) - (when query - (mu4e-headers-search query search-all))) +(defvar mu4e~headers-search-hist nil + "History list of searches.") -(defvar mu4e~headers-bookmark-hist nil - "History list for bookmarks used.") +(defun mu4e-headers-search (&optional expr search-all prompt edit) + "Search in the mu database for EXPR, and switch to the output +buffer for the results. If SEARCH-ALL is non-nil return all +results, otherwise, limit number of results to +`mu4e-search-results-limit'. This is an interactive function which +ask user for EXPR, and SEARCH-ALL as prefix-argument. PROMPT, if +non-nil, is the prompt used by this function (default is \"Search +for:\"). If EDIT is non-nil, instead of executing the query for +EXPR, let the user edit the query before executing it." + (interactive) + (let* ((prompt (mu4e-format (or prompt "Search for: "))) + (expr + (if edit + (read-string prompt expr) + (or expr + (read-string prompt nil 'mu4e~headers-search-hist))))) + (mu4e-mark-handle-when-leaving) + (mu4e~headers-search-execute expr (or search-all current-prefix-arg)))) -(defun mu4e-headers-search-bookmark-edit-first (expr search-all) - "Search using some bookmarked query, but allow for editing the -bookmark before submitting it. With C-u prefix, show /all/ results, -otherwise, limit to up to `mu4e-search-results-limit'." - (interactive - (list (read-string - (concat (or (mu4e-ask-bookmark "Edit bookmark: ") "") " ") - 'mu4e~headers-bookmark-hist) - current-prefix-arg)) - (when expr - (mu4e-headers-search expr search-all))) +(defun mu4e-headers-search-bookmark (&optional expr search-all edit) + "Search using some bookmarked query EXPR. When SEARCH-ALL (prefix +argument) is non-nil, show *all* results, otherwise, limit to up to +`mu4e-search-results-limit'. If EDIT is non-nil, let the user edit +the bookmark before starting the search." + (interactive) + (let ((expr + (or expr + (mu4e-ask-bookmark (if edit "Select bookmark: " "Bookmark: "))))) + (mu4e-headers-search expr (or search-all current-prefix-arg) + (when edit "Edit bookmark: ") edit))) + +(defun mu4e-headers-search-bookmark-edit () + "Edit an existing bookmark before executing it." + (interactive) + (mu4e-headers-search-bookmark nil current-prefix-arg t)) + (defun mu4e-headers-view-message () "View message at point. If there's an existing window for the diff --git a/emacs/mu4e-main.el b/emacs/mu4e-main.el index 9012e31e..6b403abf 100644 --- a/emacs/mu4e-main.el +++ b/emacs/mu4e-main.el @@ -33,7 +33,7 @@ (let ((map (make-sparse-keymap))) (define-key map "b" 'mu4e-headers-search-bookmark) - (define-key map "B" 'mu4e-headers-search-bookmark-edit-first) + (define-key map "B" 'mu4e-headers-search-bookmark-edit) (define-key map "s" 'mu4e-headers-search) (define-key map "q" 'mu4e-quit) diff --git a/emacs/mu4e-view.el b/emacs/mu4e-view.el index bc7abbde..a89b08cf 100644 --- a/emacs/mu4e-view.el +++ b/emacs/mu4e-view.el @@ -312,8 +312,8 @@ is nil, and otherwise open it." (define-key map "s" 'mu4e-headers-search) - (define-key map "b" 'mu4e-headers-search-bookmark) - (define-key map "B" 'mu4e-headers-search-bookmark-edit-first) + (define-key map "b" 'mu4e-headers-search-bookmark) + (define-key map "B" 'mu4e-headers-search-bookmark-edit) (define-key map "%" 'mu4e-view-mark-matches) (define-key map "t" 'mu4e-view-mark-subthread)