Add an optional no-display arg to the generic buffer refresh function, notmuch-refresh-this-buffer, which works the same way as notmuch-hello mode's notmuch-hello-update no-display arg. The idea is for the generic notmuch-refresh-this-buffer to pass down this arg to the "mode-specific" refresh functions to be able to update buffers without bringing them to the foreground (if they are already foregrounded, i.e. displayed in a window, this has no effect). When updating a search buffer, notmuch currently always brings results in a window to the foreground. Perhaps counter-intuitively, we do not want this behaviour necessarily, because we want to auto-refresh any kind of search buffers, even those backgrounded (not displayed in any window/frame) from previous searches. This is why we add a no-display arg to notmuch-search. We do this to show which mails have appeard or dissapeared since the last search refresh and have this information updated in real time even when switching buffers. The ultimate goal of this is to have all notmuch buffers auto-refresh when the email client syncs (this function is added in the next patch). Signed-off-by: Ioan-Adrian Ratiu <adi@adirat.com> --- emacs/notmuch-lib.el | 10 +++++++--- emacs/notmuch.el | 17 ++++++++++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/emacs/notmuch-lib.el b/emacs/notmuch-lib.el index 2f015b0..6618365 100644 --- a/emacs/notmuch-lib.el +++ b/emacs/notmuch-lib.el @@ -409,14 +409,18 @@ of its command symbol." "Function to call to refresh the current buffer.") (make-variable-buffer-local 'notmuch-buffer-refresh-function) -(defun notmuch-refresh-this-buffer () - "Refresh the current buffer." +(defun notmuch-refresh-this-buffer (&optional no-display) + "Refresh the current buffer. + +If no-display is non-nil do not try to bring the buffer to the +foreground. If the buffer is already foregrounded i.e. displayed +in a window on screen, no-display has no effect." (interactive) (when notmuch-buffer-refresh-function (if (commandp notmuch-buffer-refresh-function) ;; Pass prefix argument, etc. (call-interactively notmuch-buffer-refresh-function) - (funcall notmuch-buffer-refresh-function)))) + (funcall notmuch-buffer-refresh-function no-display)))) (defun notmuch-poll-and-refresh-this-buffer () "Invoke `notmuch-poll' to import mail, then refresh the current buffer." diff --git a/emacs/notmuch.el b/emacs/notmuch.el index c33c55c..ed93e66 100644 --- a/emacs/notmuch.el +++ b/emacs/notmuch.el @@ -930,7 +930,7 @@ PROMPT is the string to prompt with." ;;;###autoload (put 'notmuch-search 'notmuch-doc "Search for messages.") -(defun notmuch-search (&optional query oldest-first target-thread target-line) +(defun notmuch-search (&optional query oldest-first target-thread target-line no-display) "Display threads matching QUERY in a notmuch-search buffer. If QUERY is nil, it is read interactively from the minibuffer. @@ -941,6 +941,9 @@ Other optional parameters are used as follows: current if it appears in the search results. TARGET-LINE: The line number to move to if the target thread does not appear in the search results. + NO-DISPLAY: Do not try to foreground the search results buffer. If it is + already foregrounded i.e. displayed in a window, this has no + effect, meaning the buffer will remain visible. When called interactively, this will prompt for a query and use the configured default sort order." @@ -954,7 +957,9 @@ the configured default sort order." (let* ((query (or query (notmuch-read-query "Notmuch search: "))) (buffer (get-buffer-create (notmuch-search-buffer-title query)))) - (switch-to-buffer buffer) + (if no-display + (set-buffer buffer) + (switch-to-buffer buffer)) (notmuch-search-mode) ;; Don't track undo information for this buffer (set 'buffer-undo-list t) @@ -987,21 +992,23 @@ the configured default sort order." (set-process-query-on-exit-flag proc nil)))) (run-hooks 'notmuch-search-hook))) -(defun notmuch-search-refresh-view () +(defun notmuch-search-refresh-view (&optional no-display) "Refresh the current view. Erases the current buffer and runs a new search with the same query string as the current search. If the current thread is in the new search results, then point will be placed on the same thread. Otherwise, point will be moved to attempt to be in the -same relative position within the new buffer." +same relative position within the new buffer. If no-display is +non-nil, the search results buffer will not be foregrounded, if +it already is displayed in a window, then no-display has no effect." (let ((target-line (line-number-at-pos)) (oldest-first notmuch-search-oldest-first) (target-thread (notmuch-search-find-thread-id 'bare)) (query notmuch-search-query-string) (inhibit-read-only t)) (erase-buffer) - (notmuch-search query oldest-first target-thread target-line) + (notmuch-search query oldest-first target-thread target-line no-display) (goto-char (point-min)))) (defun notmuch-search-toggle-order () -- 2.9.3