emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH] Let bookmark handlers do everything, including display the d


From: Karl Fogel
Subject: Re: [PATCH] Let bookmark handlers do everything, including display the destination
Date: Mon, 29 Aug 2022 18:45:31 -0500
User-agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux)

On 29 Aug 2022, Stefan Monnier wrote:
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`?

Of course -- obvious, now that you point it out. Thank you for reviewing, Stefan.

Drew, does that sound good to you?

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.

Agreed.

+(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`).

I think I understand: by taking your advice, we don't have to check the function's existence -- we can just call it unconditionally, and if it happens to do nothing (i.e., is `ignore'), that's fine. A specific package may still override the default handler and do whatever display magic is called for; otherwise, bookmark.el's default handler will Do The Right Thing for displaying. But all this raises the question you raise below...

@@ -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.

...which is that we now seem to have two possibly-redundant ways to control displaying: write a custom handler, *or* bind `bookmark-jump-display-function' to something?

Or perhaps I'm misunderstanding something. Drew, if you post the next revision of the patch incorporating Stefan's points above, I will review that in detail, when fully alert, and should be able to distill any remaining questions -- I think we'd be pretty close at that point.

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

I agree that that makes sense as a long term goal.

Best regards,
-Karl



reply via email to

[Prev in Thread] Current Thread [Next in Thread]