unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: Karl Fogel <kfogel@red-bean.com>
Cc: Drew Adams <drew.adams@oracle.com>,
	 "emacs-devel@gnu.org" <emacs-devel@gnu.org>
Subject: Re: [PATCH] Let bookmark handlers do everything, including display the destination
Date: Mon, 29 Aug 2022 11:28:37 -0400	[thread overview]
Message-ID: <jwvpmgjks21.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <8735dt5si6.fsf@red-bean.com> (Karl Fogel's message of "Thu, 18 Aug 2022 13:14:09 -0500")

>>Specifically, instead of `bookmark--jump-via' systematically
>>invoking its DISPLAY-FUNCTION argument, it saves the
>>argument value in variable `bookmark-jump-display-function'.
>>And then the default handler, `bookmark-default-handler'
>>invokes that function.
>
> *nod*
>
> There's some parallelism-unsafety going on here, obviously.  I'd love a way
> to wrap all this in a clean closure, instead of setting a global variable
> which then retains that setting until the next time we happen to set it.

Indeed :-(

> But I don't really see a way to do tihngs more cleanly than with the
> carry-out variable you propose.  If there's some creative solution for
> connecting `bookmark--jump-via' to the "corresponding" handler call that
> happens later, I don't see it, lexically or dynamically.  Maybe is just how
> Emacs usually handles these kinds of situations?

Hmm... I must be missing something.  Why can't `bookmark--jump-via`
let-bind `bookmark-jump-display-function` around the call to
`bookmark-handle-bookmark`?

Regarding the patch, here are some comments:

> +  To display the destination, HANDLER can call the function that's the
> +  value of variable `bookmark-jump-display-function', which is set by
> +  `bookmark-jump' to automatically accommodate other-window etc.
> +  displaying that depends on the jump command.  For example:
> +
> +   (funcall bookmark-jump-display-function (current-buffer))
> +
> +  Or HANDLER can directly call another display function.  For example:
> +
> +   (switch-to-buffer-other-tab BUFFER)

I skipped most of the rest of the docstring's massaging, which I'm not
sure is an improvement but with which I guess I can live.  But the above
goes significantly beyond what one usually expects from a docstring.
It would fit much better in a Texinfo manual instead.

> +  Or HANDLER can invoke `bookmark-default-handler'.  That displays the
> +  destination.  It then moves to the recorded buffer position, POS,
> +  repositioning point, if necessary, to match the recorded context
> +  strings STR-BEFORE-POS and STR-AFTER-POS.  For instance, the Info
> +  handler, `Info-bookmark-jump', does this at its end:

And this is (or should be) redundant with the docstring of
`bookmark-default-handler` so better keep the link and the the readers
jump to it when they need/want to know what that function does.

> +(defvar bookmark-jump-display-function nil
> + "Function used currently to display a bookmark, or nil if no function.")

Please give it a function as default value (e.g. `ignore`).

> @@ -1350,6 +1391,9 @@
>        ((and buf (get-buffer buf)))
>        (t ;; If not, raise error.
>         (signal 'bookmark-error-no-filename (list 'stringp file)))))
> +    (when bookmark-jump-display-function
> +      (save-current-buffer (funcall bookmark-jump-display-function
> +                                    (current-buffer))))

Why `save-current-buffer`?

>      (if place (goto-char place))
>      ;; Go searching forward first.  Then, if forward-str exists and
>      ;; was found in the file, we can search backward for behind-str.

Hmm... `bookmark-default-handler` is also called via things like
`bookmark-insert`, so I think `bookmark-insert` should explicitly bind
`bookmark-jump-display-function` to `ignore`, and of course that begs
the question of what to do for handlers which don't obey
`bookmark-jump-display-function`.

I think it's good to provide more control to the bookmark's handler, but
there seems to be a need for the caller to control the display as well
to some extent.

BTW, your generalization of bookmarks to "anything" makes it all the
more obvious to me that these should be unified with "registers" (not
necessarily at the UI level, but a register should be able to hold
anything that can stored as a bookmark, and vice versa).


        Stefan





  reply	other threads:[~2022-08-29 15:28 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-08-13 20:59 [PATCH] Let bookmark handlers do everything, including display the destination Drew Adams
2022-08-18 18:14 ` Karl Fogel
2022-08-29 15:28   ` Stefan Monnier [this message]
2022-08-29 23:45     ` Karl Fogel
2022-09-06  0:07       ` [External] : " Drew Adams
2022-09-26 19:47         ` Karl Fogel

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://www.gnu.org/software/emacs/

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

  git send-email \
    --in-reply-to=jwvpmgjks21.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=drew.adams@oracle.com \
    --cc=emacs-devel@gnu.org \
    --cc=kfogel@red-bean.com \
    /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://git.savannah.gnu.org/cgit/emacs.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).