(define-key map [remap notmuch-jump-search] (notmuch-tree-close-message-pane-and #'notmuch-jump-search))
(define-key map "S" 'notmuch-search-from-tree-current-query)
+ (define-key map "U" 'notmuch-unthreaded-from-tree-current-query)
+ (define-key map "Z" 'notmuch-tree-from-unthreaded-current-query)
;; these use notmuch-show functions directly
(define-key map "|" 'notmuch-show-pipe-message)
(notmuch-tree-close-message-window)
(notmuch-tree query)))
+(defun notmuch-unthreaded-from-tree-current-query ()
+ "Switch from tree view to unthreaded view"
+ (interactive)
+ (unless notmuch-tree-unthreaded
+ (notmuch-tree-refresh-view 'unthreaded)))
+
+(defun notmuch-tree-from-unthreaded-current-query ()
+ "Switch from unthreaded view to tree view"
+ (interactive)
+ (when notmuch-tree-unthreaded
+ (notmuch-tree-refresh-view 'tree)))
+
(defun notmuch-search-from-tree-current-query ()
"Call notmuch search with the current query"
(interactive)
(when (window-live-p notmuch-tree-message-window)
(notmuch-tree-show-message-in)))
+(defun notmuch-tree-goto-matching-message (&optional prev)
+ "Move to the next or previous matching message.
+
+Returns t if there was a next matching message in the thread to show,
+nil otherwise."
+ (let ((dir (if prev -1 nil))
+ (eobfn (if prev #'bobp #'eobp)))
+ (while (and (not (funcall eobfn))
+ (not (notmuch-tree-get-match)))
+ (forward-line dir))
+ (not (funcall eobfn))))
+
(defun notmuch-tree-prev-matching-message ()
"Move to previous matching message."
(interactive)
(forward-line -1)
- (while (and (not (bobp)) (not (notmuch-tree-get-match)))
- (forward-line -1))
+ (notmuch-tree-goto-matching-message t)
(when (window-live-p notmuch-tree-message-window)
(notmuch-tree-show-message-in)))
"Move to next matching message."
(interactive)
(forward-line)
- (while (and (not (eobp)) (not (notmuch-tree-get-match)))
- (forward-line))
+ (notmuch-tree-goto-matching-message)
(when (window-live-p notmuch-tree-message-window)
(notmuch-tree-show-message-in)))
-(defun notmuch-tree-refresh-view ()
+(defun notmuch-tree-refresh-view (&optional view)
"Refresh view."
(interactive)
(when (get-buffer-process (current-buffer))
(error "notmuch tree process already running for current buffer"))
(let ((inhibit-read-only t)
(basic-query notmuch-tree-basic-query)
+ (unthreaded (cond ((eq view 'unthreaded) t)
+ ((eq view 'tree) nil)
+ (t notmuch-tree-unthreaded)))
(query-context notmuch-tree-query-context)
(target (notmuch-tree-get-message-id)))
(erase-buffer)
(notmuch-tree-worker basic-query
query-context
- target)))
+ target
+ nil
+ unthreaded)))
(defun notmuch-tree-thread-top ()
(when (notmuch-tree-get-message-properties)
(notmuch-tree-thread-top))
(defun notmuch-tree-next-thread ()
+ "Get the next thread in the current tree. Returns t if a thread was
+found or nil if not."
(interactive)
(forward-line 1)
(while (not (or (notmuch-tree-get-prop :first) (eobp)))
- (forward-line 1)))
+ (forward-line 1))
+ (not (eobp)))
(defun notmuch-tree-thread-mapcar (function)
"Iterate through all messages in the current thread