mirror of https://github.com/djcb/mu.git
* refactor search / search-editing a bit
This commit is contained in:
parent
c7c823d0ce
commit
602e857dc3
|
@ -106,42 +106,6 @@ are of the form:
|
||||||
(erase-buffer)
|
(erase-buffer)
|
||||||
(mu4e~mark-clear)))))
|
(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
|
;; handler functions
|
||||||
;;
|
;;
|
||||||
|
@ -264,7 +228,7 @@ if provided, or at the end of the buffer otherwise."
|
||||||
(from (and from-lst (cdar from-lst))))
|
(from (and from-lst (cdar from-lst))))
|
||||||
(if (and from (string-match
|
(if (and from (string-match
|
||||||
mu4e-user-mail-address-regexp from))
|
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 (plist-get msg :to)))
|
||||||
(mu4e~headers-contact-str from-lst))))
|
(mu4e~headers-contact-str from-lst))))
|
||||||
(:date (format-time-string mu4e-headers-date-format val))
|
(: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-read()(interactive)(mu4e-headers-mark-and-next 'read))
|
||||||
(defun mu4e~headers-mark-unread()(interactive)(mu4e-headers-mark-and-next 'unread))
|
(defun mu4e~headers-mark-unread()(interactive)(mu4e-headers-mark-and-next 'unread))
|
||||||
|
|
||||||
|
|
||||||
(setq mu4e-headers-mode-map
|
(setq mu4e-headers-mode-map
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
|
|
||||||
(define-key map "s" 'mu4e-headers-search)
|
(define-key map "s" 'mu4e-headers-search)
|
||||||
|
|
||||||
(define-key map "b" 'mu4e-headers-search-bookmark)
|
(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 "q" 'mu4e~headers-kill-buffer-and-window)
|
||||||
(define-key map "z" '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.
|
"Major mode for displaying mu4e search results.
|
||||||
\\{mu4e-headers-mode-map}."
|
\\{mu4e-headers-mode-map}."
|
||||||
(use-local-map mu4e-headers-mode-map)
|
(use-local-map mu4e-headers-mode-map)
|
||||||
|
|
||||||
(make-local-variable 'mu4e~headers-query)
|
(make-local-variable 'mu4e~headers-query)
|
||||||
(make-local-variable 'mu4e~headers-proc)
|
(make-local-variable 'mu4e~headers-proc)
|
||||||
(make-local-variable 'mu4e~highlighted-docid)
|
(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)))))
|
(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
|
;; search-based marking
|
||||||
|
@ -713,7 +698,7 @@ limited to the message at point and its descendants."
|
||||||
(setq last-marked-point (point)))))))
|
(setq last-marked-point (point)))))))
|
||||||
(when last-marked-point
|
(when last-marked-point
|
||||||
(goto-char last-marked-point)
|
(goto-char last-marked-point)
|
||||||
(mu4e-headers-next))))
|
(mu4e-headers-next))))
|
||||||
|
|
||||||
(defun mu4e-headers-mark-subthread ()
|
(defun mu4e-headers-mark-subthread ()
|
||||||
"Like `mu4e-mark-thread', but only for a sub-thread."
|
"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 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
;;; interactive functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
||||||
(defun mu4e-headers-search-bookmark (query search-all)
|
(defvar mu4e~headers-search-hist nil
|
||||||
"Search using some bookmarked query. when search-all (prefix
|
"History list of searches.")
|
||||||
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-bookmark-hist nil
|
(defun mu4e-headers-search (&optional expr search-all prompt edit)
|
||||||
"History list for bookmarks used.")
|
"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 ()
|
(defun mu4e-headers-view-message ()
|
||||||
"View message at point. If there's an existing window for the
|
"View message at point. If there's an existing window for the
|
||||||
|
|
|
@ -33,7 +33,7 @@
|
||||||
(let ((map (make-sparse-keymap)))
|
(let ((map (make-sparse-keymap)))
|
||||||
|
|
||||||
(define-key map "b" 'mu4e-headers-search-bookmark)
|
(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 "s" 'mu4e-headers-search)
|
||||||
(define-key map "q" 'mu4e-quit)
|
(define-key map "q" 'mu4e-quit)
|
||||||
|
|
|
@ -312,8 +312,8 @@ is nil, and otherwise open it."
|
||||||
|
|
||||||
(define-key map "s" 'mu4e-headers-search)
|
(define-key map "s" 'mu4e-headers-search)
|
||||||
|
|
||||||
(define-key map "b" 'mu4e-headers-search-bookmark)
|
(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 "%" 'mu4e-view-mark-matches)
|
(define-key map "%" 'mu4e-view-mark-matches)
|
||||||
(define-key map "t" 'mu4e-view-mark-subthread)
|
(define-key map "t" 'mu4e-view-mark-subthread)
|
||||||
|
|
Loading…
Reference in New Issue