mu4e-search: try harder to update baseline

Try to update the query baseline if we're search for the favorite-query,
whether as a bookmark or an "organic" query, through a new function
mu4e--search-maybe-reset-baseline

Note that the query must string-match _exactly_, equivalence is not
enough.

Some cosmetic updates.

Fixes #2775.
This commit is contained in:
Dirk-Jan C. Binnema
2024-10-29 22:57:27 +02:00
parent ae29b2dd0f
commit bbf3482881

View File

@ -1,6 +1,6 @@
;;; mu4e-search.el --- Search-related functions -*- lexical-binding: t -*- ;;; mu4e-search.el --- Search-related functions -*- lexical-binding: t -*-
;; Copyright (C) 2021,2022 Dirk-Jan C. Binnema ;; Copyright (C) 2021,2024 Dirk-Jan C. Binnema
;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ;; Author: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl> ;; Maintainer: Dirk-Jan C. Binnema <djcb@djcbsoftware.nl>
@ -35,7 +35,7 @@
(require 'mu4e-mark) (require 'mu4e-mark)
(require 'mu4e-query-items) (require 'mu4e-query-items)
;;; Configuration ;;; Configuration
(defgroup mu4e-search nil (defgroup mu4e-search nil
"Search-related settings." "Search-related settings."
@ -115,8 +115,9 @@ chronologically (`:date') by the newest message in the thread."
:group 'mu4e-search) :group 'mu4e-search)
(defcustom mu4e-search-sort-direction 'descending (defcustom mu4e-search-sort-direction 'descending
"Direction to sort by; a symbol either `descending' (sorting "Direction to sort by.
Z->A) or `ascending' (sorting A->Z)." A symbol either `descending' (sorting Z->A) or
`ascending' (sorting A->Z)."
:type '(radio (const ascending) :type '(radio (const ascending)
(const descending)) (const descending))
:group 'mu4e-search) :group 'mu4e-search)
@ -148,7 +149,7 @@ executed search, not just those that are invoked via bookmarks,
but also manually invoked searches." but also manually invoked searches."
:type 'hook :type 'hook
:group 'mu4e-search) :group 'mu4e-search)
;; Internals ;; Internals
;;; History ;;; History
@ -160,8 +161,6 @@ but also manually invoked searches."
(defvar mu4e--search-last-query nil (defvar mu4e--search-last-query nil
"The present (most recent) query.") "The present (most recent) query.")
;;; Interactive functions ;;; Interactive functions
(declare-function mu4e--search-execute "mu4e-headers") (declare-function mu4e--search-execute "mu4e-headers")
@ -170,6 +169,13 @@ but also manually invoked searches."
(defvar mu4e--search-msgid-target nil (defvar mu4e--search-msgid-target nil
"Message-id to jump to after the search has finished.") "Message-id to jump to after the search has finished.")
(defun mu4e--search-maybe-reset-baseline (query)
"Reset the baseline if QUERY matches the favorite.
Note that the query must match the favorite _exactly_,
equivalence is not enough."
(when-let* ((fav (mu4e--bookmark-query (mu4e-bookmark-favorite))))
(when (and fav (string= fav query))
(mu4e--query-items-refresh 'reset-baseline))))
(defun mu4e-search (&optional expr prompt edit ignore-history msgid show) (defun mu4e-search (&optional expr prompt edit ignore-history msgid show)
"Search for query EXPR. "Search for query EXPR.
@ -183,7 +189,10 @@ the user edit the query before executing it.
If IGNORE-HISTORY is true, do *not* update the query history If IGNORE-HISTORY is true, do *not* update the query history
stack. If MSGID is non-nil, attempt to move point to the first stack. If MSGID is non-nil, attempt to move point to the first
message with that message-id after searching. If SHOW is non-nil, message with that message-id after searching. If SHOW is non-nil,
show the message with MSGID." show the message with MSGID.
Attempts to reset the query baseline if EXPR is an exact match
with the favorite bookmark's query."
(interactive) (interactive)
(let* ((prompt (mu4e-format (or prompt "Search for: "))) (let* ((prompt (mu4e-format (or prompt "Search for: ")))
(expr (expr
@ -194,6 +203,7 @@ show the message with MSGID."
(mu4e--search-execute expr ignore-history) (mu4e--search-execute expr ignore-history)
(setq mu4e--search-msgid-target msgid (setq mu4e--search-msgid-target msgid
mu4e--search-view-target show) mu4e--search-view-target show)
(mu4e--search-maybe-reset-baseline expr)
(mu4e--modeline-update))) (mu4e--modeline-update)))
(defun mu4e-search-edit () (defun mu4e-search-edit ()
@ -210,12 +220,7 @@ the search."
(or expr (or expr
(mu4e-ask-bookmark (mu4e-ask-bookmark
(if edit "Select bookmark: " "Bookmark: ")))) (if edit "Select bookmark: " "Bookmark: "))))
(expr (if (functionp expr) (funcall expr) expr)) (expr (if (functionp expr) (funcall expr) expr)))
(fav (mu4e--bookmark-query (mu4e-bookmark-favorite))))
;; reset baseline when searching for the favorite bookmark query
(when (and fav (string= fav expr))
(mu4e--query-items-refresh 'reset-baseline))
(run-hook-with-args 'mu4e-search-bookmark-hook expr) (run-hook-with-args 'mu4e-search-bookmark-hook expr)
(mu4e-search expr (when edit "Edit query: ") edit))) (mu4e-search expr (when edit "Edit query: ") edit)))
@ -224,7 +229,6 @@ the search."
(interactive) (interactive)
(mu4e-search-bookmark nil t)) (mu4e-search-bookmark nil t))
(defun mu4e-search-maildir (maildir &optional edit) (defun mu4e-search-maildir (maildir &optional edit)
"Search the messages in MAILDIR. "Search the messages in MAILDIR.
The user is prompted to ask what maildir. If prefix-argument EDIT The user is prompted to ask what maildir. If prefix-argument EDIT
@ -328,7 +332,7 @@ either `future' or `past'."
(defun mu4e-last-query () (defun mu4e-last-query ()
"Get the most recent query or nil if there is none." "Get the most recent query or nil if there is none."
mu4e--search-last-query) mu4e--search-last-query)
;;; Completion for queries ;;; Completion for queries
(defvar mu4e--search-hist nil "History list of searches.") (defvar mu4e--search-hist nil "History list of searches.")
@ -491,8 +495,7 @@ last search with the new setting."
(defvar mu4e-search-skip-duplicates-label '("U" . "") ;; 'U' for 'unique' (defvar mu4e-search-skip-duplicates-label '("U" . "") ;; 'U' for 'unique'
"Non-fancy and fancy labels for include-related search in the mode-line.") "Non-fancy and fancy labels for include-related search in the mode-line.")
(defvar mu4e-search-hide-label '("H" . "") (defvar mu4e-search-hide-label '("H" . "")
"Non-fancy and fancy labels to indicate header-hiding is active in "Non-fancy and fancy labels to indicate header-hiding.")
the mode-line.")
(defun mu4e--search-modeline-item () (defun mu4e--search-modeline-item ()
"Get mu4e-search modeline item." "Get mu4e-search modeline item."