unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: Tomi Ollila <tomi.ollila@iki.fi>
To: David Edmondson <dme@dme.org>, notmuch@notmuchmail.org
Subject: Re: [PATCH v1 2/2] emacs: Bind "u" to jump to the parent message in a thread
Date: Thu, 29 Aug 2019 21:50:26 +0300	[thread overview]
Message-ID: <m28srbrekt.fsf@guru.guru-group.fi> (raw)
In-Reply-To: <20190829172441.6849-3-dme@dme.org>

On Thu, Aug 29 2019, David Edmondson wrote:

> ---
>  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."))

Would it be nicer to just message if there is no parent. do we have 
similar (error) cases in after any other interactive command ?

Otherwise this looks good to me. I'd guess forest data structure
is robuse enough for these call paths to work...

dme: What do you think could be done differently to possibly
get less expensive implementation ?

Tomi

> +    (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

      reply	other threads:[~2019-08-29 18:50 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-25 10:02 notmuch-emacs: WISH: command notmuch-show-message-up with key bindung u Gregor Zattler
2019-08-26 14:12 ` David Bremner
2019-08-29 14:16 ` Daniel Kahn Gillmor
2019-08-29 17:24 ` [PATCH v1 0/2] emacs/show: Add a binding to go up David Edmondson
2019-08-29 17:24   ` [PATCH v1 1/2] emacs: Stash the currently shown forest in a buffer local variable David Edmondson
2019-08-29 17:24   ` [PATCH v1 2/2] emacs: Bind "u" to jump to the parent message in a thread David Edmondson
2019-08-29 18:50     ` Tomi Ollila [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=m28srbrekt.fsf@guru.guru-group.fi \
    --to=tomi.ollila@iki.fi \
    --cc=dme@dme.org \
    --cc=notmuch@notmuchmail.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).