]> git.eshelyaron.com Git - emacs.git/commitdiff
Fix two bugs in removing bookmark fringe marks
authorKarl Fogel <kfogel@red-bean.com>
Mon, 22 Apr 2024 19:45:39 +0000 (14:45 -0500)
committerEshel Yaron <me@eshelyaron.com>
Tue, 23 Apr 2024 10:13:48 +0000 (12:13 +0200)
This fixes bug#70019 and a separate fringe-mark removal bug that
also affected bookmarks in certain Info nodes.

* lisp/bookmark.el (bookmark--remove-fringe-mark): Fix bug#70019 by
temporarily widening in order to ensure we fetch the right overlays.
Also, normalize both filenames before comparing, to avoid spurious
failure to match.

Thanks to Dani Moncayo for the bug report and for testing.

(cherry picked from commit 63765a74f15ef22109750414ec3025c8a40039f0)

lisp/bookmark.el

index e8f7117678eeb50e918fe4cb285a9f4d3f30807d..25a544ce3ac0e5651b7c031fedb68f08288c1dbe 100644 (file)
@@ -515,18 +515,45 @@ See user option `bookmark-fringe-mark'."
         (non-essential t)
         overlays found temp)
     (when (and pos filename)
-      (setq filename (abbreviate-file-name (expand-file-name filename)))
       (dolist (buf (buffer-list))
         (with-current-buffer buf
-          (when (equal filename
-                       (ignore-errors (bookmark-buffer-file-name)))
-            (setq overlays
-                  (save-excursion
-                    (goto-char pos)
-                    (overlays-in (pos-bol) (1+ (pos-bol)))))
-            (while (and (not found) (setq temp (pop overlays)))
-              (when (eq 'bookmark (overlay-get temp 'category))
-                (delete-overlay (setq found temp))))))))))
+          (let ((bkmk-fname (ignore-errors (bookmark-buffer-file-name))))
+            (when bkmk-fname
+              ;; Normalize both filenames before comparing, because the
+              ;; filename we receive from the bookmark wasn't
+              ;; necessarily generated by `bookmark-buffer-file-name'.
+              ;; For example, bookmarks set in Info nodes get a filename
+              ;; based on `Info-current-file', and under certain
+              ;; circumstances that can be an unexpanded path (e.g.,
+              ;; when the Info page was under your home directory).
+              (let ((this-fname-normalized (expand-file-name filename))
+                    (bkmk-fname-normalized (expand-file-name bkmk-fname)))
+                (when (equal this-fname-normalized bkmk-fname-normalized)
+                  (setq overlays
+                        (save-excursion
+                          (save-restriction
+                            ;; Suppose bookmark "foo" was earlier set at
+                            ;; location X in a file, but now the file is
+                            ;; narrowed such that X is outside the
+                            ;; restriction.  Then the `goto-char' below
+                            ;; would go to the wrong place and thus the
+                            ;; wrong overlays would be fetched.  This is
+                            ;; why we temporarily `widen' before
+                            ;; fetching.
+                            ;;
+                            ;; (This circumstance can easily arise when
+                            ;; a bookmark was set on Info node X but now
+                            ;; the "*info*" buffer is showing some other
+                            ;; node Y, with X and Y physically located
+                            ;; in the same file, as is often the case
+                            ;; with Info nodes.  See bug #70019, for
+                            ;; example.)
+                            (widen)
+                            (goto-char pos)
+                            (overlays-in (pos-bol) (1+ (pos-bol))))))
+                  (while (and (not found) (setq temp (pop overlays)))
+                    (when (eq 'bookmark (overlay-get temp 'category))
+                      (delete-overlay (setq found temp)))))))))))))
 
 (defun bookmark-sort-by-last-modified-time (names)
   "Sort bookmark NAMES by bookmark last modified time, then alphabetically."