(make-variable-buffer-local 'notmuch-pick-query-context)
(defvar notmuch-pick-target-msg nil)
(make-variable-buffer-local 'notmuch-pick-target-msg)
+(defvar notmuch-pick-open-target nil)
+(make-variable-buffer-local 'notmuch-pick-open-target)
(defvar notmuch-pick-buffer-name nil)
(make-variable-buffer-local 'notmuch-pick-buffer-name)
;; This variable is the window used for the message pane. It is set
(msg (notmuch-pick-get-message-properties))
(inhibit-read-only t))
(beginning-of-line)
- (delete-region (point) (1+ (line-end-position)))
- (notmuch-pick-insert-msg msg)
+ ;; This is a little tricky: we override
+ ;; notmuch-pick-previous-subject to get the decision between
+ ;; ... and a subject right and it stops notmuch-pick-insert-msg
+ ;; from overwriting the buffer local copy of
+ ;; notmuch-pick-previous-subject if this is called while the
+ ;; buffer is displaying.
+ (let ((notmuch-pick-previous-subject (notmuch-pick-get-prop :previous-subject)))
+ (delete-region (point) (1+ (line-end-position)))
+ (notmuch-pick-insert-msg msg))
(let ((new-end (line-end-position)))
(goto-char (if (= init-point end)
new-end
(notmuch-pick (notmuch-search-find-thread-id)
notmuch-search-query-string
nil
- (notmuch-prettify-subject (notmuch-search-find-subject)))
- (notmuch-pick-show-match-message-with-wait))
+ (notmuch-prettify-subject (notmuch-search-find-subject))
+ t))
(defun notmuch-pick-message-window-kill-hook ()
(let ((buffer (current-buffer)))
(when (window-live-p notmuch-pick-message-window)
(notmuch-pick-show-message)))
-(defun notmuch-pick-show-match-message-with-wait ()
- "Show the first matching message but wait for it to appear or search to finish."
- (interactive)
- (unless (notmuch-pick-get-match)
- (notmuch-pick-next-matching-message))
- (while (and (not (notmuch-pick-get-match))
- (get-buffer-process (current-buffer)))
- (message "waiting for message")
- (sit-for 0.1)
- (goto-char (point-min))
- (unless (notmuch-pick-get-match)
- (notmuch-pick-next-matching-message)))
- (message nil)
- (when (notmuch-pick-get-match)
- (notmuch-pick-show-message)))
-
(defun notmuch-pick-refresh-view ()
"Refresh view."
(interactive)
(defun notmuch-pick-insert-msg (msg)
"Insert the message MSG according to notmuch-pick-result-format"
- (dolist (spec notmuch-pick-result-format)
- (notmuch-pick-insert-field (car spec) (cdr spec) msg))
- (notmuch-pick-set-message-properties msg)
- (insert "\n"))
+ ;; We need to save the previous subject as it will get overwritten
+ ;; by the insert-field calls.
+ (let ((previous-subject notmuch-pick-previous-subject))
+ (dolist (spec notmuch-pick-result-format)
+ (notmuch-pick-insert-field (car spec) (cdr spec) msg))
+ (notmuch-pick-set-message-properties msg)
+ (notmuch-pick-set-prop :previous-subject previous-subject)
+ (insert "\n")))
(defun notmuch-pick-goto-and-insert-msg (msg)
"Insert msg at the end of the buffer. Move point to msg if it is the target"
(string= msg-id target))
(setq notmuch-pick-target-msg "found")
(goto-char (point-max))
- (forward-line -1))))
+ (forward-line -1)
+ (when notmuch-pick-open-target
+ (notmuch-pick-show-message)))))
(defun notmuch-pick-insert-tree (tree depth tree-status first last)
"Insert the message tree TREE at depth DEPTH in the current thread."
(notmuch-sexp-parse-partial-list 'notmuch-pick-insert-forest-thread
results-buf)))))
-(defun notmuch-pick-worker (basic-query &optional query-context target buffer)
+(defun notmuch-pick-worker (basic-query &optional query-context target buffer open-target)
(interactive)
(notmuch-pick-mode)
(setq notmuch-pick-basic-query basic-query)
(setq notmuch-pick-query-context query-context)
(setq notmuch-pick-buffer-name (buffer-name buffer))
(setq notmuch-pick-target-msg target)
+ (setq notmuch-pick-open-target open-target)
(erase-buffer)
(goto-char (point-min))
(insert "End of search results.\n"))))))
-(defun notmuch-pick (&optional query query-context target buffer-name show-first-match)
- "Run notmuch pick with the given `query' and display the results"
+(defun notmuch-pick (&optional query query-context target buffer-name open-target)
+ "Run notmuch pick with the given `query' and display the results.
+
+The arguments are:
+ QUERY: the main query. This can be any query but in many cases will be
+ a single thread. If nil this is read interactively from the minibuffer.
+ QUERY-CONTEXT: is an additional term for the query. The query used
+ is QUERY and QUERY-CONTEXT unless that does not match any messages
+ in which case we fall back to just QUERY.
+ TARGET: A message ID (with the id: prefix) that will be made
+ current if it appears in the pick results.
+ BUFFER-NAME: the name of the buffer to show the pick tree. If
+ it is nil \"*notmuch-pick\" followed by QUERY is used.
+ OPEN-TARGET: If TRUE open the target message in the message pane."
(interactive "sNotmuch pick: ")
(if (null query)
(setq query (notmuch-read-query "Notmuch pick: ")))
;; Don't track undo information for this buffer
(set 'buffer-undo-list t)
- (notmuch-pick-worker query query-context target buffer)
+ (notmuch-pick-worker query query-context target buffer open-target)
- (setq truncate-lines t)
- (when show-first-match
- (notmuch-pick-show-match-message-with-wait))))
+ (setq truncate-lines t)))
;; Set up key bindings from the rest of notmuch.