--- emacs/notmuch-show.el | 55 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) diff --git a/emacs/notmuch-show.el b/emacs/notmuch-show.el index 1e3834f2..7c50d2cd 100644 --- a/emacs/notmuch-show.el +++ b/emacs/notmuch-show.el @@ -1173,6 +1173,60 @@ is t, hide the part initially and show the button." (setq notmuch-show--forest forest) (mapc (lambda (thread) (notmuch-show-insert-thread thread 0)) forest)) +(defun notmuch-show--find-parent-in-thread-node (thread-node id) + (let* ((msg (car thread-node)) + (reply-nodes (cadr thread-node)) + ;; Is one of the replies to this message the one we are looking + ;; for? + (candidate + (catch 'found + (mapc (lambda (reply-node) + (let* ((reply-msg (car reply-node)) + (reply-id (plist-get reply-msg :id))) + (when (string= reply-id id) + (throw 'found (plist-get msg :id))))) + reply-nodes) + nil))) + (if candidate + candidate + ;; Otherwise recurse down. + (notmuch-show--find-parent-in-thread reply-nodes id)))) + +(defun notmuch-show--find-parent-in-thread (thread id) + (let ((msg (catch 'found + (mapc (lambda (thread-node) + (setq msg (notmuch-show--find-parent-in-thread-node thread-node id)) + (when msg + (throw 'found msg))) + thread) + nil))) + msg)) + +(defun notmuch-show--find-parent-in-thread-set (thread-set id) + (let ((msg (catch 'found + (mapc (lambda (thread) + (setq msg (notmuch-show--find-parent-in-thread thread id)) + (when msg + (throw 'found msg))) + thread-set) + nil))) + msg)) + +(defun notmuch-show--find-parent () + "Find the parent of the current message." + (notmuch-show--find-parent-in-thread-set notmuch-show--forest + (notmuch-show-get-message-id t))) + +(defun notmuch-show--show-parent () + "Jump to the parent of the current message, opening it if necessary." + (interactive) + (let ((parent (notmuch-show--find-parent))) + (unless parent + (error "The current message has no parent.")) + (notmuch-show-goto-message (notmuch-id-to-query parent)) + (unless (notmuch-show-message-visible-p) + (notmuch-show-toggle-message)))) + (defvar notmuch-id-regexp (concat ;; Match the id: prefix only if it begins a word (to disallow, for @@ -1516,6 +1570,7 @@ reset based on the original query." (define-key map "t" 'toggle-truncate-lines) (define-key map "." 'notmuch-show-part-map) (define-key map "B" 'notmuch-show-browse-urls) + (define-key map "u" 'notmuch-show--show-parent) map) "Keymap for \"notmuch show\" buffers.") (fset 'notmuch-show-mode-map notmuch-show-mode-map) -- 2.22.0 _______________________________________________ notmuch mailing list notmuch@notmuchmail.org https://notmuchmail.org/mailman/listinfo/notmuch