X-Git-Url: https://git.notmuchmail.org/git?a=blobdiff_plain;f=emacs%2Fnotmuch-tree.el;h=254664c4718bfa0affbeb48b4e76054f3db022fa;hb=ef0ab496b3f1e3a85f08102e3aaf251f4af69fd3;hp=7f68efbad14cac70b5a73ae25638233f6854c65a;hpb=c0868d959d38d1178acd8b1cba14a0944ea0c2a4;p=notmuch diff --git a/emacs/notmuch-tree.el b/emacs/notmuch-tree.el index 7f68efba..254664c4 100644 --- a/emacs/notmuch-tree.el +++ b/emacs/notmuch-tree.el @@ -24,6 +24,8 @@ ;;; Code: +(eval-when-compile (require 'cl-lib)) + (require 'mail-parse) (require 'notmuch-lib) @@ -32,7 +34,6 @@ (require 'notmuch-tag) (require 'notmuch-parser) -(eval-when-compile (require 'cl)) (declare-function notmuch-search "notmuch" (&optional query oldest-first target-thread target-line)) (declare-function notmuch-call-notmuch-process "notmuch" (&rest args)) (declare-function notmuch-read-query "notmuch" (prompt)) @@ -319,7 +320,8 @@ FUNC." ;; The main tree view bindings (define-key map (kbd "RET") 'notmuch-tree-show-message) (define-key map [mouse-1] 'notmuch-tree-show-message) - (define-key map "x" 'notmuch-tree-quit) + (define-key map "x" 'notmuch-tree-archive-message-then-next-or-exit) + (define-key map "X" 'notmuch-tree-archive-thread-then-exit) (define-key map "A" 'notmuch-tree-archive-thread) (define-key map "a" 'notmuch-tree-archive-message-then-next) (define-key map "z" 'notmuch-tree-to-tree) @@ -584,10 +586,10 @@ Shows in split pane or whole window according to value of (when (notmuch-tree-scroll-message-window) (notmuch-tree-next-matching-message))) -(defun notmuch-tree-quit () +(defun notmuch-tree-quit (&optional kill-both) "Close the split view or exit tree." - (interactive) - (unless (notmuch-tree-close-message-window) + (interactive "P") + (when (or (not (notmuch-tree-close-message-window)) kill-both) (kill-buffer (current-buffer)))) (defun notmuch-tree-close-message-window () @@ -617,6 +619,21 @@ message will be \"unarchived\", i.e. the tag changes in (notmuch-tree-archive-message unarchive) (notmuch-tree-next-matching-message)) +(defun notmuch-tree-archive-thread-then-exit () + "Archive all messages in the current buffer, then exit notmuch-tree." + (interactive) + (notmuch-tree-archive-thread) + (notmuch-tree-quit t)) + +(defun notmuch-tree-archive-message-then-next-or-exit () + "Archive current message, then show next open message in current thread. + +If at the last open message in the current thread, then exit back +to search results." + (interactive) + (notmuch-tree-archive-message) + (notmuch-tree-next-matching-message t)) + (defun notmuch-tree-next-message () "Move to next message." (interactive) @@ -643,21 +660,24 @@ nil otherwise." (forward-line dir)) (not (funcall eobfn)))) -(defun notmuch-tree-prev-matching-message () +(defun notmuch-tree-matching-message (&optional prev pop-at-end) + "Move to the next or previous matching message" + (interactive "P") + (forward-line (if prev -1 nil)) + (if (and (not (notmuch-tree-goto-matching-message prev)) pop-at-end) + (notmuch-tree-quit pop-at-end) + (when (window-live-p notmuch-tree-message-window) + (notmuch-tree-show-message-in)))) + +(defun notmuch-tree-prev-matching-message (&optional pop-at-end) "Move to previous matching message." - (interactive) - (forward-line -1) - (notmuch-tree-goto-matching-message t) - (when (window-live-p notmuch-tree-message-window) - (notmuch-tree-show-message-in))) + (interactive "P") + (notmuch-tree-matching-message t pop-at-end)) -(defun notmuch-tree-next-matching-message () +(defun notmuch-tree-next-matching-message (&optional pop-at-end) "Move to next matching message." - (interactive) - (forward-line) - (notmuch-tree-goto-matching-message) - (when (window-live-p notmuch-tree-message-window) - (notmuch-tree-show-message-in))) + (interactive "P") + (notmuch-tree-matching-message nil pop-at-end)) (defun notmuch-tree-refresh-view (&optional view) "Refresh view." @@ -702,10 +722,10 @@ found or nil if not." and call FUNCTION for side effects." (save-excursion (notmuch-tree-thread-top) - (loop collect (funcall function) - do (forward-line) - while (and (notmuch-tree-get-message-properties) - (not (notmuch-tree-get-prop :first)))))) + (cl-loop collect (funcall function) + do (forward-line) + while (and (notmuch-tree-get-message-properties) + (not (notmuch-tree-get-prop :first)))))) (defun notmuch-tree-get-messages-ids-thread-search () "Return a search string for all message ids of messages in the current thread." @@ -886,10 +906,11 @@ message together with all its descendents." (defun notmuch-tree-insert-thread (thread depth tree-status) "Insert the collection of sibling sub-threads THREAD at depth DEPTH in the current forest." (let ((n (length thread))) - (loop for tree in thread - for count from 1 to n - - do (notmuch-tree-insert-tree tree depth tree-status (eq count 1) (eq count n))))) + (cl-loop for tree in thread + for count from 1 to n + do (notmuch-tree-insert-tree tree depth tree-status + (eq count 1) + (eq count n))))) (defun notmuch-tree-insert-forest-thread (forest-thread) "Insert a single complete thread."