]> git.bundesbrandschatzamt.de Git - emacsconfig.git/commitdiff
update bookmark+
authorAndreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
Wed, 8 Jan 2025 20:23:48 +0000 (21:23 +0100)
committerAndreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
Wed, 8 Jan 2025 20:23:48 +0000 (21:23 +0100)
Signed-off-by: Andreas Gerler <baronNOSPAMbundesbrandschatzamt.de>
lisp/bookmark+-1.el
lisp/bookmark+-bmu.el
lisp/bookmark+-chg.el
lisp/bookmark+-doc.el
lisp/bookmark+-key.el
lisp/bookmark+-lit.el
lisp/bookmark+-mac.el
lisp/bookmark+.el

index 5e68f4672ef48ecc66cb796d8d152f782a3ce192..7c38fe9e787b52c55c4c15162894964b9e3f4a70 100644 (file)
@@ -1,15 +1,15 @@
-;;; bookmark+-1.el - First part of package Bookmark+.
+;;; bookmark+-1.el - First part of package Bookmark+.   -*- lexical-binding:t -*-
 ;;
 ;; Filename: bookmark+-1.el
 ;; Description: First part of package Bookmark+.
 ;; Author: Drew Adams, Thierry Volpiatto
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 2000-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2000-2024, Drew Adams, all rights reserved.
 ;; Copyright (C) 2009, Thierry Volpiatto.
 ;; Created: Mon Jul 12 13:43:55 2010 (-0700)
-;; Last-Updated: Fri Jan 14 12:34:36 2022 (-0800)
+;; Last-Updated: Sat Mar 23 21:36:20 2024 (-0700)
 ;;           By: dradams
-;;     Update #: 9453
+;;     Update #: 9681
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b-1.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, bookmark+, placeholders, annotations, search, info, url, eww, w3m, gnus
 ;;    `bmkp-make-gnus-record', `bmkp-make-icicle-search-hits-record',
 ;;    `bmkp-make-kmacro-list-record' (Emacs 22+),
 ;;    `bmkp-make-man-record', `bmkp-make-obsolete',
-;;    `bmkp-make-obsolete-variable', `bmkp-make-plain-predicate',
+;;    `bmkp-make-obsolete-variable',
 ;;    `bmkp-make-record-for-target-file', `bmkp-make-sequence-record',
 ;;    `bmkp-make-url-browse-record', `bmkp-make-variable-list-record',
 ;;    `bmkp-make-w3m-record', `bmkp-make-woman-record' (Emacs 21+),
 ;;
 ;;    `bookmark-alist' (doc string only),
 ;;    `bookmark-make-record-function' (Emacs 20-22),
-;;    `bookmarks-already-loaded' (doc string only).
 ;;
 ;;
 ;;  ***** NOTE: The following function defined in `info.el'
 (unless (fboundp 'file-remote-p) (require 'ffap)) ;; ffap-file-remote-p
 (eval-when-compile (require 'gnus)) ;; mail-header-id (really in `nnheader.el')
 (eval-when-compile (require 'gnus-sum)) ;; gnus-summary-article-header
-(eval-when-compile (require 'cl)) ;; case, multiple-value-bind, typecase (plus, for Emacs 20: dolist, push)
+
+(eval-when-compile (unless (require 'cl-lib nil t)
+                     (require 'cl)
+                     (defalias 'cl-case                'case)
+                     (defalias 'cl-multiple-value-bind 'multiple-value-bind)
+                     (defalias 'cl-typecase            'typecase)))
 
 (when (and (require 'thingatpt+ nil t) ;; (no error if not found):
            (fboundp 'tap-put-thing-at-point-props)) ; >= 2012-08-21
 
 (defun bmkp-make-obsolete-variable (obsolete-name current-name &optional when access-type)
   "Same as `make-obsolete-variable', but usable also for Emacs prior to Emacs 23."
-  (if (< emacs-major-version 23)
-      (make-obsolete-variable obsolete-name current-name)
-    (make-obsolete-variable obsolete-name current-name when)))
-
-
+  (cond ((< emacs-major-version 23)
+         (make-obsolete-variable obsolete-name current-name))
+        ((= emacs-major-version 23)
+         (make-obsolete-variable obsolete-name current-name when))
+        (t (make-obsolete-variable obsolete-name current-name when access-type))))
 
 (eval-when-compile
  (or (condition-case nil
 (eval-when-compile (require 'bookmark+-bmu))
 ;; bmkp-bmenu-before-hide-marked-alist, bmkp-bmenu-before-hide-unmarked-alist, bmkp-bmenu-commands-file,
 ;; bmkp-replace-regexp-in-string, bmkp-bmenu-filter-function, bmkp-bmenu-filter-pattern,
-;; bmkp-bmenu-first-time-p, bmkp-flagged-bookmarks, bmkp-bmenu-goto-bookmark-named,
-;; bmkp-bmenu-marked-bookmarks, bmkp-bmenu-omitted-bookmarks, bmkp-bmenu-refresh-menu-list,
-;; bmkp-bmenu-show-all, bmkp-bmenu-state-file, bmkp-bmenu-title, bmkp-looking-at-p,
+;; bmkp-bmenu-first-time-p, bmkp-flagged-bookmarks, bmkp-bmenu-goto-bookmark-named, bmkp-bmenu-marked-bookmarks,
+;; bmkp-bmenu-omitted-bookmarks, bmkp-bmenu-refresh-menu-list, bmkp-bmenu-show-all,
+;; bmkp-bmenu-show-file-not-buffer-flag, bmkp-bmenu-state-file, bmkp-bmenu-title, bmkp-looking-at-p,
 ;; bmkp-maybe-unpropertize-bookmark-names, bmkp-sort-orders-alist, bookmark-bmenu-toggle-filenames
 
 
 (defvar bmkp-eww-replace-keys-flag)     ; Here (Emacs 25+)
 (defvar bmkp-info-auto-type)            ; Here (Emacs 22+)
 (defvar bmkp-light-priorities)          ; In `bookmark+-lit.el'
+(defvar bmkp-setting-automatic-bmk-p)   ; Here, bound in `bmkp-set-automatic-bookmark'.
 (defvar bmkp-temporary-bookmarking-mode) ;  Here
 (defvar bmkp-global-automatic-bookmark-mode) ; Here, via `define-globalized-minor-mode'
 (defvar bookmark-current-point)         ; In `bookmark.el', but not in Emacs 23+
 (defvar bookmark-file-coding-system)    ; In `bookmark.el' (Emacs 25.2+)
 (defvar bookmark-read-annotation-text-func) ; In `bookmark.el', but not in Emacs 23+
 (defvar bookmark-make-record-function)  ; In `bookmark.el'
+(defvar bookmark-set-fringe-mark)       ; In `bookmark.el' (Emacs 28+)
+(defvar cl-print-readably)              ; In `cl-print.el'
 (defvar desktop-basefilename)           ; In `desktop.el' (Emacs < 22)
 (defvar desktop-base-file-name)         ; In `desktop.el'
 (defvar desktop-buffer-args-list)       ; In `desktop.el'
 (defvar desktop-dirname)                ; In `desktop.el'
 (defvar desktop-file-modtime)           ; In `desktop.el'
 (defvar desktop-globals-to-save)        ; In `desktop.el'
+(defvar desktop-restore-eager)          ; In `desktop.el'
 (defvar desktop-save-mode)              ; In `desktop.el'
 (defvar desktop-save)                   ; In `desktop.el'
 (defvar dired-actual-switches)          ; In `dired.el'
 (defvar eww-local-regex)                ; In `eww.el' (Emacs 25+)
 (defvar eww-search-prefix)              ; In `eww.el' (Emacs 25+)
 (defvar gnus-article-current)           ; In `gnus-sum.el'
+(defvar grep-history)                   ; In `grep.el' (Emacs 22+)
+(defvar icicle-bookmark-completing-p)   ; In `icicles-var.el'
 (defvar icicle-candidate-properties-alist) ; In `icicles-var.el'
 (defvar icicle-completion-candidates)   ; In `icicles-var.el'
 (defvar icicle-mode)                    ; In `icicle-mode.el'
 (defvar kmacro-counter-format-start)    ; In `kmacro.el'
 (defvar kmacro-ring)                    ; In `kmacro.el'
 (defvar Man-arguments)                  ; In `man.el'
+(defvar Man-notify-method)              ; In `man.el'
 (defvar org-store-link-functions)       ; In `org.el'
+(defvar orig-buff)                      ; In `crosshairs.el'
 (defvar read-file-name-completion-ignore-case) ; Emacs 23+
+(defvar repeat-previous-repeated-command) ; In `repeat.el'
+(defvar repeat-message-function)        ; In `repeat.el'
 (defvar last-repeatable-command)        ; In `repeat.el'
 (defvar w3m-current-title)              ; In `w3m.el'
 (defvar w3m-current-url)                ; In `w3m.el'
@@ -1014,7 +1028,7 @@ Automatic bookmarking is done by `bmkp-automatic-bookmark-mode'."
     "*Non-nil means that bookmarks are created periodically automatically.
 Setting this variable directly does not take effect;
 use either \\[customize] or command `bmkp-automatic-bookmark-mode'."
-    :set        (lambda (symbol value) (bmkp-automatic-bookmark-mode (if value 1 -1)))
+    :set        (lambda (_symbol value) (bmkp-automatic-bookmark-mode (if value 1 -1)))
     :initialize 'custom-initialize-default
     :type 'boolean :group 'bookmark-plus :require 'bookmark+))
 
@@ -1191,15 +1205,15 @@ of the following, if available:
 
 ;;;###autoload (autoload 'bmkp-default-handlers-for-file-types "bookmark+")
 (defcustom bmkp-default-handlers-for-file-types
-  (and (require 'dired-x)               ; It in turn requires `dired-aux.el'
+  (and (require 'dired-x)         ; It in turn requires `dired-aux.el'
        (eval-when-compile (when (< emacs-major-version 21) (require 'cl))) ;; `dolist', for Emacs 20
        (let ((assns  ()))
          (dolist (shell-assn  dired-guess-shell-alist-user)
            (push (cons (car shell-assn)
                        `(lambda (bmk)
-                         (dired-run-shell-command
-                          (dired-shell-stuff-it ,(cadr shell-assn) (list (bookmark-get-filename bmk))
-                           nil nil))))
+                          (dired-run-shell-command
+                           (dired-shell-stuff-it ,(cadr shell-assn) (list (bookmark-get-filename bmk))
+                                                 nil nil))))
                  assns))
          assns))
   "*File associations for bookmark handlers used for indirect bookmarks.
@@ -1229,8 +1243,8 @@ given file name does not match this option, and if
 in the default handler.  For that it uses `dired-guess-default' and
 \(Emacs 23+ only) mailcap entries, in that order."
   :type '(alist :key-type
-          regexp :value-type
-          (sexp :tag "Shell command (string) or Emacs function (symbol or lambda form)"))
+                regexp :value-type
+                (sexp :tag "Shell command (string) or Emacs function (symbol or lambda form)"))
   :group 'bookmark-plus)
 
 ;;;###autoload (autoload 'bmkp-desktop-default-directory "bookmark+")
@@ -1382,7 +1396,7 @@ If an integer, then use a menu only if there are fewer bookmark
 ;;;###autoload (autoload 'bmkp-new-bookmark-default-names "bookmark+")
 (defcustom bmkp-new-bookmark-default-names
   (let ((fns  '((lambda () (let ((ff  (function-called-at-point)))
-                             (and ff  (symbolp ff)  (symbol-name ff)))))))
+                        (and ff  (symbolp ff)  (symbol-name ff)))))))
     (when (fboundp 'region-or-non-nil-symbol-name-nearest-point) ; Defined in `thingatpt+.el'.
       (setq fns  (cons 'region-or-non-nil-symbol-name-nearest-point fns)))
     fns)
@@ -1470,9 +1484,12 @@ as part of the bookmark definition."
 If nil show only beginning of region."
   :type 'boolean :group 'bookmark-plus)
 
+;; The default value corresponds to what's used by `bmkp-bmenu-sort-by-bookmark-type' (`s k').
+;;
 ;;;###autoload (autoload 'bmkp-sort-comparer "bookmark+")
-(defcustom bmkp-sort-comparer '((bmkp-info-node-name-cp bmkp-gnus-cp bmkp-url-cp bmkp-local-file-type-cp)
-                                bmkp-alpha-p) ; This corresponds to `s k'.
+(defcustom bmkp-sort-comparer '((bmkp-info-node-name-cp bmkp-url-cp bmkp-gnus-cp
+                                                        bmkp-local-file-type-cp bmkp-handler-cp)
+                                bmkp-alpha-p)
   ;; $$$$$$ An alternative default value: `bmkp-alpha-p', which corresponds to `s n'.
   "*Predicate or predicates for sorting (comparing) bookmarks.
 This defines the default sort for bookmarks in the bookmark list.
@@ -1538,12 +1555,12 @@ Using a single predicate or FINAL-PRED makes it easy to reuse an
 existing predicate that returns nil or non-nil.
 
 You can also convert a PRED-type predicate (which returns (t), (nil),
-or nil) into an ordinary predicate, by using function
+or nil) into an ordinary predicate, by using macro
 `bmkp-make-plain-predicate'.  That lets you reuse elsewhere, as
 ordinary predicates, any PRED-type predicates you define.
 
 For example, this defines a plain predicate to compare by URL:
- (defalias 'bmkp-url-p (bmkp-make-plain-predicate 'bmkp-url-cp))
+ (defalias 'bmkp-url-p (bmkp-make-plain-predicate bmkp-url-cp))
 
 Note: As a convention, predefined Bookmark+ PRED-type predicate names
 have the suffix `-cp' (for \"component predicate\") instead of `-p'.
@@ -1562,10 +1579,10 @@ is tried and
           (const    :tag "None (do not sort)" nil)
           (function :tag "Sorting Predicate")
           (list     :tag "Sorting Multi-Predicate"
-           (repeat (function :tag "Component Predicate"))
-           (choice
-            (const    :tag "None" nil)
-            (function :tag "Final Predicate"))))
+                    (repeat (function :tag "Component Predicate"))
+                    (choice
+                     (const    :tag "None" nil)
+                     (function :tag "Final Predicate"))))
   :group 'bookmark-plus)
 
 ;;;###autoload (autoload 'bmkp-su-or-sudo-regexp "bookmark+")
@@ -1616,7 +1633,7 @@ current value of `default-directory' is used to find the file."
     "*Non-nil means that bookmarks are temporary (not recorded on disk).
 Setting this variable directly does not take effect;
 use either \\[customize] or command `bmkp-temporary-bookmarking-mode'."
-    :set (lambda (symbol value) (bmkp-temporary-bookmarking-mode (if value 1 -1)))
+    :set (lambda (_symbol value) (bmkp-temporary-bookmarking-mode (if value 1 -1)))
     :initialize 'custom-initialize-default
     :type 'boolean :group 'bookmark-plus :require 'bookmark+))
 
@@ -1855,12 +1872,10 @@ Each entry is a full tag: a cons whose car is a tag name, a string.
 This is set by function `bmkp-tags-list'.
 Use that function to update the value.")
 
-
-;; REPLACES ORIGINAL DOC STRING in `bookmark.el'.
-;;
-;; Doc string does not say that the file that was loaded is `bookmark-default-file'.
+;; Use this instead of either `bookmark-bookmarks-timestamp' (Emacs 27+)
+;;                         or `bookmarks-already-loaded' (< Emacs 27).
 ;;
-(defvar bookmarks-already-loaded nil
+(defvar bmkp-bookmarks-already-loaded nil
   "Non-nil means some bookmarks have been loaded during this Emacs session.")
 
 
@@ -1909,37 +1924,52 @@ Bookmarks created using vanilla Emacs (`bookmark.el'):
 Bookmarks created using Bookmark+ are the same as for vanilla Emacs,
 except for the following differences.
 
-1. Visit information is recorded, using entries `visits' and `time':
+1. Time of creation is recorded when you create a new bookmark:
+
+ (created . CREATION-TIME)
+
+ CREATION-TIME is an Emacs time representation, returned by function
+ `current-time'.
+
+2. Visit information is recorded, using entries `visits' and `time':
 
  (visits . NUMBER-OF-VISITS)
  (time . TIME-LAST-VISITED)
 
  NUMBER-OF-VISITS is a whole-number counter.
 
- TIME-LAST-VISITED is an Emacs time representation, such as is
- returned by function `current-time'.
+ TIME-LAST-VISITED is an Emacs time representation, returned by
+ `current-time'.
 
-2. The buffer name is recorded, using entry `buffer-name'.  It need
+3. The buffer name is recorded, using entry `buffer-name'.  It need
 not be associated with a file.
 
-3. If no file is associated with the bookmark, then FILENAME is
+4. If no file is associated with the bookmark, then FILENAME is
    `   - no file -'.
 
-4. Bookmarks can be tagged by users.  The tag information is recorded
+5. Bookmarks can be tagged by users.  The tag information is recorded
 using entry `tags':
 
  (tags . TAGS-ALIST)
 
  TAGS-ALIST is an alist with string keys.
 
-5. A bookmark can be simply a wrapper for a file, in which case it has
+6. A bookmark can be simply a wrapper for a file, in which case it has
 entry `file-handler' instead of `handler'.  When you \"jump\" to such
 a bookmark, the `file-handler' function or shell-command is applied to
 the `filename' entry.  Any `handler' entry present is ignored, as are
 entries such as `position'.  It is only the target file that is
 important.
 
-6. Bookmarks can have individual highlighting, provided by users.
+7. The HANDLER function, if present, and if you want the bookmark
+destination to be displayed, should display it.  The easiest, and
+generally best way for it to do this is simply to invoke the default
+handler, `bookmark-default-handler', at its end.  Handler function
+`bmkp-jump-man' does this at the end, for example:
+
+ (bookmark-default-handler (bmkp-get-bookmark bookmark))
+
+8. Bookmarks can have individual highlighting, provided by users.
 This overrides any default highlighting.
 
  (lighting . HIGHLIGHTING)
@@ -1953,7 +1983,7 @@ This overrides any default highlighting.
    `:when'  - A sexp to be evaluated.  Return value of `:no-light'
               means do not highlight.
 
-7. The following additional entries are used to record region
+9. The following additional entries are used to record region
 information.  When a region is bookmarked, POS represents the region
 start position.
 
@@ -1974,7 +2004,7 @@ bookmarked.
  `front-context-string' is the text that *follows* `position', but
  `front-context-region-string' *precedes* `end-position'.
 
-8. The following additional entries are used for a Dired bookmark.
+10. The following additional entries are used for a Dired bookmark.
 
  (dired-marked . MARKED-FILES)
  (dired-subdirs . INSERTED-SUBDIRS)
@@ -1986,7 +2016,7 @@ bookmarked.
  HIDDEN-SUBDIRS is the list of inserted subdirs that were hidden.
  SWITCHES is the string of `dired-listing-switches'.
 
-9. The following additional entries are used for a Gnus bookmark.
+11. The following additional entries are used for a Gnus bookmark.
 
  (group . GNUS-GROUP-NAME)
  (article . GNUS-ARTICLE-NUMBER)
@@ -1996,20 +2026,20 @@ bookmarked.
  GNUS-ARTICLE-NUMBER is the number of a Gnus article.
  GNUS-MESSAGE-ID is the identifier of a Gnus message.
 
-10. For a URL bookmark, FILENAME or LOCATION is a URL.
+12. For a URL bookmark, FILENAME or LOCATION is a URL.
 
-11. A sequence bookmark has this additional entry:
+13. A sequence bookmark has this additional entry:
 
  (sequence . COMPONENT-BOOKMARKS)
 
  COMPONENT-BOOKMARKS is the list of component bookmark names.
 
-12. A function bookmark has this additional entry, which records the
+14. A function bookmark has this additional entry, which records the
 FUNCTION:
 
  (function . FUNCTION)
 
-13. A bookmark-list bookmark has this additional entry, which records
+15. A bookmark-list bookmark has this additional entry, which records
 the state of buffer `*Bookmark List*' at the time it is created:
 
  (bookmark-list . STATE)
@@ -2331,6 +2361,8 @@ bookmark file.  Saving the file depends on `bookmark-save-flag'."
     (if (or no-overwrite  (not (setq bmk  (bmkp-get-bookmark-in-alist bname 'NOERROR))))
         (push (setq bmk  (cons bname data)) bookmark-alist) ; Add new bookmark.
       (bookmark-set-name bmk bname)     ; Overwrite existing bookmark.
+      (when (and (boundp 'bookmark-set-fringe-mark)  bookmark-set-fringe-mark) ; Emacs 28+
+        (bookmark--remove-fringe-mark bmk))
       (setcdr bmk data))
     ;; Put the full bookmark on its name as property `bmkp-full-record'.
     ;; Do this regardless of Emacs version and `bmkp-propertize-bookmark-names-flag'.
@@ -2340,8 +2372,7 @@ bookmark file.  Saving the file depends on `bookmark-save-flag'."
     ;; These two are the same as `add-to-list' with `EQ' (not available for Emacs 20-21).
     (unless (memq bmk bmkp-modified-bookmarks)
       (setq bmkp-modified-bookmarks  (cons bmk bmkp-modified-bookmarks)))
-    (when (and (boundp 'bmkp-setting-automatic-bmk-p)
-               (not (memq bmk bmkp-automatic-bookmarks)))
+    (when (and (boundp 'bmkp-setting-automatic-bmk-p)  (not (memq bmk bmkp-automatic-bookmarks)))
       (setq bmkp-automatic-bookmarks  (cons bmk bmkp-automatic-bookmarks)))
     (setq bookmark-current-bookmark  bname)
     (unless no-refresh-p (bmkp-refresh/rebuild-menu-list bmk no-msg-p))
@@ -2696,7 +2727,7 @@ A prefix argument changes the behavior as follows:
 Bookmark properties listed in option `bmkp-properties-to-keep' are not
 overwritten when you set an existing bookmark.  Their existing values
 are kept.  Other properties may be updated.  Properties such as
-`position' and `visit' are typically updated, for example, to record
+`position' and `visits' are typically updated, for example, to record
 the new position and the number of visits.
 
 Use `\\[bookmark-delete]' to remove bookmarks (you give it a name, and it removes
@@ -2713,79 +2744,80 @@ From Lisp code:
   do not refresh/rebuild the bookmark-list display."
   (interactive (list nil current-prefix-arg t))
   (unwind-protect
-       (progn
-         (bookmark-maybe-load-default-file)
-         (setq bookmark-current-point   (point)) ; `bookmark-current-point' is a free var here.
-         ;; Do not set these if they are already set in some other buffer (e.g gnus-art).
-         (unless (and bookmark-yank-point  bookmark-current-buffer)
-           (save-excursion (skip-chars-forward " ") (setq bookmark-yank-point  (point)))
-           (setq bookmark-current-buffer  (current-buffer)))
-         (let* ((record   (bookmark-make-record))
-                (defname  (cond ((and (eq major-mode 'eww-mode)
-                                      (fboundp 'bmkp-make-eww-record) ; Emacs 25+
-                                      (bmkp-eww-title)))
-                                ((eq major-mode 'w3m-mode) w3m-current-title)
-                                ((eq major-mode 'gnus-summary-mode) (elt (gnus-summary-article-header) 1))
-                                ((memq major-mode '(Man-mode woman-mode))
-                                 (buffer-substring (point-min) (save-excursion (goto-char (point-min))
-                                                                               (skip-syntax-forward "^ ")
-                                                                               (point))))
-                                (t nil)))
-                (defname  (and defname  (bmkp-replace-regexp-in-string "\n" " " defname)))
-                (bname    (or name  (bmkp-completing-read-lax
-                                     "Set bookmark"
-                                     (bmkp-new-bookmark-default-names defname)
-                                     (and (or (not parg)  (consp parg)) ; No numeric PARG: all bookmarks.
-                                          (bmkp-specific-buffers-alist-only))
-                                     nil 'bookmark-history (or (not parg)  (consp parg))))))
-           ;; BNAME should not be "" now, since `bmkp-new-bookmark-default-names' should provide default(s)
-           ;; and empty input to `bmkp-completing-read-lax' returns the default.  But just in case...
-           (when (and (string= bname "")  defname) (setq bname  defname))
-           (while (string= "" bname)
-             (message "Enter a NON-EMPTY bookmark name") (sit-for 2)
-             (setq bname  (bmkp-completing-read-lax
-                           "Set bookmark"
-                           (bmkp-new-bookmark-default-names defname)
-                           (and (or (not parg)  (consp parg)) ; No numeric PARG: all bookmarks.
-                                (bmkp-specific-buffers-alist-only))
-                           nil 'bookmark-history (or (not parg)  (consp parg)))))
-           (let ((old-bmk  (bmkp-get-bookmark-in-alist bname 'NOERROR))
-                 old-prop)
-             (when (and interactivep  bmkp-bookmark-set-confirms-overwrite-p  (atom parg)  old-bmk
-                        (not (y-or-n-p (format "Overwrite bookmark `%s'? " bname))))
-               (error "OK, canceled"))
-             (when old-bmk              ; Restore props of existing bookmark per `bmkp-properties-to-keep'.
-               (dolist (prop  bmkp-properties-to-keep)
-                 (bookmark-prop-set record prop (bookmark-prop-get old-bmk prop)))))
-           ;; Maybe make bookmark temporary.
-           ;; Pass RECORD, not BNAME, so `bookmark-prop-set' DTRT in `bmkp-make-bookmark-temporary'.
-           (if bmkp-autotemp-all-when-set-p
-               (bmkp-make-bookmark-temporary record)
-             (catch 'bookmark-set
-               (dolist (pred  bmkp-autotemp-bookmark-predicates)
-                 (when (and (functionp pred)  (funcall pred bname))
-                   (bmkp-make-bookmark-temporary record)
-                   (throw 'bookmark-set t)))))
-           (bookmark-store bname (cdr record) (consp parg) no-refresh-p (not interactivep))
-           (when (and interactivep  bmkp-prompt-for-tags-flag)
-             (bmkp-add-tags bname (bmkp-read-tags-completing) 'NO-UPDATE-P)) ; Do not update here.
-           (cl-case (and (boundp 'bmkp-auto-light-when-set)  bmkp-auto-light-when-set)
-             (autonamed-bookmark       (when (bmkp-autonamed-bookmark-p bname)
-                                         (bmkp-light-bookmark bname)))
-             (non-autonamed-bookmark   (unless (bmkp-autonamed-bookmark-p bname)
-                                         (bmkp-light-bookmark bname)))
-             (any-bookmark             (bmkp-light-bookmark bname))
-             (autonamed-in-buffer      (bmkp-light-bookmarks (bmkp-autonamed-this-buffer-alist-only)
-                                                             nil interactivep))
-             (non-autonamed-in-buffer  (bmkp-light-bookmarks
-                                        (bmkp-remove-if #'bmkp-autonamed-this-buffer-bookmark-p
-                                                        (bmkp-this-buffer-alist-only))
-                                        nil interactivep))
-             (all-in-buffer            (bmkp-light-this-buffer nil interactivep)))
-           (run-hooks 'bmkp-after-set-hook)
-           (if bookmark-use-annotations
-               (bookmark-edit-annotation bname)
-             (goto-char bookmark-current-point)))) ; `bookmark-current-point' is a free var here.
+      (progn
+        (bookmark-maybe-load-default-file)
+        (setq bookmark-current-point   (point)) ; `bookmark-current-point' is a free var here.
+        ;; Do not set these if they are already set in some other buffer (e.g gnus-art).
+        (unless (and bookmark-yank-point  bookmark-current-buffer)
+          (save-excursion (skip-chars-forward " ") (setq bookmark-yank-point  (point)))
+          (setq bookmark-current-buffer  (current-buffer)))
+        (let* ((record   (bookmark-make-record))
+               (defname  (cond ((and (eq major-mode 'eww-mode)
+                                     (fboundp 'bmkp-make-eww-record) ; Emacs 25+
+                                     (bmkp-eww-title)))
+                               ((eq major-mode 'w3m-mode) w3m-current-title)
+                               ((eq major-mode 'gnus-summary-mode) (elt (gnus-summary-article-header) 1))
+                               ((memq major-mode '(Man-mode woman-mode))
+                                (buffer-substring (point-min) (save-excursion (goto-char (point-min))
+                                                                              (skip-syntax-forward "^ ")
+                                                                              (point))))
+                               (t nil)))
+               (defname  (and defname  (bmkp-replace-regexp-in-string "\n" " " defname)))
+               (bname    (or name  (bmkp-completing-read-lax
+                                    "Set bookmark"
+                                    (bmkp-new-bookmark-default-names defname)
+                                    (and (or (not parg)  (consp parg)) ; No numeric PARG: all bookmarks.
+                                         (bmkp-specific-buffers-alist-only))
+                                    nil 'bookmark-history (or (not parg)  (consp parg))))))
+          ;; BNAME should not be "" now, since `bmkp-new-bookmark-default-names' should provide default(s)
+          ;; and empty input to `bmkp-completing-read-lax' returns the default.  But just in case...
+          (when (and (string= bname "")  defname) (setq bname  defname))
+          (while (string= "" bname)
+            (message "Enter a NON-EMPTY bookmark name") (sit-for 2)
+            (setq bname  (bmkp-completing-read-lax
+                          "Set bookmark"
+                          (bmkp-new-bookmark-default-names defname)
+                          (and (or (not parg)  (consp parg)) ; No numeric PARG: all bookmarks.
+                               (bmkp-specific-buffers-alist-only))
+                          nil 'bookmark-history (or (not parg)  (consp parg)))))
+          (let ((old-bmk  (bmkp-get-bookmark-in-alist bname 'NOERROR)))
+            (when (and interactivep  bmkp-bookmark-set-confirms-overwrite-p  (atom parg)  old-bmk
+                       (not (y-or-n-p (format "Overwrite bookmark `%s'? " bname))))
+              (error "OK, canceled"))
+            (when old-bmk ; Restore props of existing bookmark per `bmkp-properties-to-keep'.
+              (dolist (prop  bmkp-properties-to-keep)
+                (bookmark-prop-set record prop (bookmark-prop-get old-bmk prop)))))
+          ;; Maybe make bookmark temporary.
+          ;; Pass RECORD, not BNAME, so `bookmark-prop-set' DTRT in `bmkp-make-bookmark-temporary'.
+          (if bmkp-autotemp-all-when-set-p
+              (bmkp-make-bookmark-temporary record)
+            (catch 'bookmark-set
+              (dolist (pred  bmkp-autotemp-bookmark-predicates)
+                (when (and (functionp pred)  (funcall pred bname))
+                  (bmkp-make-bookmark-temporary record)
+                  (throw 'bookmark-set t)))))
+          (bookmark-store bname (cdr record) (consp parg) no-refresh-p (not interactivep))
+          (when (and interactivep  bmkp-prompt-for-tags-flag)
+            (bmkp-add-tags bname (bmkp-read-tags-completing) 'NO-UPDATE-P)) ; Do not update here.
+          (cl-case (and (boundp 'bmkp-auto-light-when-set)  bmkp-auto-light-when-set)
+            (autonamed-bookmark       (when (bmkp-autonamed-bookmark-p bname)
+                                        (bmkp-light-bookmark bname)))
+            (non-autonamed-bookmark   (unless (bmkp-autonamed-bookmark-p bname)
+                                        (bmkp-light-bookmark bname)))
+            (any-bookmark             (bmkp-light-bookmark bname))
+            (autonamed-in-buffer      (bmkp-light-bookmarks (bmkp-autonamed-this-buffer-alist-only)
+                                                            nil interactivep))
+            (non-autonamed-in-buffer  (bmkp-light-bookmarks
+                                       (bmkp-remove-if #'bmkp-autonamed-this-buffer-bookmark-p
+                                                       (bmkp-this-buffer-alist-only))
+                                       nil interactivep))
+            (all-in-buffer            (bmkp-light-this-buffer nil interactivep)))
+          (run-hooks 'bmkp-after-set-hook)
+          (if bookmark-use-annotations
+              (bookmark-edit-annotation bname)
+            (goto-char bookmark-current-point))) ; `bookmark-current-point' is a free var here.
+        (when (and (boundp 'bookmark-set-fringe-mark)  bookmark-set-fringe-mark) ; Emacs 28+
+          (bookmark--set-fringe-mark)))
     (setq bookmark-yank-point     nil
           bookmark-current-buffer nil)))
 
@@ -2843,6 +2875,8 @@ words are stripped out."
 ;;
 ;; 1. Separate renaming of obsolete default bookmark name (do it even if not loading the default file).
 ;; 2. Load `bmkp-last-as-first-bookmark-file' if it is non-nil.
+;; 3. Use `bmkp-bookmarks-already-loaded', not `bookmarks-already-loaded' (Emacs < 27).
+;; 4. Don't use/support `bookmark-watch-bookmark-file' (Emacs 27+).
 ;;
 (defun bookmark-maybe-load-default-file ()
   "If bookmarks have not yet been loaded, load them.
@@ -2854,11 +2888,11 @@ Otherwise, load `bookmark-default-file'."
   (when (and (file-exists-p bookmark-old-default-file)  (not (file-exists-p bookmark-default-file)))
     (rename-file bookmark-old-default-file bookmark-default-file))
   (let ((file-to-load  (bmkp-default-bookmark-file)))
-    (and (not bookmarks-already-loaded)
+    (and (not bmkp-bookmarks-already-loaded)
          (null bookmark-alist)
          (file-readable-p file-to-load)
          (bookmark-load file-to-load t 'nosave)
-         (setq bookmarks-already-loaded  t))))
+         (setq bmkp-bookmarks-already-loaded  t))))
 
 
 ;; REPLACES ORIGINAL in `bookmark.el'.
@@ -2899,6 +2933,13 @@ DISPLAY-FUNCTION is as in `bookmark-jump'."
                                                                         (bmkp-this-buffer-alist-only))
                                                         nil 'MSG))
         (all-in-buffer            (bmkp-light-this-buffer nil 'MSG))))
+    ;; $$$$$$ Not sure we should place the vanilla fringe mark in this case.  Try it for a while
+    (when (and (boundp 'bookmark-set-fringe-mark)  bookmark-set-fringe-mark) ; Emacs 28+
+      (let ((overlays  (overlays-in (point-at-bol) (1+ (point-at-bol))))
+            temp found)
+        (while (and (not found)  (setq temp  (pop overlays)))
+          (when (eq 'bookmark (overlay-get temp 'category)) (setq found  t)))
+        (unless found (bookmark--set-fringe-mark))))
     (let ((orig-buff  (current-buffer))) ; Used by `crosshairs-highlight'.
       (run-hooks 'bookmark-after-jump-hook))
     (let ((jump-fn  (bmkp-get-tag-value bookmark "bmkp-jump")))
@@ -3255,6 +3296,7 @@ candidate."
 ;;    But we don't require that BOOKMARK have a name, so calls from vanilla or other code aren't bothered.
 ;; 2. Pass full bookmark to the various "get" functions.
 ;; 3. Location returned can be a buffer name.
+;; 4. If both file and buffer names are recorded, respect option `bmkp-bmenu-show-file-not-buffer-flag'.
 ;;
 (defun bookmark-location (bookmark)
   "Return a description of the location of BOOKMARK.
@@ -3264,15 +3306,27 @@ bookmark record, then it is NOT looked up in `bookmark-alist' (it need
 not belong).  If it is a name without that property then it is looked
 up in `bookmark-alist'.
 
-Look first for entry `location', then for entry `buffer-name' or
-`buffer', then for entry `filename'.  Return the first such entry
-found, or \"-- Unknown location --\" if none is found."
+If BOOKMARK records a `location' entry, then use that.
+
+Otherwise, look for buffer and file names.  If only one of those is
+recorded then use that.
+
+If both buffer and file name are recorded then respect option
+`bmkp-bmenu-show-file-not-buffer-flag': If non-nil then use the file
+name, otherwise use the buffer name.
+
+If no `location', buffer, or file name is recorded then use \"--
+Unknown location --\"."
   (bookmark-maybe-load-default-file)
   (setq bookmark  (bookmark-get-bookmark bookmark))
   (or (bookmark-prop-get bookmark 'location)
-      (bmkp-get-buffer-name bookmark)   ; Entry `buffer-name'.
-      (bookmark-prop-get bookmark 'buffer) ; Entry `buffer'.
-      (bookmark-get-filename bookmark)
+      (if bmkp-bmenu-show-file-not-buffer-flag
+          (or (bookmark-get-filename bookmark)
+              (bmkp-get-buffer-name bookmark) ; Entry `buffer-name'.
+              (bookmark-prop-get bookmark 'buffer)) ; Entry `buffer'.
+        (or (bmkp-get-buffer-name bookmark)
+            (bookmark-prop-get bookmark 'buffer)
+            (bookmark-get-filename bookmark)))
       "-- Unknown location --"))
 
 
@@ -3385,7 +3439,7 @@ candidate.  In this way, you can delete multiple bookmarks."
   (interactive (list (bookmark-completing-read "Delete bookmark" (bmkp-default-bookmark-name))))
 
   ;; $$$$$$ Instead of loading unconditionally, maybe we should just try to delete conditionally?
-  ;; IOW, why not (when bookmarks-already-loaded BODY) instead of `bookmark-maybe-load-default-file'?
+  ;; IOW, why not (when bmkp-bookmarks-already-loaded BODY) instead of `bookmark-maybe-load-default-file'?
   ;; If it gets called on a hook that gets run before ever loading, then should probably do nothing.
   ;; Leaving it as is for now (2011-04-06).
   (bookmark-maybe-load-default-file)
@@ -3394,6 +3448,7 @@ candidate.  In this way, you can delete multiple bookmarks."
     (when bname                         ; Do nothing if BOOKMARK does not represent a bookmark.
       (bookmark-maybe-historicize-string bname)
       (when (fboundp 'bmkp-unlight-bookmark) (bmkp-unlight-bookmark bmk 'NOERROR))
+      (when (fboundp 'bookmark--remove-fringe-mark) (bookmark--remove-fringe-mark bmk)) ; Emacs 28+
       (setq bookmark-alist                (delq bmk bookmark-alist)
             bmkp-latest-bookmark-alist    (delq bmk bmkp-latest-bookmark-alist)
             bmkp-automatic-bookmarks      (delq bmk bmkp-automatic-bookmarks)
@@ -3507,8 +3562,8 @@ contain a `%s' construct, so that it can be passed along with FILE to
         (rem-all-p                (or (not (> emacs-major-version 20)) ; Cannot: (not (boundp 'print-circle)).
                                       (not bmkp-propertize-bookmark-names-flag)))
         (existing-buf             (get-file-buffer file))
-        (emacs-lisp-mode-hook     nil)  ; Avoid inserting automatic file header if existing empty file, so
-        (lisp-mode-hook           nil)  ; better chance `bookmark-maybe-upgrade-file-format' signals error.
+        (emacs-lisp-mode-hook     nil) ; Avoid inserting automatic file header if existing empty file, so
+        (lisp-mode-hook           nil) ; better chance `bookmark-maybe-upgrade-file-format' signals error.
         bname fname last-fname start end)
     (when (file-directory-p file) (error "`%s' is a directory, not a file" file))
     (message msg (abbreviate-file-name file))
@@ -3538,20 +3593,20 @@ contain a `%s' construct, so that it can be passed along with FILE to
         (unless (bmkp-temporary-bookmark-p bmk)
           (setq bname  (bookmark-name-from-full-record bmk)
                 fname  (bookmark-get-filename bmk))
-          (cond (rem-all-p              ; Remove text properties from bookmark name and file name.
+          (cond (rem-all-p ; Remove text properties from bookmark name and file name.
                  (set-text-properties 0 (length bname) () bname)
                  (when fname (set-text-properties 0 (length fname) () fname)))
-                (t                      ; Remove property `face' and any Icicles internal properties.
+                (t ; Remove property `face' and any Icicles internal properties.
                  (remove-text-properties 0 (length bname) '(face                     nil
-                                                            display                  nil
-                                                            help-echo                nil
-                                                            rear-nonsticky           nil
-                                                            icicle-fancy-candidates  nil
-                                                            icicle-mode-line-help    nil
-                                                            icicle-special-candidate nil
-                                                            icicle-user-plain-dot    nil
-                                                            icicle-whole-candidate   nil
-                                                            invisible                nil)
+                                                                                     display                  nil
+                                                                                     help-echo                nil
+                                                                                     rear-nonsticky           nil
+                                                                                     icicle-fancy-candidates  nil
+                                                                                     icicle-mode-line-help    nil
+                                                                                     icicle-special-candidate nil
+                                                                                     icicle-user-plain-dot    nil
+                                                                                     icicle-whole-candidate   nil
+                                                                                     invisible                nil)
                                          bname)
                  (when (boundp 'icicle-candidate-properties-alist) ; Multi-completion indexes + text props.
                    (dolist (entry  icicle-candidate-properties-alist)
@@ -3677,14 +3732,15 @@ Return non-nil if the bookmark was renamed, nil otherwise."
 ;;       `bmkp-flagged-bookmarks', `bmkp-bmenu-omitted-bookmarks', `bmkp-bmenu-filter-function'.
 ;;     * If `bmkp-last-as-first-bookmark-file', then update it to FILE and save it to disk.
 ;;  5. If the bookmark-file buffer already existed, do not kill it after loading.
-;;  6. Set `bookmarks-already-loaded' regardless of FILE (not just `bookmark-default-file').
+;;  6. Set `bmkp-bookmarks-already-loaded' regardless of FILE (not just `bookmark-default-file').
 ;;  7. Update `bmkp-sorted-alist' (it's a cache).
 ;;  8. Final msg says whether overwritten.
 ;;  9. Run `bmkp-read-bookmark-file-hook' after reading the bookmark file.
 ;; 10. Call `bmkp-bmenu-refresh-menu-list' at end, if interactive.
+;; 11. Don't support optional 4th arg DEFAULT (Emacs 27+).
 ;;
 ;;;###autoload (autoload 'bookmark-load "bookmark+")
-(defun bookmark-load (file &optional overwrite batchp) ; Bound to `C-x x l'
+(defun bookmark-load (file &optional overwrite batchp &rest _IGNORED) ; Bound to `C-x x l'
   "Load bookmarks from FILE (which must be in the standard format).
 Return the list of bookmarks read from FILE.
 Without a prefix argument (argument OVERWRITE is nil), add the newly
@@ -3697,11 +3753,12 @@ bookmarks already defined in your Emacs session, numeric suffixes
 \"<2>\", \"<3>\",... are appended as needed to the names of those new
 bookmarks to distinguish them.
 
-With a prefix argument, switch the bookmark file currently used,
-*replacing* all currently existing bookmarks with the newly loaded
-bookmarks.  In this case, the value of `bmkp-current-bookmark-file'is
-backed up to `bmkp-last-bookmark-file' and then changed to FILE, so
-bookmarks will subsequently be saved to FILE.
+With a prefix argument (non-nil arg OVERWRITE), switch the bookmark
+file currently used, *replacing* all currently existing bookmarks with
+the newly loaded bookmarks.  In this case, the value of
+`bmkp-current-bookmark-file'is backed up to `bmkp-last-bookmark-file'
+and then changed to FILE, so bookmarks will subsequently be saved to
+FILE.
 
 If `bmkp-last-as-first-bookmark-file' is non-nil and is not FILE then
 it is changed to FILE and saved persistently, so that the next Emacs
@@ -3787,8 +3844,8 @@ bookmark files that were created using the bookmark functions."
             (t
              (bookmark-import-new-list blist)
              (setq bookmark-alist-modification-count  (1+ bookmark-alist-modification-count))))
-      (setq bookmarks-already-loaded  t ; Systematically, whenever any file is loaded.
-            bmkp-sorted-alist         (bmkp-sort-omit bookmark-alist))
+      (setq bmkp-bookmarks-already-loaded  t ; Systematically, whenever any file is loaded.
+            bmkp-sorted-alist              (bmkp-sort-omit bookmark-alist))
       (when (boundp 'bookmark-file-coding-system) ; Emacs 25.2+
         (setq bookmark-file-coding-system  buffer-file-coding-system))
       (run-hook-with-args 'bmkp-read-bookmark-file-hook blist file)
@@ -3891,7 +3948,7 @@ in the current sort order."
         (oframe  (selected-frame)))
     (save-selected-window
       (pop-to-buffer (get-buffer-create "*Bookmark Annotations*"))
-      (let ((buffer-read-only  nil))    ; Because buffer might already exist, in view mode.
+      (let ((buffer-read-only  nil)) ; Because buffer might already exist, in view mode.
         (delete-region (point-min) (point-max))
         ;; (Could use `bmkp-annotated-alist-only' here instead.)
         (dolist (full-record  (if (equal (buffer-name obuf) bmkp-bmenu-buffer)
@@ -3906,7 +3963,7 @@ in the current sort order."
               (put-text-property (line-beginning-position 0) (line-end-position 0) 'face 'bmkp-heading)
               (insert ann) (unless (bolp) (insert "\n\n")))))
         (goto-char (point-min))
-        (if (> emacs-major-version 23)  ; Incompatible change introduced in Emacs 24.1
+        (if (> emacs-major-version 23) ; Incompatible change introduced in Emacs 24.1
             (view-mode-enter)
           (view-mode-enter (cons (selected-window) (cons nil 'quit-window))))
         (when (fboundp 'fit-frame-if-one-window) (fit-frame-if-one-window))))
@@ -3948,7 +4005,7 @@ A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
    (lambda (bmk)
-     (lexical-let* ((tgs       tags)
+     (bmkp-lexlet* ((tgs       tags)
                     (bmk-tags  (bmkp-get-tags bmk)))
        (and bmk-tags  (bmkp-every (lambda (tag) (member (bmkp-tag-name tag) tgs)) bmk-tags))))
    bookmark-alist))
@@ -3960,7 +4017,7 @@ Does not include bookmarks that have no tags.
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((rg  regexp))
+   (bmkp-lexlet ((rg  regexp))
      (lambda (bmk)
        (let ((bmk-tags  (bmkp-get-tags bmk)))
          (and bmk-tags
@@ -3979,7 +4036,7 @@ With non-nil arg PREFIX, the bookmark names must all have that PREFIX."
   (bookmark-maybe-load-default-file)
   (if (not prefix)
       (bmkp-remove-if-not #'bmkp-autofile-bookmark-p bookmark-alist)
-    (bmkp-remove-if-not (lexical-let ((pref  prefix)) (lambda (bmk) (bmkp-autofile-bookmark-p bmk pref)))
+    (bmkp-remove-if-not (bmkp-lexlet ((pref  prefix)) (lambda (bmk) (bmkp-autofile-bookmark-p bmk pref)))
                         bookmark-alist)))
 
 (put 'bmkp-autofile-all-tags-alist-only 'bmkp-read-arg 'bmkp-read-tags-completing)
@@ -3988,10 +4045,10 @@ With non-nil arg PREFIX, the bookmark names must all have that PREFIX."
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((tgs  tags))
+   (bmkp-lexlet ((tgs  tags))
      (lambda (bmk)
        (and (bmkp-autofile-bookmark-p bmk)  (bmkp-get-tags bmk)
-            (bmkp-every (lexical-let ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag))) tgs))))
+            (bmkp-every (bmkp-lexlet ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag))) tgs))))
    bookmark-alist))
 
 (put 'bmkp-autofile-all-tags-regexp-alist-only 'bmkp-read-arg 'bmkp-read-regexp)
@@ -4000,7 +4057,7 @@ A new list is returned (no side effects)."
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((rg  regexp))
+   (bmkp-lexlet ((rg  regexp))
      (lambda (bmk)
        (and (bmkp-autofile-bookmark-p bmk)
             (let ((bmk-tags  (bmkp-get-tags bmk)))
@@ -4015,7 +4072,7 @@ A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
    (lambda (bmk) (and (bmkp-autofile-bookmark-p bmk)
-                      (bmkp-some (lexical-let ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tags)))
+                      (bmkp-some (bmkp-lexlet ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tags)))
    bookmark-alist))
 
 (put 'bmkp-autofile-some-tags-regexp-alist-only 'bmkp-read-arg 'bmkp-read-regexp)
@@ -4024,7 +4081,7 @@ A new list is returned (no side effects)."
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((rg  regexp))
+   (bmkp-lexlet ((rg  regexp))
      (lambda (bmk) (and (bmkp-autofile-bookmark-p bmk)
                         (bmkp-some (lambda (tag) (bmkp-string-match-p rg (bmkp-tag-name tag)))
                                    (bmkp-get-tags bmk)))))
@@ -4107,10 +4164,10 @@ A new list is returned (no side effects)."
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((tgs  tags))
+   (bmkp-lexlet ((tgs  tags))
      (lambda (bmk)
        (and (bmkp-file-bookmark-p bmk)  (bmkp-get-tags bmk)
-            (bmkp-every (lexical-let ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
+            (bmkp-every (bmkp-lexlet ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
    bookmark-alist))
 
 (put 'bmkp-file-all-tags-regexp-alist-only 'bmkp-read-arg 'bmkp-read-regexp)
@@ -4119,7 +4176,7 @@ A new list is returned (no side effects)."
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((rg  regexp))
+   (bmkp-lexlet ((rg  regexp))
      (lambda (bmk)
        (and (bmkp-file-bookmark-p bmk)
             (let ((bmk-tags  (bmkp-get-tags bmk)))
@@ -4133,9 +4190,9 @@ A new list is returned (no side effects)."
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((tgs  tags))
+   (bmkp-lexlet ((tgs  tags))
      (lambda (bmk) (and (bmkp-file-bookmark-p bmk)
-                        (bmkp-some (lexical-let ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
+                        (bmkp-some (bmkp-lexlet ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
    bookmark-alist))
 
 (put 'bmkp-file-some-tags-regexp-alist-only 'bmkp-read-arg 'bmkp-read-regexp)
@@ -4144,7 +4201,7 @@ A new list is returned (no side effects)."
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((rg  regexp))
+   (bmkp-lexlet ((rg  regexp))
      (lambda (bmk) (and (bmkp-file-bookmark-p bmk)
                         (bmkp-some (lambda (tag) (bmkp-string-match-p rg (bmkp-tag-name tag)))
                                    (bmkp-get-tags bmk)))))
@@ -4166,10 +4223,10 @@ Include only files and subdir that are in `default-directory'.
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((tgs  tags))
+   (bmkp-lexlet ((tgs  tags))
      (lambda (bmk)
        (and (bmkp-file-this-dir-bookmark-p bmk)  (bmkp-get-tags bmk)
-            (bmkp-every (lexical-let ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
+            (bmkp-every (bmkp-lexlet ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
    bookmark-alist))
 
 (put 'bmkp-file-this-dir-all-tags-regexp-alist-only 'bmkp-read-arg 'bmkp-read-regexp)
@@ -4179,7 +4236,7 @@ Include only files and subdir that are in `default-directory'.
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((rg  regexp))
+   (bmkp-lexlet ((rg  regexp))
      (lambda (bmk)
        (and (bmkp-file-this-dir-bookmark-p bmk)
             (let ((bmk-tags  (bmkp-get-tags bmk)))
@@ -4194,9 +4251,9 @@ Include only files and subdir that are in `default-directory'.
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((tgs  tags))
+   (bmkp-lexlet ((tgs  tags))
      (lambda (bmk) (and (bmkp-file-this-dir-bookmark-p bmk)
-                        (bmkp-some (lexical-let ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
+                        (bmkp-some (bmkp-lexlet ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))  tgs))))
    bookmark-alist))
 
 (put 'bmkp-file-this-dir-some-tags-regexp-alist-only 'bmkp-read-arg 'bmkp-read-regexp)
@@ -4206,7 +4263,7 @@ Include only files and subdir that are in `default-directory'.
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
   (bmkp-remove-if-not
-   (lexical-let ((rg  regexp))
+   (bmkp-lexlet ((rg  regexp))
      (lambda (bmk) (and (bmkp-file-this-dir-bookmark-p bmk)
                         (bmkp-some (lambda (tag) (bmkp-string-match-p rg (bmkp-tag-name tag)))
                                    (bmkp-get-tags bmk)))))
@@ -4398,9 +4455,9 @@ A new list is returned (no side effects)."
   "`bookmark-alist', but with only bookmarks having some tags in TAGS.
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
-  (bmkp-remove-if-not (lexical-let ((tgs  tags))
+  (bmkp-remove-if-not (bmkp-lexlet ((tgs  tags))
                         (lambda (bmk)
-                          (bmkp-some (lexical-let ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))
+                          (bmkp-some (bmkp-lexlet ((bk  bmk)) (lambda (tag) (bmkp-has-tag-p bk tag)))
                                      tgs)))
                       bookmark-alist))
 
@@ -4409,7 +4466,7 @@ A new list is returned (no side effects)."
   "`bookmark-alist', but with only bookmarks having some tags match REGEXP.
 A new list is returned (no side effects)."
   (bookmark-maybe-load-default-file)
-  (bmkp-remove-if-not (lexical-let ((rg  regexp))
+  (bmkp-remove-if-not (bmkp-lexlet ((rg  regexp))
                         (lambda (bmk)
                           (bmkp-some (lambda (tag) (bmkp-string-match-p rg (bmkp-tag-name tag)))
                                      (bmkp-get-tags bmk))))
@@ -4426,7 +4483,7 @@ Note: Bookmarks created by vanilla Emacs do not record the buffer
 name.  They are therefore excluded from the returned alist."
   (unless buffers  (setq buffers  (list (buffer-name))))
   (bookmark-maybe-load-default-file)
-  (bmkp-remove-if-not (lexical-let ((bufs  buffers))
+  (bmkp-remove-if-not (bmkp-lexlet ((bufs  buffers))
                         (lambda (bmk)
                           (and (not (bmkp-desktop-bookmark-p       bmk)) ; Exclude these
                                (not (bmkp-bookmark-file-bookmark-p bmk))
@@ -4445,7 +4502,7 @@ It defaults to a singleton list with the current buffer's file name,
 A new list is returned (no side effects)."
   (unless files  (setq files  (and (buffer-file-name)  (list (buffer-file-name)))))
   (bookmark-maybe-load-default-file)
-  (bmkp-remove-if-not (lexical-let ((ff  files))
+  (bmkp-remove-if-not (bmkp-lexlet ((ff  files))
                         (lambda (bmk)
                           (let ((bf  (bookmark-get-filename bmk))) 
                             (and bf
@@ -4663,18 +4720,21 @@ of names described above for Emacs 23+."
                                                  (setq bookmark-yank-point  (point)))
                                  (substring regname 0 (min bmkp-bookmark-name-length-max
                                                            (length regname)))))))
-          (if (< emacs-major-version 23) (setq defs  defname) (add-to-list 'defs defname))))
+          (if (< emacs-major-version 23)
+              (setq defs  defname)
+            ;; This is the same as `add-to-list' with `EQ' (not available for Emacs 20-21).
+            (unless (memq defname defs) (setq defs  (cons defname defs))))))
       ;; Names provided by option `bmkp-new-bookmark-default-names',
       ;; plus `bookmark-current-bookmark' and `bookmark-buffer-name'.
       (unless (and (< emacs-major-version 23)  defs)
         (catch 'bmkp-new-bookmark-default-names
           (dolist (fn  bmkp-new-bookmark-default-names)
-            (when (functionp fn)        ; Be sure it is defined and is a function.
+            (when (functionp fn) ; Be sure it is defined and is a function.
               (setq val  (funcall fn))
               (when (and (stringp val)  (not (string= "" val)))
                 (setq val  (bmkp-replace-regexp-in-string "\n" " " val))
                 (if (> emacs-major-version 22)
-                    (add-to-list 'defs val)
+                    (unless (memq val defs) (setq defs  (cons val defs)))
                   (throw 'bmkp-new-bookmark-default-names (setq defs  val)))))))
         (when (and (< emacs-major-version 23)  (null defs))
           (setq defs  (or bookmark-current-bookmark  (bookmark-buffer-name))))
@@ -5123,14 +5183,14 @@ by `bmkp-bmenu-edit-marked' (`\\<bookmark-bmenu-mode-map>\\[bmkp-bmenu-edit-mark
             (setq edited-bookmarks  (condition-case err
                                         (save-excursion (goto-char (point-min))  (read (current-buffer)))
                                       (error (throw 'bmkp-edit-bookmark-records-send
-                                               (error-message-string err)))))
+                                                    (error-message-string err)))))
             (unless orig-bmks (error "No marked bookmarks now - edits must correspond to currently marked"))
             (cond ((not (listp edited-bookmarks))
                    (throw 'bmkp-edit-bookmark-records-send "Not a list of bookmarks"))
                   ((not (= (length edited-bookmarks) bmkp-edit-bookmark-records-number))
                    (throw 'bmkp-edit-bookmark-records-send
-                     (format "Need %d bookmarks, but there seem to be %d"
-                             bmkp-edit-bookmark-records-number (length edited-bookmarks)))))
+                          (format "Need %d bookmarks, but there seem to be %d"
+                                  bmkp-edit-bookmark-records-number (length edited-bookmarks)))))
             (let ((bookmark-save-flag  (and (not bmkp-count-multi-mods-as-one-flag)
                                             bookmark-save-flag))) ; Save only after `dolist' and update.
               (dolist (edited-bmk  edited-bookmarks)
@@ -5291,22 +5351,25 @@ The edited value must be a list each of whose elements is either a
 BOOKMARK is a bookmark name or a bookmark record."
   (interactive (list (bookmark-completing-read "Edit tags for bookmark" (bmkp-default-bookmark-name))))
   (setq bookmark  (bmkp-get-bookmark-in-alist bookmark))
-  (let* ((btags    (bmkp-get-tags bookmark))
-         (bmkname  (bmkp-bookmark-name-from-record bookmark))
-         (edbuf    (format "*Edit Tags for Bookmark `%s'*" bmkname)))
+  (let* ((btags  (bmkp-get-tags bookmark))
+         (bname  (bmkp-bookmark-name-from-record bookmark))
+         (edbuf  (format "*Edit Tags for Bookmark `%s'*" bname)))
+    (set-text-properties 0 (length bname) nil bname) ; Strip properties from (copied) bookmark name string.
+    (bookmark-maybe-historicize-string bname)
     (setq bmkp-return-buffer  (current-buffer))
-    (bmkp-with-output-to-plain-temp-buffer edbuf
-      (princ
-       (substitute-command-keys
-        (concat ";; Edit tags for bookmark\n;;\n;; \"" bmkname "\"\n;;\n"
-                ";; The edited value must be a list each of whose elements is\n"
-                ";; either a string or a cons whose key is a string.\n;;\n"
-                ";; DO NOT MODIFY THESE COMMENTS.\n;;\n"
-                ";; Type \\<bmkp-edit-tags-mode-map>`\\[bmkp-edit-tags-send]' when done.\n\n")))
-      (let ((print-circle  bmkp-propertize-bookmark-names-flag)
-            (print-gensym  bmkp-propertize-bookmark-names-flag))
-        (pp btags))
-      (goto-char (point-min)))
+    (bmkp-with-output-to-plain-temp-buffer
+     edbuf
+     (princ ";; Edit tags for bookmark\n;;\n;; ")
+     (prin1 bname)                      ; In case bookmark name contains " chars etc.
+     (princ "\n;;\n;; The edited value must be a list each of whose elements is\n")
+     (princ ";; either a string or a cons whose key is a string.\n;;\n")
+     (princ ";; DO NOT MODIFY THESE COMMENTS.\n;;\n")
+     (princ (substitute-command-keys
+             ";; Type \\<bmkp-edit-tags-mode-map>`\\[bmkp-edit-tags-send]' when done.\n\n"))
+     (let ((print-circle  bmkp-propertize-bookmark-names-flag)
+           (print-gensym  bmkp-propertize-bookmark-names-flag))
+       (pp btags))
+     (goto-char (point-min)))
     (pop-to-buffer edbuf)
     (buffer-enable-undo)
     (with-current-buffer (get-buffer edbuf) (bmkp-edit-tags-mode))))
@@ -5391,7 +5454,7 @@ really associated with a buffer."
                  (not (bmkp-function-bookmark-p       bmk))
                  (not (bmkp-variable-list-bookmark-p  bmk))
                  (setq buf  (bmkp-get-buffer-name     bmk)))
-        (add-to-list 'bufs buf)))
+        (unless (member buf bufs) (setq bufs  (cons buf bufs)))))
     bufs))
 
 (defun bmkp-file-names ()
@@ -5401,11 +5464,11 @@ This excludes the pseudo file name `bmkp-non-file-filename'."
         file)
     (dolist (bmk  bookmark-alist)
       (when (and (setq file  (bookmark-get-filename bmk))  (not (equal file bmkp-non-file-filename)))
-        (add-to-list 'files file)))
+        (unless (member file files) (setq files  (cons file files)))))
     files))
 
 ;;;###autoload (autoload 'bmkp-bookmark-set-confirm-overwrite "bookmark+")
-(defun bmkp-bookmark-set-confirm-overwrite (&optional name parg interactivep) ; Bound `C-x r m', `C-x x c m'.
+(defun bmkp-bookmark-set-confirm-overwrite (&optional _n _p _intp _no-r-p) ; Bound `C-x r m', `C-x x c m'.
   "Set a bookmark named NAME, then run `bmkp-after-set-hook'.
 This is the same as `bookmark-set', except that with no prefix arg you
 are asked to confirm overwriting an existing bookmark of the same
@@ -5561,19 +5624,18 @@ Raise an error if the entire string was not used."
     (if more-left (error "Can't read whole string") (car read-data))))
 
 ;;;###autoload (autoload 'bmkp-jump-to-list "bookmark+")
-(defun bmkp-jump-to-list (bookmark
-                          &optional position msgp) ; Bound globally to `C-x j C-j', `C-x x C-j'
+(defun bmkp-jump-to-list (bookmark) ; Bound globally to `C-x j C-j', `C-x x C-j'
   "Jump to BOOKMARK entry in `*Bookmark List*'.
 You are prompted for BOOKMARK (a bookmark name).
 If you use library `bookmark+-lit.el':
  * The defaults for BOOKMARK are the lighted bookmarks at point.
  * A prefix arg means only lighted bookmarks at point are candidates."
   (interactive (let* ((litp   (fboundp 'bmkp-bookmarks-lighted-at-point))
-                      (lbmks  (and litp  (bmkp-bookmarks-lighted-at-point (point) nil 'MSG)))
+                      (lbmks  (and litp  (bmkp-bookmarks-lighted-at-point)))
                       (bmk    (bookmark-completing-read (if current-prefix-arg "Lighted bookmark" "Bookmark")
                                                         (and litp  (if current-prefix-arg (car lbmks) lbmks))
                                                         (and current-prefix-arg  lbmks))))
-                 (list bmk (point) t)))
+                 (list bmk)))
   (pop-to-buffer (get-buffer-create bmkp-bmenu-buffer))
   (bookmark-bmenu-list)
   (bmkp-bmenu-goto-bookmark-named (setq bmkp-last-bmenu-bookmark  bookmark)))
@@ -5763,7 +5825,7 @@ When called from Lisp:
   file)
 
 ;;;###autoload (autoload 'bmkp-switch-to-bookmark-file-this-file/buffer "bookmark+")
-(defun bmkp-switch-to-bookmark-file-this-file/buffer (file &optional batchp) ; Bound to `C-x x C-l'
+(defun bmkp-switch-to-bookmark-file-this-file/buffer (file) ; Bound to `C-x x C-l'
   "Switch to a bookmark file for bookmarks in this file or buffer.
 If visiting a file, the bookmarks are â€˜bmkp-this-file-alist-only’.
 Otherwise, they are â€˜bmkp-this-buffer-alist-only’.
@@ -5831,11 +5893,8 @@ non-nil, require confirmation if the file already exists."
                                     "Creating new, empty bookmark file `%s'...")))
   file)
 
-(defun bmkp-write-alist-bookmarks-to-file (alist file &optional addp)
-  "Write bookmarks in ALIST to FILE.
-By default, replace FILE with only the ALIST bookmarks.
-Non-nil ADDP means just add the bookmarks to those already in
-FILE (updating them if already present)."
+(defun bmkp-write-alist-bookmarks-to-file (alist file)
+  "Write bookmarks in ALIST to FILE."
   (when (file-directory-p file) (error "`%s' is a directory, not a file" file))
   (let ((bookmark-save-flag                 nil) ; Inhibit auto-saving for the duration.
         (bookmark-alist                     bookmark-alist)
@@ -5858,17 +5917,13 @@ FILE (updating them if already present)."
           (bookmark-write-file file))))))
 
 ;;;###autoload (autoload 'bmkp-save-bookmarks-this-file/buffer "bookmark+")
-(defun bmkp-save-bookmarks-this-file/buffer (file &optional addp batchp) ; Bound to `C-x x C-s'
+(defun bmkp-save-bookmarks-this-file/buffer (file &optional batchp) ; Bound to `C-x x C-s'
   "Save bookmarks defined for the current file/buffer to FILE.
 If visiting a file, the bookmarks are â€˜bmkp-this-file-alist-only’.
 Otherwise, they are â€˜bmkp-this-buffer-alist-only’.
 
 You are prompted for FILE, the bookmark file to save to.
 
-By default, replace FILE with only the bookmarks for the current
-file/buffer.  With a prefix arg, just add the bookmarks to those
-already in FILE (updating them if already present).
-
 This does NOT make FILE the current bookmark file.  To do that, use
 `bmkp-switch-to-bookmark-file-this-file/buffer'."
   (interactive
@@ -5887,7 +5942,7 @@ This does NOT make FILE the current bookmark file.  To do that, use
              (not batchp)
              (not (y-or-n-p (format "Save to NEW, EMPTY bookmark file `%s'? " file))))
     (error "OK - canceled"))
-  (bmkp-write-alist-bookmarks-to-file (bmkp-this-file/buffer-alist-only) file addp))
+  (bmkp-write-alist-bookmarks-to-file (bmkp-this-file/buffer-alist-only) file))
 
 ;;;###autoload (autoload 'bmkp-crosshairs-highlight "bookmark+")
 (defun bmkp-crosshairs-highlight ()     ; Not bound
@@ -5901,11 +5956,7 @@ You need library `crosshairs.el' to use this command."
   (when (and bmkp-crosshairs-flag  (> emacs-major-version 21)) ; No-op for Emacs 20-21.
     (unless (condition-case nil (require 'crosshairs nil t) (error nil))
       (error "You need library `crosshairs.el' to use this command"))
-    (unless mark-active
-      (let ((crosshairs-overlay-priority  (and (boundp 'bmkp-light-priorities)
-                                               (1+ (apply #'max
-                                                          (mapcar #'cdr bmkp-light-priorities))))))
-        (crosshairs-highlight)))))
+    (unless mark-active (crosshairs-highlight))))
 
 ;;;###autoload (autoload 'bmkp-choose-navlist-from-bookmark-list "bookmark+")
 (defun bmkp-choose-navlist-from-bookmark-list (bookmark &optional alist) ; Bound to `C-x x B'
@@ -6286,7 +6337,7 @@ message."
   (defvar bmkp-isearch-bookmarks nil
     "Bookmarks whose locations are to be incrementally searched.")
 
-  (defun bmkp-isearch-next-bookmark-buffer (&optional bookmark wrap)
+  (defun bmkp-isearch-next-bookmark-buffer (&optional _buffer wrap)
     "Return the next buffer in a series of bookmark buffers.
 Used as a value for `multi-isearch-next-buffer-function', for Isearch
 of multiple bookmarks.
@@ -6395,18 +6446,19 @@ determining the tags to use per option `bmkp-tags-for-completion'."
         (prompt1                                     "Tag (RET for each, empty input to finish): ")
         (prompt2                                     "Tag: ")
         (icicle-unpropertize-completion-result-flag  t)
-        tag old-tag)
+        tag)
     ;; Make a new candidates alist, with just one entry per tag name.  The original cdr is discarded.
     (dolist (full-tag  (or candidate-tags
                            (and (not update-tags-alist-p)  bmkp-tags-alist) ; Use cached list.
                            (bmkp-tags-list)))
-      (add-to-list 'cands (list (if (consp full-tag) (car full-tag) full-tag))))
+      (setq full-tag  (list (if (consp full-tag) (car full-tag) full-tag)))
+      (unless (member full-tag cands) (setq cands  (cons full-tag cands))))
     (setq tag    (completing-read prompt1 cands nil require-match nil 'bmkp-tag-history)
           cands  (delete (assoc tag cands) cands)) ; Tag read is no longer a candidate.
     (while (not (string= "" tag))
-      (if (member tag btags)            ; User can enter it more than once, if not REQUIRE-MATCH.
+      (if (member tag btags) ; User can enter it more than once, if not REQUIRE-MATCH.
           (message "Tag `%s' already included" tag)
-        (push tag btags))               ; But we only add it once.
+        (push tag btags))            ; But we only add it once.
       (setq tag    (completing-read prompt2 cands nil require-match nil 'bmkp-tag-history)
             cands  (delete (assoc tag cands) cands)))
     (nreverse btags)))
@@ -6457,17 +6509,18 @@ and return only the tags for the currently loaded bookmarks."
     (when (or (eq opt-tags 'current)  current-only-p)  (setq opt-tags '(current)))
     (dolist (entry  opt-tags)
       (cl-typecase entry
-        (cons                           ; A bookmark file
-         (when (eq 'bmkfile (car entry))
-           (setq entry  (cdr entry)
-                 tags   (append tags (bmkp-tags-in-bookmark-file entry names-only-p)))))
-        (string (add-to-list 'tags (if names-only-p entry (list entry))))
-        (symbol (when (eq entry 'current)
-                  (bookmark-maybe-load-default-file)
-                  (dolist (bmk  bookmark-alist)
-                    (setq bmk-tags  (bmkp-get-tags bmk))
-                    (dolist (tag  bmk-tags)
-                      (add-to-list 'tags (if names-only-p (bmkp-tag-name tag) (bmkp-full-tag tag)))))))))
+        (cons    (when (eq 'bmkfile (car entry)) ; A bookmark file
+                   (setq entry  (cdr entry)
+                         tags   (append tags (bmkp-tags-in-bookmark-file entry names-only-p)))))
+        (string  (let ((ent  (if names-only-p entry (list entry))))
+                   (unless (member ent tags) (setq tags  (cons ent tags)))))
+        (symbol  (when (eq entry 'current)
+                   (bookmark-maybe-load-default-file)
+                   (dolist (bmk  bookmark-alist)
+                     (setq bmk-tags  (bmkp-get-tags bmk))
+                     (dolist (tag  bmk-tags)
+                       (let ((tg  (if names-only-p (bmkp-tag-name tag) (bmkp-full-tag tag))))
+                         (unless (member tg tags) (setq tags  (cons tg tags))))))))))
     (unless names-only-p (setq bmkp-tags-alist  tags))
     tags))
 
@@ -6487,14 +6540,15 @@ Otherwise, return an alist of the full tags."
         (message "Cannot read bookmark file `%s'" file)
       (with-current-buffer (let ((enable-local-variables  ())) (find-file-noselect file))
         (goto-char (point-min))
-        (condition-case nil             ; Check whether it's a valid bookmark file.
+        (condition-case nil ; Check whether it's a valid bookmark file.
             (progn (bookmark-maybe-upgrade-file-format)
                    (unless (listp (setq bmk-alist  (bookmark-alist-from-buffer))) (error "")))
           (error (message "Not a valid bookmark file: `%s'" file))))
       (dolist (bmk  bmk-alist)
         (setq bmk-tags  (bmkp-get-tags bmk))
         (dolist (tag  bmk-tags)
-          (add-to-list 'tags (if names-only-p (bmkp-tag-name tag) (bmkp-full-tag tag))))))
+          (let ((tg  (if names-only-p (bmkp-tag-name tag) (bmkp-full-tag tag))))
+            (unless (member tg tags) (setq tags  (cons tg tags)))))))
     tags))
 
 (defun bmkp-tag-name (tag)
@@ -6556,8 +6610,8 @@ is negative."
     (dolist (tag  tags)  (unless (or (assoc tag newtags)  (member tag newtags))  (push tag newtags)))
     (bookmark-prop-set bookmark 'tags newtags)
     (unless no-update-p
-      (bmkp-tags-list) ; Update the tags cache.
-      (bmkp-maybe-save-bookmarks)  ; Increments `bookmark-alist-modification-count'.
+      (bmkp-tags-list)                  ; Update the tags cache.
+      (bmkp-maybe-save-bookmarks) ; Increments `bookmark-alist-modification-count'.
       (bmkp-refresh/rebuild-menu-list bookmark (not msg-p))) ; So display `t' and `*' markers for BOOKMARK.
     (let ((nb-added  (- (length newtags) olen)))
       (when msg-p (message "%d tags added. Now: %S" nb-added ; Echo just the tag names.
@@ -6580,8 +6634,8 @@ If any of the BOOKMARKS has no tag named TAG, then add one with VALUE."
   (let ((bookmark-save-flag  (and (not bmkp-count-multi-mods-as-one-flag)
                                   bookmark-save-flag))) ; Save only after `dolist'.
     (dolist (bmk  bookmarks) (bmkp-set-tag-value bmk tag value 'NO-UPDATE-P)))
-  (bmkp-tags-list)                      ; Update the tags cache.
-  (bmkp-maybe-save-bookmarks)           ; Increments `bookmark-alist-modification-count'.
+  (bmkp-tags-list)            ; Update the tags cache.
+  (bmkp-maybe-save-bookmarks) ; Increments `bookmark-alist-modification-count'.
   (bmkp-refresh/rebuild-menu-list nil (not msg-p)))
 
 ;;;###autoload (autoload 'bmkp-set-tag-value "bookmark+")
@@ -6639,7 +6693,7 @@ is negative."
          (olen     (length remtags)))
     (if (null remtags)
         (when msg-p (message "Bookmark has no tags to remove")) ; Do nothing if bookmark has no tags.
-      (setq remtags  (bmkp-remove-if (lexical-let ((tgs  tags))
+      (setq remtags  (bmkp-remove-if (bmkp-lexlet ((tgs  tags))
                                        (lambda (tag)
                                          (if (atom tag) (member tag tgs) (member (car tag) tgs))))
                                      remtags))
@@ -6675,8 +6729,8 @@ Non-interactively:
   (let ((bookmark-save-flag  (and (not bmkp-count-multi-mods-as-one-flag)
                                   bookmark-save-flag))) ; Save only after `dolist'.
     (dolist (bmk  (bookmark-all-names)) (bmkp-remove-tags bmk tags 'NO-UPDATE-P)))
-  (bmkp-tags-list)                      ; Update the tags cache (only once, at end).
-  (bmkp-maybe-save-bookmarks)           ; Increments `bookmark-alist-modification-count'.
+  (bmkp-tags-list)        ; Update the tags cache (only once, at end).
+  (bmkp-maybe-save-bookmarks) ; Increments `bookmark-alist-modification-count'.
   (bmkp-refresh/rebuild-menu-list nil (not msg-p)) ; So remove `t' markers when no tags anymore.
   (when msg-p (message "Tags removed from all bookmarks: %S" tags)))
 
@@ -7227,10 +7281,10 @@ Optional arg TEST is the test function.  If nil, test with `equal'.
 See `make-hash-table' for possible values of TEST."
       (setq test  (or test  #'equal))
       (let ((htable  (make-hash-table :test test)))
-        (cl-loop for elt in sequence
+        (loop for elt in sequence
               unless (gethash elt htable)
               do     (puthash elt elt htable)
-              finally return (cl-loop for i being the hash-values in htable collect i))))
+              finally return (loop for i being the hash-values in htable collect i))))
 
   (defun bmkp-remove-dups (list &optional use-eq)
     "Copy of LIST with duplicate elements removed.
@@ -7312,7 +7366,7 @@ Invoke `bmkp-completing-read-buffer-name' repeatedly till input is empty."
   (let ((buffs  ())
         buff)
     (while (and (setq buff  (bmkp-completing-read-buffer-name 'ALLOW-EMPTY))  (not (string= "" buff)))
-      (add-to-list 'buffs buff))
+      (unless (member buff buffs) (setq buffs  (cons buff buffs))))
     buffs))
 
 (defun bmkp-read-files ()
@@ -7322,7 +7376,7 @@ Invoke `bmkp-completing-read-file-name' repeatedly till input is empty."
         (files            ())
         file)
     (while (and (setq file  (bmkp-completing-read-file-name 'ALLOW-EMPTY))  (not (string= "" file)))
-      (add-to-list 'files file))
+      (unless (member file files) (setq files  (cons file files))))
     files))
 
 (defun bmkp-remove-if (pred xs)
@@ -7385,6 +7439,8 @@ binary data (weird chars)."
   (condition-case nil (upcase string) (error string)))
 
 ;; Thx to Michael Heerdegen and Michael Albinus for help with this one.
+;; See also Emacs bug #10489.
+;;
 (defun bmkp-same-file-p (file1 file2)
   "Return non-nil if FILE1 and FILE2 name the same file.
 If either name is not absolute, then it is expanded relative to
@@ -7400,6 +7456,7 @@ If either name is not absolute, then it is expanded relative to
     (and (equal remote1 remote2)
          (if (fboundp 'file-equal-p)
              (file-equal-p file1 file2)
+           ;; Need to use `expand-file-name' because prior to Emacs 24 `file-true-name' doesn't expand name.
            (let ((ft1  (file-truename (expand-file-name file1)))
                  (ft2  (file-truename (expand-file-name file2))))
              (eq t (compare-strings ft1 0 (length ft1) ft2 0 (length ft2) ignore-case-p)))))))
@@ -7451,20 +7508,6 @@ open a remote connection."
                                s2  (bmkp-upcase s2)))
   (string-lessp s1 s2))
 
-(defun bmkp-make-plain-predicate (pred &optional final-pred)
-  "Return a plain predicate that corresponds to component-predicate PRED.
-PRED and FINAL-PRED correspond to their namesakes in
-`bmkp-sort-comparer' (which see).
-
-PRED should return `(t)', `(nil)', or nil.
-
-Optional arg FINAL-PRED is the final predicate to use if PRED cannot
-decide (returns nil).  If FINAL-PRED is nil, then `bmkp-alpha-p', the
-plain-predicate equivalent of `bmkp-alpha-cp' is used as the final
-predicate."
-  `(lambda (b1 b2) (let ((res  (funcall ',pred b1 b2)))
-                     (if res (car res) (funcall ',(or final-pred  'bmkp-alpha-p) b1 b2)))))
-
 (defun bmkp-repeat-command (command)
   "Repeat COMMAND."
   (require 'repeat)                   ; Define its vars before we let-bind them.
@@ -7558,7 +7601,7 @@ Keys are compared for sorting using `equal'.
 
 If optional arg OMIT is non-nil, then it is a list of keys.  Omit from
 the return value any elements with keys in the list."
-  (lexical-let ((new-alist  (bmkp-remove-omitted alist omit))
+  (bmkp-lexlet ((new-alist  (bmkp-remove-omitted alist omit))
                 (sort-fn    (and bmkp-sort-comparer  (if (and (not (functionp bmkp-sort-comparer))
                                                               (consp bmkp-sort-comparer))
                                                          'bmkp-multi-sort
@@ -7590,7 +7633,7 @@ elements with keys in list OMIT."
 ;;; Keys are compared for sorting using `equal'.
 ;;; If optional arg OMIT is non-nil, then omit from the return value any
 ;;; elements with keys in list OMIT."
-;;;   (lexical-let ((new-alist  (bmkp-remove-assoc-dups alist omit))
+;;;   (bmkp-lexlet ((new-alist  (bmkp-remove-assoc-dups alist omit))
 ;;;                (sort-fn  (and bmkp-sort-comparer  (if (and (not (functionp bmkp-sort-comparer))
 ;;;                                                     (consp bmkp-sort-comparer))
 ;;;                                                            'bmkp-multi-sort
@@ -7886,8 +7929,7 @@ If either is a record then it need not belong to `bookmark-alist'."
   (setq b1  (bmkp-get-bookmark b1)
         b2  (bmkp-get-bookmark b2))
   (let ((buf1  (bmkp-get-buffer-name b1))
-        (buf2  (bmkp-get-buffer-name b2))
-        f1 f2 t1 t2)
+        (buf2  (bmkp-get-buffer-name b2)))
     (setq buf1  (and buf1  (get-buffer buf1))
           buf2  (and buf2  (get-buffer buf2)))
     (cond ((and buf1 buf2)              ; Both buffers exist.   See whether they were accessed.
@@ -8759,7 +8801,7 @@ Non-interactively:
    refresh/rebuild the bookmark-list display
  - Non-nil MSG-P means display a message about the removal."
   (interactive
-   (lexical-let* ((pref
+   (bmkp-lexlet* ((pref
                    (and current-prefix-arg  (wholenump (prefix-numeric-value current-prefix-arg))
                         (read-string "Prefix for bookmark name: ")))
                   (tgs
@@ -8799,14 +8841,14 @@ Non-interactively, non-nil MSG-P means display a status message."
   (let ((bmks                (bmkp-autofile-alist-only prefix))
         (bookmark-save-flag  (and (not bmkp-count-multi-mods-as-one-flag)
                                   bookmark-save-flag)) ; Save only after `dolist'.
-        record tags)
+        tags)
     ;; Needs Bookmark+ version of `bookmark-delete', which accepts a bookmark, not just its name.
     (dolist (bmk  bmks)
       (when (and (setq tags  (assq 'tags (bmkp-bookmark-data-from-record bmk)))
                  (or (not tags)  (null (cdr tags))))
         (bookmark-delete bmk 'BATCHP)))) ; Do not refresh list here - do it after iterate.
-  (bmkp-tags-list)                      ; Update the tags cache now, after iterate.
-  (bmkp-maybe-save-bookmarks)           ; Increments `bookmark-alist-modification-count'.
+  (bmkp-tags-list)         ; Update the tags cache now, after iterate.
+  (bmkp-maybe-save-bookmarks) ; Increments `bookmark-alist-modification-count'.
   (bmkp-refresh/rebuild-menu-list nil (not msg-p))) ; Refresh now, after iterate.
 
 
@@ -9134,7 +9176,10 @@ Starting with Emacs 22, if the file is an image file then:
     (setq bookmark  (bmkp-get-bookmark bookmark))
     (help-setup-xref (list #'bmkp-describe-bookmark bookmark) (interactive-p))
     (let ((help-text  (bmkp-bookmark-description bookmark)))
-      (bmkp-with-help-window "*Help*" (princ help-text) (bmkp-add-jump-to-list-button bookmark))
+      (bmkp-with-help-window "*Help*"
+                             (princ help-text)
+                             (bmkp-add-describe-bookmark-internals-button bookmark)
+                             (bmkp-add-jump-to-list-button bookmark))
       (with-current-buffer "*Help*"
         (save-excursion
           (goto-char (point-min))
@@ -9181,7 +9226,6 @@ the file is an image file then the description includes the following:
         (bname            (bmkp-bookmark-name-from-record bookmark))
         (buf              (bmkp-get-buffer-name bookmark))
         (file             (bookmark-get-filename bookmark))
-        (image-p          (bmkp-image-bookmark-p bookmark))
         (location         (bookmark-prop-get bookmark 'location))
         (start            (bookmark-get-position bookmark))
         (end              (bmkp-get-end-position bookmark))
@@ -9266,19 +9310,27 @@ the file is an image file then the description includes the following:
                                              (bookmark-prop-get bookmark 'bookmark-file)))
                    (snippet-p        (format "Snippet for `kill-ring'.\n"))
                    (dired-p          (and file
-                                          (let ((switches  (bookmark-prop-get bookmark 'dired-switches))
-                                                (marked    (length (bookmark-prop-get bookmark
-                                                                                      'dired-marked)))
-                                                (inserted  (length (bookmark-prop-get bookmark
-                                                                                      'dired-subdirs)))
-                                                (hidden    (length (bookmark-prop-get bookmark
-                                                                                      'dired-hidden-dirs))))
+                                          (let* ((switches  (bookmark-prop-get bookmark 'dired-switches))
+                                                 (marked    (length (bookmark-prop-get bookmark
+                                                                                       'dired-marked)))
+                                                 (inserted  (length (bookmark-prop-get bookmark
+                                                                                       'dired-subdirs)))
+                                                 (hidden    (length (bookmark-prop-get bookmark
+                                                                                       'dired-hidden-dirs)))
+                                                 (dir-dir   (bookmark-prop-get bookmark 'dired-directory))
+                                                 (files     (and (consp dir-dir)  (cdr dir-dir))))
                                             (format "Dired%s:%s\t\t%s\nMarked:\t\t\t%s\n\
-Inserted subdirs:\t%s\nHidden subdirs:\t\t%s\n"
+Inserted subdirs:\t%s\nHidden subdirs:\t\t%s\n%s"
                                                     (if switches (format " `%s'" switches) "")
                                                     (if switches "" (format "\t"))
                                                     (expand-file-name file)
-                                                    marked inserted hidden))))
+                                                    marked inserted hidden
+                                                    (if (not files)
+                                                        ""
+                                                      (format "Explicit file list:\n  %s\n"
+                                                              (mapconcat #'identity
+                                                                         files
+                                                                         "\n  ")))))))
                    (non-file-p       (or (and location  (format "Location:\t\t%s\n" location))
                                          (and buf  (format "Buffer:\t\t\t%s\n" buf))))
                    (file             (concat (format "File:\t\t\t%s\n" (file-name-nondirectory file))
@@ -9320,11 +9372,26 @@ Inserted subdirs:\t%s\nHidden subdirs:\t\t%s\n"
 (when (and (> emacs-major-version 21)
            (condition-case nil (require 'help-mode nil t) (error nil))
            (get 'help-xref 'button-category-symbol)) ; In `button.el'
+  
   (define-button-type 'bmkp-jump-to-list-button
     :supertype 'help-xref
     'help-function #'bmkp-jump-to-list
     'help-echo
-    (purecopy "mouse-2, RET: Show in `*Bookmark List*'")))
+    (purecopy "mouse-2, RET: Show in `*Bookmark List*'"))
+
+  (define-button-type 'bmkp-describe-bookmark-button
+    :supertype 'help-xref
+    'help-function #'bmkp-describe-bookmark
+    'help-echo
+    (purecopy "mouse-2, RET: Show external form"))
+
+  (define-button-type 'bmkp-describe-bookmark-internals-button
+    :supertype 'help-xref
+    'help-function #'bmkp-describe-bookmark-internals
+    'help-echo
+    (purecopy "mouse-2, RET: Show internal form"))
+
+  )
 
 (defun bmkp-add-jump-to-list-button (bookmark)
   "Add a [Show in `*Bookmark List*'] button for BOOKMARK."
@@ -9341,6 +9408,38 @@ Inserted subdirs:\t%s\nHidden subdirs:\t\t%s\n"
                                  (bookmark-name-from-record bookmark))
         (insert "\n")))))
 
+(defun bmkp-add-describe-bookmark-button (bookmark)
+  "Add an [External Form] button for BOOKMARK."
+  (with-current-buffer "*Help*"
+    (let ((buffer-read-only  nil))
+      ;; Add button to go to the bookmark entry in `*Bookmark List*'.
+      ;; Not for Emacs 21.3 - its `help-insert-xref-button' signature is different.
+      (when (and (> emacs-major-version 21) ; In `help-mode.el'.
+                 (condition-case nil (require 'help-mode nil t) (error nil))
+                 (fboundp 'help-insert-xref-button))
+        (goto-char (point-max))
+        (insert "\n")
+        (help-insert-xref-button "[External Form]"
+                                 #'bmkp-describe-bookmark-button
+                                 (bookmark-name-from-record bookmark))
+        (insert "\n")))))
+
+(defun bmkp-add-describe-bookmark-internals-button (bookmark)
+  "Add an [Internal Form] button for BOOKMARK."
+  (with-current-buffer "*Help*"
+    (let ((buffer-read-only  nil))
+      ;; Add button to go to the bookmark entry in `*Bookmark List*'.
+      ;; Not for Emacs 21.3 - its `help-insert-xref-button' signature is different.
+      (when (and (> emacs-major-version 21) ; In `help-mode.el'.
+                 (condition-case nil (require 'help-mode nil t) (error nil))
+                 (fboundp 'help-insert-xref-button))
+        (goto-char (point-max))
+        (insert "\n")
+        (help-insert-xref-button "[Internal Form]"
+                                 #'bmkp-describe-bookmark-internals-button
+                                 (bookmark-name-from-record bookmark))
+        (insert "\n")))))
+
 ;; This is the same as `help-all-exif-data' in `help-fns+.el', but we avoid requiring that library.
 (defun bmkp-all-exif-data (file)
   "Return all EXIF data from FILE, using command-line tool `exiftool'."
@@ -9362,7 +9461,7 @@ If it is a record then it need not belong to `bookmark-alist'."
   (setq bookmark  (copy-sequence (bmkp-get-bookmark bookmark)))
   (help-setup-xref (list #'bmkp-describe-bookmark-internals bookmark) (interactive-p))
   (let* ((bname         (copy-sequence (bmkp-bookmark-name-from-record bookmark)))
-         (IGNORE        (set-text-properties 0 (length bname) nil bname)) ; Strip properties from name.
+         (_IGNORE       (set-text-properties 0 (length bname) nil bname)) ; Strip properties from name.
          (bmk           (cons bname (bmkp-bookmark-data-from-record bookmark))) ; Fake bmk with stripped name.
          (print-circle  bmkp-propertize-bookmark-names-flag) ; For `pp-to-string'
          (print-gensym  bmkp-propertize-bookmark-names-flag) ; For `pp-to-string'
@@ -9370,8 +9469,10 @@ If it is a record then it need not belong to `bookmark-alist'."
          (print-level   nil)            ; For `pp-to-string'
          (help-text     (format "Bookmark `%s'\n%s\n\n%s" bname (make-string (+ 11 (length bname)) ?-)
                                 (pp-to-string bmk))))
-    (bmkp-with-help-window "*Help*" (princ help-text))
-    (bmkp-add-jump-to-list-button bookmark)
+    (bmkp-with-help-window "*Help*"
+                           (princ help-text)
+                           (bmkp-add-describe-bookmark-button bookmark)
+                           (bmkp-add-jump-to-list-button bookmark))
     help-text))
 
 (defun bmkp-annotation-or-bookmark-description (bookmark)
@@ -9400,25 +9501,26 @@ Typically, these are all commands."
         (setq fns  (nreverse fns)
               fns  (sort fns 'string-lessp)))
       (when (buffer-live-p buf) (kill-buffer buf))
-      (bmkp-with-help-window "*Help*"
-        (princ "Bookmark Commands You Defined (in `bmkp-bmenu-commands-file')") (terpri)
-        (princ "------------------------------------------------------------------") (terpri)
-        (terpri)
-        (let ((non-dups  (bmkp-remove-dups fns)))
-          (dolist (fn  non-dups)
-            (if (and (fboundp (intern fn))  (fboundp 'help-insert-xref-button))
-                (with-current-buffer "*Help*"
-                  (goto-char (point-max))
-                  (help-insert-xref-button fn 'help-function (intern fn) (commandp (intern fn))))
-              (princ fn))
-            (let ((dups   (member fn fns)) ; Sorted, so all dups are together.
-                  (count  0))
-              (while (equal fn (car dups))
-                (setq count  (1+ count)
-                      dups   (cdr dups)))
-              (when (> count 1) (princ (format "  (%d times)" count))))
-            (terpri)))
-        (help-make-xrefs (current-buffer)))
+      (bmkp-with-help-window
+       "*Help*"
+       (princ "Bookmark Commands You Defined (in `bmkp-bmenu-commands-file')") (terpri)
+       (princ "------------------------------------------------------------------") (terpri)
+       (terpri)
+       (let ((non-dups  (bmkp-remove-dups fns)))
+         (dolist (fn  non-dups)
+           (if (and (fboundp (intern fn))  (fboundp 'help-insert-xref-button))
+               (with-current-buffer "*Help*"
+                 (goto-char (point-max))
+                 (help-insert-xref-button fn 'help-function (intern fn) (commandp (intern fn))))
+             (princ fn))
+           (let ((dups   (member fn fns)) ; Sorted, so all dups are together.
+                 (count  0))
+             (while (equal fn (car dups))
+               (setq count  (1+ count)
+                     dups   (cdr dups)))
+             (when (> count 1) (princ (format "  (%d times)" count))))
+           (terpri)))
+       (help-make-xrefs (current-buffer)))
       fns)))
 
 (defun bmkp-root-or-sudo-logged-p ()
@@ -9625,8 +9727,7 @@ Handler function for function bookmarks.
 BOOKMARK is a bookmark name or a bookmark record."
   (let ((fn  (bookmark-prop-get bookmark 'function)))
     (cond ((functionp fn) (funcall fn))
-          ((vectorp fn)
-           (execute-kbd-macro fn current-prefix-arg)))))
+          ((arrayp fn)    (execute-kbd-macro fn current-prefix-arg)))))
 
 (defun bmkp-make-bookmark-list-record ()
   "Create and return a bookmark-list bookmark record.
@@ -9704,22 +9805,22 @@ Non-interactively, non-nil MSG-P means display a status message."
         (progn (bookmark-maybe-upgrade-file-format)
                (unless (listp (bookmark-alist-from-buffer)) (error "")))
       (error (error "Not a valid bookmark file: `%s'" file))))
-  (let ((bookmark-make-record-function  (lexical-let ((ff  file))
+  (let ((bookmark-make-record-function  (bmkp-lexlet ((ff  file))
                                           (lambda () (bmkp-make-bookmark-file-record ff))))
         (bookmark-name                  (bmkp-completing-read-lax "Bookmark-file BOOKMARK name"
                                                                   file nil nil 'bookmark-history)))
     (bookmark-set bookmark-name 99 'INTERACTIVEP))
   (when msg-p (message "Set bookmark-file bookmark")))
 
-(defun bmkp-make-bookmark-file-record (bookmark-file)
+(defun bmkp-make-bookmark-file-record (bmk-file)
   "Create and return a bookmark-file bookmark record.
-Records the BOOKMARK-FILE name.
+Records the name of the bookmark-file, BMK-FILE.
 Adds a handler that tests the prefix arg and loads the bookmark file
 either as a replacement for the current bookmark file or as a
 supplement to it."
   `(,@(bookmark-make-record-default 'NO-FILE 'NO-CONTEXT nil nil 'NO-REGION)
-    (filename      . ,bookmark-file)
-    (bookmark-file . ,bookmark-file)
+    (filename      . ,bmk-file)
+    (bookmark-file . ,bmk-file)
     (handler       . bmkp-jump-bookmark-file)))
 
 (defun bmkp-jump-bookmark-file (bookmark &optional switchp batchp)
@@ -9803,7 +9904,7 @@ you can yank it using `C-y'."
   (interactive "r\nP\np")
   (unless (and mark-active  transient-mark-mode) (error "No active region"))
   (when (equal beg end) (error "Region is empty"))
-  (lexical-let ((text  (buffer-substring-no-properties beg end)))
+  (bmkp-lexlet ((text  (buffer-substring-no-properties beg end)))
     (let ((bookmark-make-record-function  (lambda ()
                                             `(,@(bookmark-make-record-default 'NO-FILE 'NO-CONTEXT)
                                               (text    . ,text)
@@ -9872,7 +9973,7 @@ the display of proxy candidates."
   (if nosavep
       (unless (bmkp-desktop-file-p desktop-file) (error "Not a desktop file: `%s'" desktop-file))
     (bmkp-desktop-save desktop-file))
-  (let ((bookmark-make-record-function  (lexical-let ((df  desktop-file))
+  (let ((bookmark-make-record-function  (bmkp-lexlet ((df  desktop-file))
                                           (lambda () (bmkp-make-desktop-record df))))
         (current-prefix-arg             99)) ; Use all bookmarks for completion, for `bookmark-set'.
     (call-interactively #'bookmark-set)))
@@ -9881,16 +9982,16 @@ the display of proxy candidates."
   "Save current desktop in DESKTOP-FILE."
   (let ((desktop-basefilename     (file-name-nondirectory desktop-file)) ; Emacs < 22
         (desktop-base-file-name   (file-name-nondirectory desktop-file)) ; Emacs 23+
-        (desktop-dir              (file-name-directory desktop-file))
+        (desk-dir                 (file-name-directory desktop-file))
         (desktop-restore-eager    t)    ; Don't bother with lazy restore.
         (desktop-globals-to-save  (bmkp-remove-if (lambda (elt) (memq elt bmkp-desktop-no-save-vars))
                                                   desktop-globals-to-save)))
     (cond ((< emacs-major-version 22)   ; Emacs 22 introduced `RELEASE' (locking).
-           (desktop-save desktop-dir))
+           (desktop-save desk-dir))
           ((or (< emacs-major-version 24)  (and (= emacs-major-version 24)  (< emacs-minor-version 4)))
-           (desktop-save desktop-dir 'RELEASE))
+           (desktop-save desk-dir 'RELEASE))
           (t                            ; Emacs 24.4 introduced `AUTOSAVE'.
-           (desktop-save desktop-dir 'RELEASE 'AUTOSAVE)))
+           (desktop-save desk-dir 'RELEASE 'AUTOSAVE)))
     (message "Desktop saved in `%s'" desktop-file)))
 
 (unless (fboundp 'desktop-full-file-name) ; Emacs < 22.  (This is the vanilla definition.)
@@ -10064,7 +10165,7 @@ BOOKMARK is a bookmark name or a bookmark record."
     ;; Release the desktop lock file in the same directory as DESKTOP-FILE.
     ;; This will NOT be the right thing to do if a desktop file different from DESKTOP-FILE
     ;; is currently locked in the same directory.
-    (let ((desktop-dir  (file-name-directory desktop-file)))
+    (let ((desktop-dirname  (file-name-directory desktop-file)))
       (when (fboundp 'desktop-release-lock) (desktop-release-lock))) ; Not defined for Emacs 20.
     (when (file-exists-p desktop-file) (delete-file desktop-file)))
   (bookmark-delete bookmark))
@@ -10271,7 +10372,7 @@ MSGP non-nil means possibly interact with the user, showing messages."
          fun)
     (dolist (bname  bookmark-names)
       (cond ((or (functionp (setq fun bname)) ; Function from Lisp.
-                 (vectorp fun)          ; Keyboard macro.
+                 (vectorp fun)                ; Keyboard macro.
                  (functionp (setq fun  (condition-case nil ; Function name from user
                                            (bmkp-read-from-whole-string bname)
                                          (error nil)))))
@@ -10288,11 +10389,11 @@ MSGP non-nil means possibly interact with the user, showing messages."
                                        (setq trial  (make-temp-name (substring bname 0 (- ii))))))
                                trial)))))
                (push (bmkp-bookmark-name-from-record (bmkp-make-function-bookmark fun-bmk-name fun))
-                     bnames)))
+                        bnames)))
             ((bmkp-sequence-bookmark-p bname) ; Sequence bookmark.
              (setq bnames (append (reverse (bookmark-prop-get bname 'sequence)) bnames)))
             ((stringp bname) (push bname bnames)) ; Bookmark name.
-            ((bmkp-get-bookmark bname 'NOERROR) ; Full bookmark.
+            ((bmkp-get-bookmark bname 'NOERROR)      ; Full bookmark.
              (push (bmkp-bookmark-name-from-record bname) bnames))
             (t (error "Bad BOOKMARK-NAMES arg to `bmkp-set-sequence-bookmark': `%S'"
                       bookmark-names)))) ; Punt.
@@ -10373,7 +10474,7 @@ Each entry in KMACROS thus has the form (MACRO COUNTER FORMAT)."
 Interactively, read the variables to save, using
 `bmkp-read-variables-completing'."
   (interactive (list (bmkp-read-variables-completing)))
-  (let ((bookmark-make-record-function  (lexical-let ((vars  variables))
+  (let ((bookmark-make-record-function  (bmkp-lexlet ((vars  variables))
                                           (lambda () (bmkp-make-variable-list-record vars)))))
     (call-interactively #'bookmark-set)))
 
@@ -10385,11 +10486,11 @@ VARS and VALS are corresponding lists of variables and their values.
 Optional arg BUFFER-NAME is the buffer name to use for the bookmark (a
 string).  This is useful if some of the variables are buffer-local.
 If BUFFER-NAME is nil, the current buffer name is recorded."
-  (eval `(multiple-value-bind ,vars ',vals
-          (let ((bookmark-make-record-function  (lexical-let ((vs   vars)
-                                                              (buf  buffer-name))
-                                                  (lambda () (bmkp-make-variable-list-record vs buf)))))
-            (bookmark-set ,bookmark-name)))))
+  (eval `(cl-multiple-value-bind ,vars ',vals
+           (let ((bookmark-make-record-function  (bmkp-lexlet ((vs   ',vars)
+                                                               (buf  ,buffer-name))
+                                                   (lambda () (bmkp-make-variable-list-record vs buf)))))
+             (bookmark-set ,bookmark-name)))))
 
 (defun bmkp-read-variables-completing (&optional option)
   "Read variable names with completion, and return them as a list of symbols.
@@ -10397,10 +10498,9 @@ Reads names one by one, until you hit `RET' twice consecutively.
 Non-nil argument OPTION means read only user option names."
   (bookmark-maybe-load-default-file)
   (let ((var   (bmkp-read-variable "Variable (RET for each, empty input to finish): " option))
-        (vars  ())
-        old-var)
+        (vars  ()))
     (while (not (string= "" var))
-      (add-to-list 'vars var)
+      (unless (member var vars) (setq vars  (cons var vars)))
       (setq var  (bmkp-read-variable "Variable: " option)))
     (nreverse vars)))
 
@@ -10451,12 +10551,13 @@ VARIABLES is the list of variables.  Each entry in VARIABLES is either
     (dolist (var  variables)
       (let ((val  (if (consp var) (cdr var) (symbol-value var))))
         (if (bmkp-readable-p val)
-            (add-to-list 'vars+vals (if (consp var) var (cons var val)))
-          (add-to-list 'unprintables var))))
+            (let ((v+vl  (if (consp var) var (cons var val))))
+              (unless (member v+vl vars+vals) (setq vars+vals  (cons v+vl vars+vals))))
+          (unless (memq var unprintables) (setq unprintables  (cons var unprintables))))))
     (when unprintables (message "Unsavable (unreadable) vars: %S" unprintables)  (sit-for 3))
     vars+vals))
 
-;; Same as `savehist-printable' in `savehist-20+.el', except added `print-circle' and `print-gensym' bindings.
+;; Similar to `savehist-printable' in `savehist.el', but with `print-circle' etc. bindings.
 (defun bmkp-readable-p (value)
   "Return non-nil if VALUE is Lisp-readable if printed using `prin1'."
   (cond ((numberp value))
@@ -10468,10 +10569,10 @@ VARIABLES is the list of variables.  Each entry in VARIABLES is either
                      (= 0 (next-property-change 0 value))))))
         (t (with-temp-buffer
              (condition-case nil
-                 (let ((print-readably  t)
-                       (print-level     nil)
-                       (print-circle    bmkp-propertize-bookmark-names-flag)
-                       (print-gensym    bmkp-propertize-bookmark-names-flag))
+                 (let ((cl-print-readably  t) ; In `cl-print.el'.
+                       (print-level        nil)
+                       (print-circle       bmkp-propertize-bookmark-names-flag)
+                       (print-gensym       bmkp-propertize-bookmark-names-flag))
                    (prin1 value (current-buffer)) ; Print value into a buffer and try to read back.
                    (read (point-min-marker))
                    t)
@@ -10692,7 +10793,7 @@ Don't forget to mention your Emacs and library versions."))
 The current buffer is assumed to be in `eww-mode' and visiting a URL."
     (interactive)
     (let* ((bname   (bmkp-eww-title))
-           (url     (bmkp-eww-url))
+           ;; (url     (bmkp-eww-url)) ; NOT USED (?)
            (bmk     (bmkp-get-bookmark bname 'NO-ERROR))
            (visits  (and bmk  (bookmark-prop-get bmk 'visits))))
       (when bname
@@ -10986,18 +11087,18 @@ BOOKMARK is a bookmark name or a bookmark record."
   "Create and return a Dired bookmark record."
   (let ((hidden-dirs  (save-excursion (dired-remember-hidden))))
     (unwind-protect
-         (let ((dir      (expand-file-name (if (consp dired-directory)
-                                               (file-name-directory (car dired-directory))
-                                             dired-directory)))
-               (subdirs  (bmkp-dired-subdirs))
-               (mfiles   (bmkp-dired-remember-*-marks (point-min) (point-max))))
-           `(,dir
-             ,@(bookmark-make-record-default 'NO-FILE)
-             (filename . ,dir) (dired-directory . ,dired-directory)
-             (dired-marked . ,mfiles) (dired-switches . ,dired-actual-switches)
-             (dired-subdirs . ,subdirs) (dired-hidden-dirs . ,hidden-dirs)
-             (handler . bmkp-jump-dired)))
-      (save-excursion                   ; Hide subdirs that were hidden.
+        (let ((dir      (expand-file-name (if (consp dired-directory)
+                                              (file-name-directory (car dired-directory))
+                                            dired-directory)))
+              (subdirs  (bmkp-dired-subdirs))
+              (mfiles   (bmkp-dired-remember-*-marks (point-min) (point-max))))
+          `(,dir
+            ,@(bookmark-make-record-default 'NO-FILE)
+            (filename . ,dir) (dired-directory . ,dired-directory)
+            (dired-marked . ,mfiles) (dired-switches . ,dired-actual-switches)
+            (dired-subdirs . ,subdirs) (dired-hidden-dirs . ,hidden-dirs)
+            (handler . bmkp-jump-dired)))
+      (save-excursion                 ; Hide subdirs that were hidden.
         (dolist (dir  hidden-dirs)  (when (dired-goto-subdir dir) (dired-hide-subdir 1)))))))
 
 ;;;###autoload (autoload 'bmkp-dired-subdirs "bookmark+")
@@ -11031,7 +11132,7 @@ BOOKMARK is a bookmark name or a bookmark record."
       (t (dired dir switches)))
     (let ((inhibit-read-only  t))
       (dired-insert-old-subdirs subdirs)
-      (dired-mark-remembered (mapcar (lexical-let ((dd  dir))
+      (dired-mark-remembered (mapcar (bmkp-lexlet ((dd  dir))
                                        (lambda (mf) (cons (expand-file-name mf dd) 42)))
                                      mfiles))
       (save-excursion (dolist (dir  hidden-dirs) (when (dired-goto-subdir dir) (dired-hide-subdir 1)))))
@@ -11534,8 +11635,12 @@ BOOKMARK is a bookmark name or a bookmark record."
 You are prompted for the region bookmark.
 
 The region is selected as usual, in the bookmarked file/buffer.  A
-separate window is opened on the region text, for the cloned indirect
-buffer.
+separate window is opened on the region text (which is unselected),
+for the cloned indirect buffer.
+
+If the major-mode symbol of the buffer with the selected region has
+non-nil property `no-clone-indirect' then no indirect buffer clone is
+created.  But unlike `clone-indirect-buffer' no error is raised.
 
 You need library `narrow-indirect.el' to use this command."
   (interactive)
@@ -11818,7 +11923,7 @@ for info about using a prefix argument."
   (bmkp-jump-1 bookmark 'bmkp-select-buffer-other-window flip-use-region-p))
 
 ;;;###autoload (autoload 'bmkp-all-tags-jump "bookmark+")
-(defun bmkp-all-tags-jump (tags bookmark) ; `C-x j t *'
+(defun bmkp-all-tags-jump (tags bookmark &optional interactivep) ; `C-x j t *'
   "Jump to a BOOKMARK that has all of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -11831,43 +11936,51 @@ time.  Use a prefix argument if you want to refresh them."
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-all-tags-alist-only tgs)))
      (unless alist (error "No bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-all-tags-alist-only tags))
+    (error "No bookmarks have all of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-all-tags-jump-other-window "bookmark+")
-(defun bmkp-all-tags-jump-other-window (tags bookmark) ; `C-x 4 j t *'
+(defun bmkp-all-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t *'
   "`bmkp-all-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-all-tags-alist-only tgs)))
      (unless alist (error "No bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-all-tags-alist-only tags))
+    (error "No bookmarks have all of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-all-tags-regexp-jump "bookmark+")
-(defun bmkp-all-tags-regexp-jump (regexp bookmark) ; `C-x j t % *'
+(defun bmkp-all-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t % *'
   "Jump to a BOOKMARK that has each tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for all tags: "))
           (alist  (bmkp-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No bookmarks have tags that all match `%s'" rgx))
+     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-all-tags-regexp-alist-only regexp))
+    (error "No bookmarks have tags that all match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-all-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-all-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t % *'
+(defun bmkp-all-tags-regexp-jump-other-window (regexp bookmark &optional interactivep) ; `C-x 4 j t % *'
   "`bmkp-all-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for all tags: "))
           (alist  (bmkp-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No bookmarks have tags that all match `%s'" rgx))
+     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-all-tags-regexp-alist-only regexp))
+    (error "No bookmarks have tags that all match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-some-tags-jump "bookmark+")
-(defun bmkp-some-tags-jump (tags bookmark) ; `C-x j t +'
+(defun bmkp-some-tags-jump (tags bookmark &optional interactivep) ; `C-x j t +'
   "Jump to a BOOKMARK that has at least one of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -11879,44 +11992,52 @@ time.  Use a prefix argument if you want to refresh them."
           (alist  (bmkp-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
      (unless alist (error "No bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-some-tags-alist-only tags))
+    (error "No bookmarks have any of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-some-tags-jump-other-window "bookmark+")
-(defun bmkp-some-tags-jump-other-window (tags bookmark) ; `C-x 4 j t +'
+(defun bmkp-some-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t +'
   "`bmkp-some-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
      (unless alist (error "No bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-some-tags-alist-only tags))
+    (error "No bookmarks have any of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-some-tags-regexp-jump "bookmark+")
-(defun bmkp-some-tags-regexp-jump (regexp bookmark) ; `C-x j t % +'
+(defun bmkp-some-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t % +'
   "Jump to a BOOKMARK that has a tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No bookmarks have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-some-tags-regexp-alist-only regexp))
+    (error "No bookmarks have any tags that match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-some-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-some-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t % +'
+(defun bmkp-some-tags-regexp-jump-other-window (regexp bookmark &optional interactivep) ; `C-x 4 j t % +'
   "`bmkp-some-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No bookmarks have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "Bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-some-tags-regexp-alist-only regexp))
+    (error "No bookmarks have any tags that match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-all-tags-jump "bookmark+")
-(defun bmkp-file-all-tags-jump (tags bookmark) ; `C-x j t f *'
+(defun bmkp-file-all-tags-jump (tags bookmark &optional interactivep) ; `C-x j t f *'
   "Jump to a file or directory BOOKMARK that has all of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -11929,43 +12050,51 @@ time.  Use a prefix argument if you want to refresh them."
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-file-all-tags-alist-only tgs)))
      (unless alist (error "No file or dir bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-all-tags-alist-only tags))
+    (error "No file or dir bookmarks have all of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-all-tags-jump-other-window "bookmark+")
-(defun bmkp-file-all-tags-jump-other-window (tags bookmark) ; `C-x 4 j t f *'
+(defun bmkp-file-all-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t f *'
   "`bmkp-file-all-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-file-all-tags-alist-only tgs)))
      (unless alist (error "No file or dir bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-all-tags-alist-only tags))
+    (error "No file or dir bookmarks have all of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-all-tags-regexp-jump "bookmark+")
-(defun bmkp-file-all-tags-regexp-jump (regexp bookmark) ; `C-x j t f % *'
+(defun bmkp-file-all-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t f % *'
   "Jump to a file or directory BOOKMARK that has each tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks have tags that all match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-all-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks have tags that all match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-all-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-file-all-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t f % *'
+(defun bmkp-file-all-tags-regexp-jump-other-window (regexp bookmark &optional interactivep) ; `C-x 4 j t f % *'
   "`bmkp-file-all-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks have tags that all match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-all-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks have tags that all match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-some-tags-jump "bookmark+")
-(defun bmkp-file-some-tags-jump (tags bookmark) ; `C-x j t f +'
+(defun bmkp-file-some-tags-jump (tags bookmark &optional interactivep) ; `C-x j t f +'
   "Jump to a file or directory BOOKMARK that has at least one of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -11977,44 +12106,52 @@ time.  Use a prefix argument if you want to refresh them."
           (alist  (bmkp-file-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
      (unless alist (error "No file or dir bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-some-tags-alist-only tags))
+    (error "No file or dir bookmarks have any of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-some-tags-jump-other-window "bookmark+")
-(defun bmkp-file-some-tags-jump-other-window (tags bookmark) ; `C-x 4 j t f +'
+(defun bmkp-file-some-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t f +'
   "`bmkp-file-some-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-file-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
      (unless alist (error "No file or dir bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-some-tags-alist-only tags))
+    (error "No file or dir bookmarks have any of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-some-tags-regexp-jump "bookmark+")
-(defun bmkp-file-some-tags-regexp-jump (regexp bookmark) ; `C-x j t f % +'
+(defun bmkp-file-some-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t f % +'
   "Jump to a file or directory BOOKMARK that has a tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-some-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks have any tags that match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-some-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-file-some-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t f % +'
+(defun bmkp-file-some-tags-regexp-jump-other-window (regexp bookmark &optional interactivep) ; `C-x 4 j t f % +'
   "`bmkp-file-some-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-some-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks have any tags that match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-all-tags-jump "bookmark+")
-(defun bmkp-file-this-dir-all-tags-jump (tags bookmark) ; `C-x j t . *'
+(defun bmkp-file-this-dir-all-tags-jump (tags bookmark &optional interactivep) ; `C-x j t . *'
   "Jump to a file BOOKMARK in this dir that has all of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -12026,44 +12163,53 @@ time.  Use a prefix argument if you want to refresh them."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-file-this-dir-all-tags-alist-only tgs)))
-     (unless alist (error "No file or dir bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have all of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-all-tags-alist-only tags))
+    (error "No file or dir bookmarks in this dir have all of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-all-tags-jump-other-window "bookmark+")
-(defun bmkp-file-this-dir-all-tags-jump-other-window (tags bookmark) ; `C-x 4 j t . *'
+(defun bmkp-file-this-dir-all-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t . *'
   "`bmkp-file-this-dir-all-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-file-this-dir-all-tags-alist-only tgs)))
-     (unless alist (error "No file or dir bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have all of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-all-tags-alist-only tags))
+    (error "No file or dir bookmarks in this dir have all of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-all-tags-regexp-jump "bookmark+")
-(defun bmkp-file-this-dir-all-tags-regexp-jump (regexp bookmark) ; `C-x j t . % *'
+(defun bmkp-file-this-dir-all-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t . % *'
   "Jump to a file BOOKMARK in this dir that has each tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-this-dir-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have all tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-all-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks in this dir have all tags that match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-all-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-file-this-dir-all-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t . % *'
+(defun bmkp-file-this-dir-all-tags-regexp-jump-other-window (regexp bookmark &optional interactivep)
+                                        ; `C-x 4 j t . % *'
   "`bmkp-file-this-dir-all-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-this-dir-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have all tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-all-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks in this dir have all tags that match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-some-tags-jump "bookmark+")
-(defun bmkp-file-this-dir-some-tags-jump (tags bookmark) ; `C-x j t . +'
+(defun bmkp-file-this-dir-some-tags-jump (tags bookmark &optional interactivep) ; `C-x j t . +'
   "Jump to a file BOOKMARK in this dir that has at least one of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -12074,41 +12220,50 @@ time.  Use a prefix argument if you want to refresh them."
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-file-this-dir-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
-     (unless alist (error "No file or dir bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have any of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-some-tags-alist-only tags))
+    (error "No file or dir bookmarks in this dir have any of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-some-tags-jump-other-window "bookmark+")
-(defun bmkp-file-this-dir-some-tags-jump-other-window (tags bookmark) ; `C-x 4 j t . +'
+(defun bmkp-file-this-dir-some-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t . +'
   "`bmkp-file-this-dir-some-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-file-this-dir-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
-     (unless alist (error "No file or dir bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have any of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-some-tags-alist-only tags))
+    (error "No file or dir bookmarks in this dir have any of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-some-tags-regexp-jump "bookmark+")
-(defun bmkp-file-this-dir-some-tags-regexp-jump (regexp bookmark) ; `C-x j t . % +'
+(defun bmkp-file-this-dir-some-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t . % +'
   "Jump to a file BOOKMARK in this dir that has a tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-this-dir-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-some-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks in this dir have any tags that match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-file-this-dir-some-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-file-this-dir-some-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t . % +'
+(defun bmkp-file-this-dir-some-tags-regexp-jump-other-window (regexp bookmark &optional interactivep)
+                                        ; `C-x 4 j t . % +'
   "`bmkp-file-this-dir-some-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-file-this-dir-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No file or dir bookmarks in this dir have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-file-this-dir-some-tags-regexp-alist-only regexp))
+    (error "No file or dir bookmarks in this dir have any tags that match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-jump "bookmark+")
@@ -12133,7 +12288,7 @@ This is a specialization of `bookmark-jump'."
   (bmkp-jump-1 bookmark 'bmkp-select-buffer-other-window))
 
 ;;;###autoload (autoload 'bmkp-autofile-all-tags-jump "bookmark+")
-(defun bmkp-autofile-all-tags-jump (tags bookmark) ; `C-x j t a *'
+(defun bmkp-autofile-all-tags-jump (tags bookmark &optional interactivep) ; `C-x j t a *'
   "Jump to an autofile BOOKMARK in this dir that has all of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -12145,44 +12300,53 @@ time.  Use a prefix argument if you want to refresh them."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-autofile-all-tags-alist-only tgs)))
-     (unless alist (error "No file or dir bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have all of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-autofile-all-tags-alist-only tags))
+    (error "No autofile bookmarks have all of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-all-tags-jump-other-window "bookmark+")
-(defun bmkp-autofile-all-tags-jump-other-window (tags bookmark) ; `C-x 4 j t a *'
+(defun bmkp-autofile-all-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t a *'
   "`bmkp-autofile-all-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-autofile-all-tags-alist-only tgs)))
-     (unless alist (error "No file or dir bookmarks have all of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have all of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-autofile-all-tags-alist-only tags))
+    (error "No autofile bookmarks have all of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-all-tags-regexp-jump "bookmark+")
-(defun bmkp-autofile-all-tags-regexp-jump (regexp bookmark) ; `C-x j t a % *'
+(defun bmkp-autofile-all-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t a % *'
   "Jump to an autofile BOOKMARK in this dir that has each tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-autofile-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have tags that all match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-autofile-all-tags-regexp-alist-only regexp))
+    (error "No autofile bookmarks have tags that all match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-all-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-autofile-all-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t a % *'
+(defun bmkp-autofile-all-tags-regexp-jump-other-window (regexp bookmark &optional interactivep)
+                                        ; `C-x 4 j t a % *'
   "`bmkp-autofile-all-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-autofile-all-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have tags that all match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-autofile-all-tags-regexp-alist-only regexp))
+    (error "No autofile bookmarks have tags that all match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-some-tags-jump "bookmark+")
-(defun bmkp-autofile-some-tags-jump (tags bookmark) ; `C-x j t a +'
+(defun bmkp-autofile-some-tags-jump (tags bookmark &optional interactivep) ; `C-x j t a +'
   "Jump to an autofile BOOKMARK in this dir that has at least one of the TAGS.
 Hit `RET' to enter each tag, then hit `RET' again after the last tag.
 You can use completion to enter the bookmark name and each tag.
@@ -12193,41 +12357,50 @@ time.  Use a prefix argument if you want to refresh them."
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-autofile-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
-     (unless alist (error "No file or dir bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have any of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-autofile-some-tags-alist-only tags))
+    (error "No autofile bookmarks have any of the specified tags"))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-some-tags-jump-other-window "bookmark+")
-(defun bmkp-autofile-some-tags-jump-other-window (tags bookmark) ; `C-x 4 j t a +'
+(defun bmkp-autofile-some-tags-jump-other-window (tags bookmark &optional interactivep) ; `C-x 4 j t a +'
   "`bmkp-autofile-some-tags-jump', but in another window."
   (interactive
    (let* ((tgs    (bmkp-read-tags-completing nil nil current-prefix-arg))
           (alist  (bmkp-autofile-some-tags-alist-only tgs)))
      (unless tgs (error "You did not specify any tags"))
-     (unless alist (error "No file or dir bookmarks have any of the specified tags"))
-     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have any of the specified tags"))
+     (list tgs (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (bmkp-autofile-some-tags-alist-only tags))
+    (error "No autofile bookmarks have any of the specified tags"))
   (bookmark-jump-other-window bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-some-tags-regexp-jump "bookmark+")
-(defun bmkp-autofile-some-tags-regexp-jump (regexp bookmark) ; `C-x j t a % +'
+(defun bmkp-autofile-some-tags-regexp-jump (regexp bookmark &optional interactivep) ; `C-x j t a % +'
   "Jump to an autofile BOOKMARK in this dir that has a tag matching REGEXP.
 You are prompted for the REGEXP.
 Then you are prompted for the BOOKMARK (with completion)."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-autofile-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (error "No autofile bookmarks have any tags that match `%s'" regexp))
+    (error "No autofile bookmarks have any tags that match `%s'" regexp))
   (bookmark-jump bookmark))
 
 ;;;###autoload (autoload 'bmkp-autofile-some-tags-regexp-jump-other-window "bookmark+")
-(defun bmkp-autofile-some-tags-regexp-jump-other-window (regexp bookmark) ; `C-x 4 j t a % +'
+(defun bmkp-autofile-some-tags-regexp-jump-other-window (regexp bookmark &optional interactivep)
+                                        ; `C-x 4 j t a % +'
   "`bmkp-autofile-some-tags-regexp-jump', but in another window."
   (interactive
    (let* ((rgx    (bmkp-read-regexp "Regexp for tags: "))
           (alist  (bmkp-autofile-some-tags-regexp-alist-only rgx)))
-     (unless alist (error "No file or dir bookmarks have tags that match `%s'" rgx))
-     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist))))
+     (unless alist (error "No autofile bookmarks have any tags that match `%s'" rgx))
+     (list rgx (bookmark-completing-read "File bookmark" (bmkp-default-bookmark-name alist) alist) t)))
+  (unless (or interactivep  (error "No autofile bookmarks have any tags that match `%s'" regexp))
+    (error "No autofile bookmarks have any tags that match `%s'" regexp))
   (bookmark-jump-other-window bookmark))
 
 (defun bmkp-find-file (&optional file create-autofile-p must-exist-p msg-p) ; `C-x j C-f'
@@ -12304,11 +12477,11 @@ candidate.
 By default, the tag choices for completion are NOT refreshed, to save
 time.  Use a prefix argument if you want to refresh them."
     (interactive (list (bmkp-read-tags-completing nil nil current-prefix-arg)))
-    (lexical-let* ((tgs              tags)
+    (bmkp-lexlet* ((tgs              tags)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
-                      (lexical-let* ((bmk   (bmkp-get-autofile-bookmark ff))
+                      (bmkp-lexlet* ((bmk   (bmkp-get-autofile-bookmark ff))
                                      (btgs  (and bmk  (bmkp-get-tags bmk))))
                         (and btgs  (bmkp-every (lambda (tag) (bmkp-has-tag-p bmk tag))  tgs)))))
                    (icicle-unpropertize-completion-result-flag  t) ; For `read-file-name'.
@@ -12326,11 +12499,11 @@ time.  Use a prefix argument if you want to refresh them."
   (defun bmkp-find-file-all-tags-other-window (tags &optional file) ; `C-x 4 j t C-f *'
     "`bmkp-find-file-all-tags', but in another window."
     (interactive (list (bmkp-read-tags-completing nil nil current-prefix-arg)))
-    (lexical-let* ((tgs              tags)
+    (bmkp-lexlet* ((tgs              tags)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
-                      (lexical-let* ((bk    (bmkp-get-autofile-bookmark ff))
+                      (bmkp-lexlet* ((bk    (bmkp-get-autofile-bookmark ff))
                                      (btgs  (and bk  (bmkp-get-tags bk))))
                         (and btgs  (bmkp-every (lambda (tag) (bmkp-has-tag-p bk tag))  tgs)))))
                    (icicle-unpropertize-completion-result-flag  t) ; For `read-file-name'.
@@ -12349,7 +12522,7 @@ time.  Use a prefix argument if you want to refresh them."
     "Visit a file or directory that has each tag matching REGEXP.
 You are prompted for the REGEXP."
     (interactive (list (bmkp-read-regexp "Regexp for tags: ")))
-    (lexical-let* ((rg               regexp)
+    (bmkp-lexlet* ((rg               regexp)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
@@ -12373,7 +12546,7 @@ You are prompted for the REGEXP."
   (defun bmkp-find-file-all-tags-regexp-other-window (regexp &optional file) ; `C-x 4 j t C-f % *'
     "`bmkp-find-file-all-tags-regexp', but in another window."
     (interactive (list (bmkp-read-regexp "Regexp for tags: ")))
-    (lexical-let* ((rg               regexp)
+    (bmkp-lexlet* ((rg               regexp)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
@@ -12409,11 +12582,11 @@ However, only files that are bookmarked as autofiles are candidates.
 By default, the tag choices for completion are NOT refreshed, to save
 time.  Use a prefix argument if you want to refresh them."
     (interactive (list (bmkp-read-tags-completing nil nil current-prefix-arg)))
-    (lexical-let* ((tgs              tags)
+    (bmkp-lexlet* ((tgs              tags)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
-                      (lexical-let* ((bk    (bmkp-get-autofile-bookmark ff))
+                      (bmkp-lexlet* ((bk    (bmkp-get-autofile-bookmark ff))
                                      (btgs  (and bk  (bmkp-get-tags bk))))
                         (and btgs  (bmkp-some (lambda (tag) (bmkp-has-tag-p bk tag))  tgs)))))
                    (icicle-unpropertize-completion-result-flag  t) ; For `read-file-name'.
@@ -12432,11 +12605,11 @@ time.  Use a prefix argument if you want to refresh them."
   (defun bmkp-find-file-some-tags-other-window (tags &optional file) ; `C-x 4 j t C-f +'
     "`bmkp-find-file-some-tags', but in another window."
     (interactive (list (bmkp-read-tags-completing nil nil current-prefix-arg)))
-    (lexical-let* ((tgs              tags)
+    (bmkp-lexlet* ((tgs              tags)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
-                      (lexical-let* ((bk    (bmkp-get-autofile-bookmark ff))
+                      (bmkp-lexlet* ((bk    (bmkp-get-autofile-bookmark ff))
                                      (btgs  (and bk  (bmkp-get-tags bk))))
                         (and btgs  (bmkp-some (lambda (tag) (bmkp-has-tag-p bk tag))  tgs)))))
                    (icicle-unpropertize-completion-result-flag  t) ; For `read-file-name'.
@@ -12456,7 +12629,7 @@ time.  Use a prefix argument if you want to refresh them."
     "Visit a file or directory that has a tag matching REGEXP.
 You are prompted for the REGEXP."
     (interactive (list (bmkp-read-regexp "Regexp for tags: ")))
-    (lexical-let* ((rg               regexp)
+    (bmkp-lexlet* ((rg               regexp)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
@@ -12480,7 +12653,7 @@ You are prompted for the REGEXP."
   (defun bmkp-find-file-some-tags-regexp-other-window (regexp &optional file) ; `C-x 4 j t C-f % +'
     "`bmkp-find-file-some-tags-regexp', but in another window."
     (interactive (list (bmkp-read-regexp "Regexp for tags: ")))
-    (lexical-let* ((rg               regexp)
+    (bmkp-lexlet* ((rg               regexp)
                    (use-file-dialog  nil)
                    (pred
                     (lambda (ff)
@@ -12787,33 +12960,29 @@ See `bmkp-next-bookmark'."
   (bmkp-cycle (- n) 'OTHER-WINDOW startoverp))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-repeat "bookmark+")
-(defun bmkp-next-bookmark-repeat (arg)  ; `C-x x right', `C-x x f', `C-x x C-f'
-  "Jump to the Nth-next bookmark in the bookmark navigation list.
-This is a repeatable version of `bmkp-next-bookmark'.
-N defaults to 1, meaning the next bookmark.
-Plain `C-u' means start over at the first bookmark (and no repeat)."
+(defun bmkp-next-bookmark-repeat ()  ; `C-x x right', `C-x x f', `C-x x C-f'
+  "Jump to the next bookmark in the bookmark navigation list.
+This is a repeatable version of `bmkp-next-bookmark'."
   (interactive "P")
   (bmkp-repeat-command 'bmkp-next-bookmark))
 
 ;;;###autoload (autoload 'bmkp-previous-bookmark-repeat "bookmark+")
-(defun bmkp-previous-bookmark-repeat (arg) ; `C-x x left', `C-x x b', `C-x x C-b'
-  "Jump to the Nth-previous bookmark in the bookmark navigation list.
+(defun bmkp-previous-bookmark-repeat () ; `C-x x left', `C-x x b', `C-x x C-b'
+  "Jump to the previous bookmark in the bookmark navigation list.
 See `bmkp-next-bookmark-repeat'."
   (interactive "P")
   (bmkp-repeat-command 'bmkp-previous-bookmark))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-other-window-repeat "bookmark+")
-(defun bmkp-next-bookmark-other-window-repeat (arg)  ; `C-x x right', `C-x x f', `C-x x C-f'
-  "Jump to Nth-next bookmark in bookmark navlist in another window.
-This is a repeatable version of `bmkp-next-bookmark'.
-N defaults to 1, meaning the next bookmark.
-Plain `C-u' means start over at the first bookmark (and no repeat)."
+(defun bmkp-next-bookmark-other-window-repeat ()  ; `C-x x right', `C-x x f', `C-x x C-f'
+  "Jump to next bookmark in bookmark navlist in another window.
+This is a repeatable version of `bmkp-next-bookmark'."
   (interactive "P")
   (bmkp-repeat-command 'bmkp-next-bookmark-other-window))
 
 ;;;###autoload (autoload 'bmkp-previous-bookmark-other-window-repeat "bookmark+")
-(defun bmkp-previous-bookmark-other-window-repeat (arg) ; `C-x x left', `C-x x b', `C-x x C-b'
-  "Jump to Nth-previous bookmark in bookmark navlist in another window.
+(defun bmkp-previous-bookmark-other-window-repeat () ; `C-x x left', `C-x x b', `C-x x C-b'
+  "Jump to previous bookmark in bookmark navlist in another window.
 See `bmkp-next-bookmark-repeat'."
   (interactive "P")
   (bmkp-repeat-command 'bmkp-previous-bookmark-other-window))
@@ -12837,21 +13006,19 @@ See `bmkp-next-bookmark-this-file/buffer'."
   (bmkp-cycle-this-file/buffer (- n) nil startoverp))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-this-file/buffer-repeat "bookmark+")
-(defun bmkp-next-bookmark-this-file/buffer-repeat (arg)
+(defun bmkp-next-bookmark-this-file/buffer-repeat ()
                                         ; `C-x x down', `C-x x n', `C-x x C-n', `C-x x mouse-wheel-up'
-  "Jump to the Nth next bookmark for the current file/buffer.
-This is a repeatable version of `bmkp-next-bookmark-this-file/buffer'.
-N defaults to 1, meaning the next one.
-Plain `C-u' means start over at the first one (and no repeat)."
-  (interactive "P")
+  "Jump to the next bookmark for the current file/buffer.
+This is a repeatable version of `bmkp-next-bookmark-this-file/buffer'."
+  (interactive)
   (bmkp-repeat-command 'bmkp-next-bookmark-this-file/buffer))
 
 ;;;###autoload (autoload 'bmkp-previous-bookmark-this-file/buffer-repeat "bookmark+")
-(defun bmkp-previous-bookmark-this-file/buffer-repeat (arg)
+(defun bmkp-previous-bookmark-this-file/buffer-repeat ()
                                         ; `C-x x up', `C-x x p', `C-x x C-p', `C-x x mouse-wheel-down'
-  "Jump to the Nth previous bookmark for the current file/buffer.
+  "Jump to the previous bookmark for the current file/buffer.
 See `bmkp-next-bookmark-this-file/buffer-repeat'."
-  (interactive "P")
+  (interactive)
   (bmkp-repeat-command 'bmkp-previous-bookmark-this-file/buffer))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-this-file "bookmark+")
@@ -12873,22 +13040,19 @@ See `bmkp-next-bookmark-this-file'."
   (bmkp-cycle-this-file (- n) nil startoverp))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-this-file-repeat "bookmark+")
-(defun bmkp-next-bookmark-this-file-repeat (arg)
-  "Jump to the Nth next bookmark for the current file.
-This is a repeatable version of `bmkp-next-bookmark-this-file'.
-N defaults to 1, meaning the next one.
-Plain `C-u' means start over at the first one (and no repeat)."
-  (interactive "P")
+(defun bmkp-next-bookmark-this-file-repeat ()
+  "Jump to the next bookmark for the current file.
+This is a repeatable version of `bmkp-next-bookmark-this-file'."
+  (interactive)
   (bmkp-repeat-command 'bmkp-next-bookmark-this-file))
 
 ;;;###autoload (autoload 'bmkp-previous-bookmark-this-file-repeat "bookmark+")
-(defun bmkp-previous-bookmark-this-file-repeat (arg)
-  "Jump to the Nth previous bookmark for the current file.
+(defun bmkp-previous-bookmark-this-file-repeat ()
+  "Jump to the previous bookmark for the current file.
 See `bmkp-next-bookmark-this-file-repeat'."
-  (interactive "P")
+  (interactive)
   (bmkp-repeat-command 'bmkp-previous-bookmark-this-file))
 
-
 ;;;###autoload (autoload 'bmkp-next-bookmark-this-buffer "bookmark+")
 (defun bmkp-next-bookmark-this-buffer (n &optional startoverp) ; Bind to repeatable key, e.g. `S-f2'
   "Jump to the Nth-next bookmark in the current buffer.
@@ -12908,19 +13072,17 @@ See `bmkp-next-bookmark-this-buffer'."
   (bmkp-cycle-this-buffer (- n) nil startoverp))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-this-buffer-repeat "bookmark+")
-(defun bmkp-next-bookmark-this-buffer-repeat (arg)
-  "Jump to the Nth next bookmark in the current buffer.
-This is a repeatable version of `bmkp-next-bookmark-this-buffer'.
-N defaults to 1, meaning the next one.
-Plain `C-u' means start over at the first one (and no repeat)."
-  (interactive "P")
+(defun bmkp-next-bookmark-this-buffer-repeat ()
+  "Jump to the next bookmark in the current buffer.
+This is a repeatable version of `bmkp-next-bookmark-this-buffer'."
+  (interactive)
   (bmkp-repeat-command 'bmkp-next-bookmark-this-buffer))
 
 ;;;###autoload (autoload 'bmkp-previous-bookmark-this-buffer-repeat "bookmark+")
-(defun bmkp-previous-bookmark-this-buffer-repeat (arg)
-  "Jump to the Nth previous bookmark in the current buffer.
+(defun bmkp-previous-bookmark-this-buffer-repeat ()
+  "Jump to the previous bookmark in the current buffer.
 See `bmkp-next-bookmark-this-buffer-repeat'."
-  (interactive "P")
+  (interactive)
   (bmkp-repeat-command 'bmkp-previous-bookmark-this-buffer))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-w32 "bookmark+")
@@ -12943,19 +13105,17 @@ See `bmkp-next-bookmark-w32'."
   (let ((bmkp-use-w32-browser-p  t))  (bmkp-cycle (- n) nil startoverp)))
 
 ;;;###autoload (autoload 'bmkp-next-bookmark-w32-repeat "bookmark+")
-(defun bmkp-next-bookmark-w32-repeat (arg) ; `C-x x next'
-  "Windows `Open' the Nth next bookmark in the bookmark navigation list.
-This is a repeatable version of `bmkp-next-bookmark'.
-N defaults to 1, meaning the next bookmark.
-Plain `C-u' means start over at the first one (and no repeat)."
-  (interactive "P")
+(defun bmkp-next-bookmark-w32-repeat () ; `C-x x next'
+  "Windows `Open' the next bookmark in the bookmark navigation list.
+This is a repeatable version of `bmkp-next-bookmark'."
+  (interactive)
   (let ((bmkp-use-w32-browser-p  t))  (bmkp-repeat-command 'bmkp-next-bookmark)))
 
 ;;;###autoload (autoload 'bmkp-previous-bookmark-w32-repeat "bookmark+")
-(defun bmkp-previous-bookmark-w32-repeat (arg) ; `C-x x prior'
-  "Windows `Open' the Nth previous bookmark in the bookmark navlist.
+(defun bmkp-previous-bookmark-w32-repeat () ; `C-x x prior'
+  "Windows `Open' the previous bookmark in the bookmark navlist.
 See `bmkp-next-bookmark-w32-repeat'."
-  (interactive "P")
+  (interactive)
   (let ((bmkp-use-w32-browser-p  t))  (bmkp-repeat-command 'bmkp-previous-bookmark)))
 
 ;; In spite of their names, `bmkp-cycle-specific-(buffers|files)*' just cycle bookmarks in the
@@ -13305,7 +13465,7 @@ buffer part names the current buffer."
   "Delete all autonamed bookmarks for this buffer, without confirmation.
 Non-nil optional arg NO-REFRESH-P means do not refresh/rebuild the
 bookmark-list."
-  (when (and bookmarks-already-loaded  bookmark-alist)
+  (when (and bmkp-bookmarks-already-loaded  bookmark-alist)
     (let ((bmks-to-delete      (mapcar #'bmkp-bookmark-name-from-record
                                        (bmkp-autonamed-this-buffer-alist-only)))
           (bookmark-save-flag  (and (not bmkp-count-multi-mods-as-one-flag)
@@ -13318,7 +13478,7 @@ bookmark-list."
 ;; You can use this in `kill-emacs-hook'.
 (defun bmkp-delete-autonamed-no-confirm ()
   "Delete all autonamed bookmarks for all buffers, without confirmation."
-  (when (and bookmarks-already-loaded  bookmark-alist)
+  (when (and bmkp-bookmarks-already-loaded  bookmark-alist)
     (let ((bookmark-save-flag  (and (not bmkp-count-multi-mods-as-one-flag)
                                     bookmark-save-flag))) ; Save at most once, after `dolist'.
       (dolist (buf  (buffer-list))
@@ -13447,9 +13607,8 @@ your init file:
                         (format " in buffer `%s'" (current-buffer))
                       ""))))
 
-
-       (add-to-list 'minor-mode-alist `(bmkp-automatic-bookmark-mode
-                                        ,bmkp-automatic-bookmark-mode-lighter))))
+       (let ((m+l  `(bmkp-automatic-bookmark-mode ,bmkp-automatic-bookmark-mode-lighter)))
+         (unless (member m+l minor-mode-alist) (setq minor-mode-alist  (cons m+l minor-mode-alist))))))
 
 (defun bmkp-not-near-other-automatic-bmks (&optional position)
   "Is POSITION far enough from automatic bookmarks to create a new one?
@@ -13473,12 +13632,12 @@ Do nothing if bookmark would be too near another automatic bookmark."
   (when (bmkp-not-near-other-automatic-bmks)
     (let ((bmkp-setting-automatic-bmk-p  t)) (funcall bmkp-automatic-bookmark-set-function))))
 
-(when (> emacs-major-version 21)        ; Emacs 22+ (need also `Info-selection-hook').
+(when (> emacs-major-version 21) ; Emacs 22+ (need also `Info-selection-hook').
 
   ;; Eval this so that even if the library is byte-compiled with Emacs 20,
   ;; loading it into Emacs 22+ will define variable `bmkp-info-auto-bookmark-mode'.
   (eval '(define-minor-mode bmkp-info-auto-bookmark-mode
-          "Toggle automatically setting a bookmark when you visit an Info node.
+           "Toggle automatically setting a bookmark when you visit an Info node.
 The bookmark name is \"(MANUAL) `NODE'\", where:
 
  MANUAL is the name of the current manual (the base file name).
@@ -13490,21 +13649,21 @@ is `update-only' then no new bookmark is created automatically, but an
 existing bookmark is updated.  (Updating a bookmark increments the
 recorded number of visits.)  You can toggle the option using
 `\\[bmkp-toggle-info-auto-type]'."
-          :init-value nil :global t :group 'bookmark-plus :require 'bookmark+
-          :lighter bmkp-automatic-bookmark-mode-lighter
-          :link `(url-link :tag "Send Bug Report"
-                  ,(concat "mailto:" "drew.adams" "@" "oracle" ".com?subject=\
+           :init-value nil :global t :group 'bookmark-plus :require 'bookmark+
+           :lighter bmkp-automatic-bookmark-mode-lighter
+           :link `(url-link :tag "Send Bug Report"
+                            ,(concat "mailto:" "drew.adams" "@" "oracle" ".com?subject=\
 Bookmark bug: \
 &body=Describe bug here, starting with `emacs -Q'.  \
 Don't forget to mention your Emacs and library versions."))
-          :link '(url-link :tag "Download" "https://www.emacswiki.org/emacs/download/bookmark%2b.el")
-          :link '(url-link :tag "Description" "https://www.emacswiki.org/emacs/BookmarkPlus")
-          :link '(emacs-commentary-link :tag "Commentary" "bookmark+")
-          (if bmkp-info-auto-bookmark-mode
-              (add-hook 'Info-selection-hook 'bmkp-set-info-bookmark-with-node-name)
-            (remove-hook 'Info-selection-hook 'bmkp-set-info-bookmark-with-node-name))
-          (when (interactive-p)
-            (message "Automatic Info bookmarking is now %s" (if bmkp-info-auto-bookmark-mode "ON" "OFF")))))
+           :link '(url-link :tag "Download" "https://www.emacswiki.org/emacs/download/bookmark%2b.el")
+           :link '(url-link :tag "Description" "https://www.emacswiki.org/emacs/BookmarkPlus")
+           :link '(emacs-commentary-link :tag "Commentary" "bookmark+")
+           (if bmkp-info-auto-bookmark-mode
+               (add-hook 'Info-selection-hook 'bmkp-set-info-bookmark-with-node-name)
+             (remove-hook 'Info-selection-hook 'bmkp-set-info-bookmark-with-node-name))
+           (when (interactive-p)
+             (message "Automatic Info bookmarking is now %s" (if bmkp-info-auto-bookmark-mode "ON" "OFF")))))
 
   (defun bmkp-set-info-bookmark-with-node-name (&optional nomsg)
     "Maybe bookmark the current Info node using name \"(MANUAL) `NODE'\".
@@ -13554,7 +13713,7 @@ the node was bookmarked."
     ;; Emacs 21 and later.  Eval this so that even if the library is byte-compiled with Emacs 20,
     ;; loading it into Emacs 21+ will define variable `bmkp-temporary-bookmarking-mode'.
     (eval '(define-minor-mode bmkp-temporary-bookmarking-mode ; `M-L' in `*Bookmark List*'.
-            "Toggle temporary bookmarking.
+             "Toggle temporary bookmarking.
 Temporary bookmarking means that any bookmark changes (creation,
 modification, deletion) are NOT automatically saved.
 
@@ -13570,44 +13729,44 @@ When the mode is turned ON:
 
 Non-interactively, turn temporary bookmarking on if and only if ARG is
 positive.  Non-interactively there is no prompt for confirmation."
-            :init-value nil :global t :group 'bookmark-plus :lighter bmkp-temporary-bookmarking-mode-lighter
-            :link `(url-link :tag "Send Bug Report"
-                    ,(concat "mailto:" "drew.adams" "@" "oracle" ".com?subject=\
+             :init-value nil :global t :group 'bookmark-plus :lighter bmkp-temporary-bookmarking-mode-lighter
+             :link `(url-link :tag "Send Bug Report"
+                              ,(concat "mailto:" "drew.adams" "@" "oracle" ".com?subject=\
 Bookmark bug: \
 &body=Describe bug here, starting with `emacs -Q'.  \
 Don't forget to mention your Emacs and library versions."))
-            :link '(url-link :tag "Download" "https://www.emacswiki.org/emacs/download/bookmark%2b.el")
-            :link '(url-link :tag "Description" "https://www.emacswiki.org/emacs/BookmarkPlus")
-            :link '(emacs-commentary-link :tag "Commentary" "bookmark+")
-            (cond ((not bmkp-temporary-bookmarking-mode) ; Turn off.
-                   (when (fboundp 'bmkp-unlight-bookmarks) ; In `bookmark+-lit.el'.
-                     (bmkp-unlight-bookmarks ; Unhighlight the temporary (current) bookmarks.
-                      '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays) nil))
-                   (bmkp-switch-to-last-bookmark-file)
-                   (setq bmkp-last-bookmark-file  bmkp-current-bookmark-file) ; Forget last (temp file).
-                   (when (interactive-p)
-                     (message "Bookmarking is NOT temporary now.  Restored previous bookmarks list")))
-                  ((or (not (interactive-p))
-                       (y-or-n-p (format "%switch to only temporary bookmarking? "
-                                         (if bookmark-save-flag "Save current bookmarks, then s" "S"))))
-                   (when (and (> bookmark-alist-modification-count 0)  bookmark-save-flag)
-                     (bookmark-save))
-                   (let ((new-file  (make-temp-file "bmkp-temp-")))
-                     (with-current-buffer (let ((enable-local-variables  ())) (find-file-noselect new-file))
-                       (goto-char (point-min))
-                       (delete-region (point-min) (point-max)) ; In case a find-file hook inserted a header.
-                       (if (boundp 'bookmark-file-coding-system) ; Emacs 25.2+
-                           (bookmark-insert-file-format-version-stamp bookmark-file-coding-system)
-                         (bookmark-insert-file-format-version-stamp))
-                       (insert "(\n)"))
-                     (bmkp-empty-file new-file)
-                     (setq bmkp-last-as-first-bookmark-file  nil) ; Prevent starting from a file of temp bmks.
-                     (bookmark-load new-file t 'nosave) ; Saving was done just above.
-                     (when bookmark-save-flag (bmkp-toggle-saving-bookmark-file (interactive-p))))
-                   (when (interactive-p) (message "Bookmarking is now TEMPORARY")))
-                  (t                    ; User refused to confirm.
-                   (message "OK, canceled - bookmarking is NOT temporary")
-                   (setq bmkp-temporary-bookmarking-mode  nil)))))
+             :link '(url-link :tag "Download" "https://www.emacswiki.org/emacs/download/bookmark%2b.el")
+             :link '(url-link :tag "Description" "https://www.emacswiki.org/emacs/BookmarkPlus")
+             :link '(emacs-commentary-link :tag "Commentary" "bookmark+")
+             (cond ((not bmkp-temporary-bookmarking-mode) ; Turn off.
+                    (when (fboundp 'bmkp-unlight-bookmarks) ; In `bookmark+-lit.el'.
+                      (bmkp-unlight-bookmarks ; Unhighlight the temporary (current) bookmarks.
+                       '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays) nil))
+                    (bmkp-switch-to-last-bookmark-file)
+                    (setq bmkp-last-bookmark-file  bmkp-current-bookmark-file) ; Forget last (temp file).
+                    (when (interactive-p)
+                      (message "Bookmarking is NOT temporary now.  Restored previous bookmarks list")))
+                   ((or (not (interactive-p))
+                        (y-or-n-p (format "%switch to only temporary bookmarking? "
+                                          (if bookmark-save-flag "Save current bookmarks, then s" "S"))))
+                    (when (and (> bookmark-alist-modification-count 0)  bookmark-save-flag)
+                      (bookmark-save))
+                    (let ((new-file  (make-temp-file "bmkp-temp-")))
+                      (with-current-buffer (let ((enable-local-variables  ())) (find-file-noselect new-file))
+                        (goto-char (point-min))
+                        (delete-region (point-min) (point-max)) ; In case a find-file hook inserted a header.
+                        (if (boundp 'bookmark-file-coding-system) ; Emacs 25.2+
+                            (bookmark-insert-file-format-version-stamp bookmark-file-coding-system)
+                          (bookmark-insert-file-format-version-stamp))
+                        (insert "(\n)"))
+                      (bmkp-empty-file new-file)
+                      (setq bmkp-last-as-first-bookmark-file  nil) ; Prevent starting from a file of temp bmks.
+                      (bookmark-load new-file t 'nosave) ; Saving was done just above.
+                      (when bookmark-save-flag (bmkp-toggle-saving-bookmark-file (interactive-p))))
+                    (when (interactive-p) (message "Bookmarking is now TEMPORARY")))
+                   (t                   ; User refused to confirm.
+                    (message "OK, canceled - bookmarking is NOT temporary")
+                    (setq bmkp-temporary-bookmarking-mode  nil)))))
 
   ;; Emacs 20
   (defun bmkp-temporary-bookmarking-mode (&optional arg) ; `M-L' in `*Bookmark List*'.
@@ -13632,7 +13791,7 @@ positive.  Non-interactively there is no prompt for confirmation."
           (if arg (> (prefix-numeric-value arg) 0) (not bmkp-temporary-bookmarking-mode)))
     (cond ((not bmkp-temporary-bookmarking-mode) ; Turn off.
            (when (fboundp 'bmkp-unlight-bookmarks) ; In `bookmark+-lit.el'.
-             (bmkp-unlight-bookmarks    ; Unhighlight the temporary (current) bookmarks.
+             (bmkp-unlight-bookmarks ; Unhighlight the temporary (current) bookmarks.
               '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays) nil))
            (bmkp-switch-to-last-bookmark-file)
            (setq bmkp-last-bookmark-file  bmkp-current-bookmark-file) ; Forget last (temporary file).
@@ -13659,9 +13818,8 @@ positive.  Non-interactively there is no prompt for confirmation."
            (message "OK, canceled - bookmarking is NOT temporary")
            (setq bmkp-temporary-bookmarking-mode  nil))))
 
-
-  (add-to-list 'minor-mode-alist `(bmkp-temporary-bookmarking-mode
-                                   ,bmkp-temporary-bookmarking-mode-lighter)))
+  (let ((m+l  `(bmkp-temporary-bookmarking-mode ,bmkp-temporary-bookmarking-mode-lighter)))
+    (unless (member m+l minor-mode-alist) (setq minor-mode-alist  (cons m+l minor-mode-alist)))))
 
 ;;;###autoload (autoload 'bmkp-toggle-autotemp-on-set "bookmark+")
 (defun bmkp-toggle-autotemp-on-set (&optional msg-p) ; Bound to `C-x x x'
@@ -13732,7 +13890,7 @@ Non-interactively, non-nil MSG-P means display a status message."
 ;; You can use this in `kill-emacs-hook'.
 (defun bmkp-delete-temporary-no-confirm ()
   "Delete all temporary bookmarks, without confirmation."
-  (when (and bookmarks-already-loaded  bookmark-alist)
+  (when (and bmkp-bookmarks-already-loaded  bookmark-alist)
     (let ((bmks-to-delete  (mapcar #'bmkp-bookmark-name-from-record (bmkp-temporary-alist-only)))
           (bookmark-save-flag  (and (not bmkp-count-multi-mods-as-one-flag)
                                     bookmark-save-flag))) ; Save at most once, after `dolist'.
@@ -13756,8 +13914,7 @@ Non-interactively:
   (interactive "d\nP\ni\np")
   (unless position (setq position  (point)))
   (let ((bmks-to-delete  (and allp  (mapcar #'bmkp-bookmark-name-from-record (bmkp-this-buffer-alist-only))))
-        (bmks-deleted    ())
-        bmk-pos)
+        (bmks-deleted    ()))
     (when (and msg-p  bmks-to-delete  (not (y-or-n-p (format "Delete ALL bookmarks in buffer `%s'? "
                                                              (buffer-name)))))
       (error "Canceled - no bookmarks deleted"))
@@ -13768,13 +13925,13 @@ Non-interactively:
            (bmkp-refresh/rebuild-menu-list nil (not msg-p)) ; Refresh now, after iterate.
            (when msg-p (message "Deleted all bookmarks in buffer `%s'" (buffer-name))))
 
-          (allp                         ; Requested ALLP, but there are none.  (No-op if not interactive.)
+          (allp ; Requested ALLP, but there are none.  (No-op if not interactive.)
            (when msg-p (message "No bookmarks to delete in buffer `%s'" (buffer-name))))
 
-          (t                            ; Delete selected bookmarks at point.
+          (t                     ; Delete selected bookmarks at point.
            (let (bname)
              (dolist (bmk  (or alist  (bmkp-this-buffer-alist-only)))
-               (when (eq position (setq bmk-pos  (bookmark-get-position bmk)))
+               (when (eq position (bookmark-get-position bmk))
                  (setq bname  (bmkp-bookmark-name-from-record bmk))
                  ;; This is the same as `add-to-list' with `EQ' (not available for Emacs 20-21).
                  (unless (memq bname bmks-to-delete)
@@ -13807,7 +13964,7 @@ Non-interactively:
   (defvar bmkp-store-org-link-checking-p nil
     "Whether `bmkp-(bmenu-)store-org-link(-1)' call is checking applicability.")
 
-  (defun bmkp-store-org-link (arg)
+  (defun bmkp-store-org-link (_arg)
     "Store a link to a bookmark for insertion in an Org-mode buffer.
 You are prompted for the bookmark name.
 
@@ -13879,7 +14036,8 @@ I MSG-P is non-nil then echo the annotation type."
       (URL        (browse-url                 ann))
       (BOOKMARK   (bookmark-jump-other-window ann))
       (otherwise  (error "`bmkp-visit-external-annotation': Bad annotation type: `%S'" type)))
-    (message "Showing external annotation of type %s" type) (sit-for 1)))
+    (when msg-p
+      (message "Showing external annotation of type %s" type) (sit-for 1))))
 
 ;;;;;;;;;;;;;;;;;;;;;;;
 
index 270ef5587e433bb002dab83275d2face65bff756..344a57cf7bac5657d1290f01482e4e71d43ee06c 100644 (file)
@@ -1,15 +1,15 @@
-;;; bookmark+-bmu.el --- Bookmark+ code for the `*Bookmark List*' (bmenu).
+;;; bookmark+-bmu.el --- Bookmark+ code for the `*Bookmark List*' (bmenu).   -*- lexical-binding:t -*-
 ;;
 ;; Filename: bookmark+-bmu.el
 ;; Description: Bookmark+ code for the `*Bookmark List*' (bmenu).
 ;; Author: Drew Adams, Thierry Volpiatto
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 2000-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2000-2024, Drew Adams, all rights reserved.
 ;; Copyright (C) 2009, Thierry Volpiatto, all rights reserved.
 ;; Created: Mon Jul 12 09:05:21 2010 (-0700)
-;; Last-Updated: Fri Jan 14 12:40:58 2022 (-0800)
+;; Last-Updated: Wed Oct 23 19:24:44 2024 (-0700)
 ;;           By: dradams
-;;     Update #: 4177
+;;     Update #: 4305
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b-bmu.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, bookmark+, placeholders, annotations, search, info, url, eww, w3m, gnus
 ;;
 ;; Features that might be required by this library:
 ;;
-;;   `apropos', `apropos+', `avoid', `backquote', `bookmark',
-;;   `bookmark+', `bookmark+-1', `bookmark+-bmu', `bookmark+-key',
-;;   `bookmark+-lit', `button', `bytecomp', `cconv', `cl', `cl-lib',
-;;   `cmds-menu', `col-highlight', `crosshairs', `fit-frame',
-;;   `font-lock', `font-lock+', `frame-fns', `gv', `help+',
-;;   `help-fns', `help-fns+', `help-macro', `help-macro+',
-;;   `help-mode', `hl-line', `hl-line+', `info', `info+', `kmacro',
-;;   `macroexp', `menu-bar', `menu-bar+', `misc-cmds', `misc-fns',
-;;   `naked', `pp', `pp+', `radix-tree', `rect', `replace',
-;;   `second-sel', `strings', `syntax', `text-mode', `thingatpt',
-;;   `thingatpt+', `vline', `w32browser-dlgopen', `wid-edit',
+;;   `apropos', `apropos+', `auth-source', `avoid', `backquote',
+;;   `bookmark', `bookmark+', `bookmark+-1', `bookmark+-bmu',
+;;   `bookmark+-key', `bookmark+-lit', `button', `bytecomp', `cconv',
+;;   `cl-generic', `cl-lib', `cl-macs', `cmds-menu', `col-highlight',
+;;   `crosshairs', `eieio', `eieio-core', `eieio-loaddefs',
+;;   `epg-config', `fit-frame', `font-lock', `font-lock+',
+;;   `frame-fns', `gv', `help+', `help-fns', `help-fns+',
+;;   `help-macro', `help-macro+', `help-mode', `hl-line', `hl-line+',
+;;   `info', `info+', `kmacro', `macroexp', `menu-bar', `menu-bar+',
+;;   `misc-cmds', `misc-fns', `naked', `package', `password-cache',
+;;   `pp', `pp+', `radix-tree', `rect', `replace', `second-sel',
+;;   `seq', `strings', `syntax', `tabulated-list', `text-mode',
+;;   `thingatpt', `thingatpt+', `url-handlers', `url-parse',
+;;   `url-vars', `vline', `w32browser-dlgopen', `wid-edit',
 ;;   `wid-edit+'.
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;    `bmkp-bmenu-commands-file',
 ;;    `bmkp-bmenu-image-bookmark-icon-file',
 ;;    `bmkp-bmenu-omitted-bookmarks', `bmkp-bmenu-state-file',
-;;    `bmkp-propertize-bookmark-names-flag', `bmkp-sort-orders-alist',
-;;    `bmkp-sort-orders-for-cycling-alist'.
+;;    `bmkp-propertize-bookmark-names-flag',
+;;    `bmkp-bmenu-show-file-not-buffer-flag',
+;;    `bmkp-sort-orders-alist', `bmkp-sort-orders-for-cycling-alist'.
 ;;
 ;;  Non-interactive functions defined here:
 ;;
 ;;    `bmkp-string-match-p', `bookmark-name-from-full-record',
 ;;    `bookmark-name-from-record',
 ;;
-;;  Internal variables defined here:
+;;  Internal variables and constants defined here:
 ;;
 ;;    `bmkp-bmenu-before-hide-marked-alist',
 ;;    `bmkp-bmenu-before-hide-unmarked-alist',
 ;;    `bmkp-bmenu-line-overlay', `bmkp-bmenu-mark-menu',
 ;;    `bmkp-bmenu-marked-bookmarks', `bmkp-bmenu-marks-width',
 ;;    `bmkp-bmenu-mark-types-menu', `bmkp-bmenu-menubar-menu',
-;;    `bmkp-bmenu-omit-menu', `bmkp-bmenu-search-menu',
+;;    `bmkp--bmenu-nb->', `bmkp--bmenu-nb-a', `bmkp--bmenu-nb-D',
+;;    `bmkp--bmenu-nb-t', `bmkp--bmenu-nb-X', `bmkp--bmenu-nb-*',
+;;    `bmkp-bmenu-omit-menu', `bmkp--bmenu-regexp->',
+;;    `bmkp--bmenu-regexp-a', `bmkp--bmenu-regexp-D',
+;;    `bmkp--bmenu-regexp-t', `bmkp--bmenu-regexp-X',
+;;    `bmkp--bmenu-regexp-*', `bmkp-bmenu-search-menu',
 ;;    `bmkp-bmenu-show-menu',
 ;;    `bmkp-bmenu-show-types-menu',`bmkp-bmenu-sort-menu',
 ;;    `bmkp-bmenu-tags-menu', `bmkp-bmenu-title',
 
 ;;;;;;;;;;;;;;;;;;;;;;;
 
-(eval-when-compile (require 'cl)) ;; case (plus, for Emacs 20: dolist, push)
+(eval-when-compile (unless (require 'cl-lib nil t)
+                     (require 'cl)
+                     (defalias 'cl-case 'case)))
+
 (eval-when-compile (require 'easymenu)) ;; easy-menu-create-menu
 (eval-when-compile (require 'org nil t)) ;; org-add-link-type
 
 ;; bookmark-name-from-record, bookmark-prop-get
 
 
+;; Emacs 28 changes the parent of `bookmark-bmenu-mode-map' to `tabulated-list-mode-map'.
+;; Not good.  Change it back to `special-mode-map'.
+(defvar special-mode-map)               ; Emacs 20-22.  Quiet the byte-compiler.
+(when (boundp 'special-mode-map)        ; Emacs 23+
+  (set-keymap-parent bookmark-bmenu-mode-map special-mode-map))
+
+
+
 ;; Some general Renamings.
 ;;
 ;; 1. Fix incompatibility introduced by gratuitous Emacs name change.
@@ -466,7 +486,8 @@ Elements of ALIST that are not conses are ignored."
 
 ;; Quiet the byte-compiler
 (defvar bookmark-file-coding-system)    ; In `bookmark.el' (Emacs 25.2+)
-(defvar bmkp-bmenu-buffer)              ; In `bookmark+.el'
+(defvar bmkp-auto-light-when-jump)      ; In `bookmark+-lit.el'.
+(defvar bmkp-bmenu-buffer)              ; In `bookmark+.el'.
 (defvar bmkp-bmenu-highlight-menu)      ; Defined in this file (conditionally).
 (defvar bmkp-copied-tags)               ; In `bookmark+-1.el'.
 (defvar bmkp-count-multi-mods-as-one-flag) ; In `bookmark+-1.el'.
@@ -487,6 +508,7 @@ Elements of ALIST that are not conses are ignored."
 (defvar bmkp-sort-orders-alist)         ; Here.
 (defvar bmkp-su-or-sudo-regexp)         ; In `bookmark+-1.el'.
 (defvar bmkp-temporary-bookmarking-mode) ; In `bookmark+-1.el'.
+(defvar describe-function-orig-buffer)  ; In `help-fns.el' (Emacs 28+).
 (defvar dired-re-mark)                  ; In `dired.el'.
 (defvar icicle-candidate-properties-alist) ; In `icicles-var.el'.
 (defvar minibuffer-prompt-properties)   ; Emacs 22+.
@@ -699,6 +721,7 @@ whatever OLD is bound to in MAP, or in OLDMAP, if provided."
 ;;(@* "User Options (Customizable)")
 ;;; User Options (Customizable) --------------------------------------
 
+
 ;;;###autoload (autoload 'bmkp-bmenu-omitted-bookmarks "bookmark+")
 (defcustom bmkp-bmenu-omitted-bookmarks ()
   "*List of names of omitted bookmarks.
@@ -772,6 +795,19 @@ https://www.emacswiki.org/emacs/BookmarkPlusImageFileDefaultIcon"
           (const :tag "Show no image"))
   :group 'bookmark-plus)
 
+;;;###autoload (autoload 'bmkp-bmenu-show-file-not-buffer-flag "bookmark+")
+(defcustom bmkp-bmenu-show-file-not-buffer-flag nil
+  "Non-nil means show bookmark file names, not buffer names.
+This applies to the location shown to the right of the bookmark
+name.  (You hide/show this column using \\<bookmark-bmenu-mode-map>\
+`\\[bookmark-bmenu-toggle-filenames]'.)
+
+This applies only if a bookmark records no explicit `location' entry
+and it records both a buffer name and a file name.  If it records
+`location' then that is what is shown.  If it records only a file name
+or only a buffer name then that is shown."
+  :type 'boolean :group 'bookmark-plus)
+
 ;; This is a general option.  It is in this file because it is used mainly by the bmenu code.
 (when (> emacs-major-version 20)
   (defcustom bmkp-sort-orders-alist ()
@@ -845,6 +881,30 @@ Each alist element has the form (SORT-ORDER . COMPARER):
 This means that you can effectively have more than one bookmark with
 the same name.
 
+___
+
+Just FYI, in case you're interested in Lisp things -
+
+If the value is non-nil and you examine the internal definitions of
+bookmarks (e.g. by opening your bookmark file or using `\\[describe-variable]
+bookmark-alist'), then you'll see the propertized strings written
+something like this (instead of just \"NAME\"), where NAME is the
+bookmark name:
+
+  #(\"NAME\" 0 15 (bmkp-full-record #1))
+
+\(If you examine the internal form of a bookmark using \\<bookmark-bmenu-mode-map>\
+`C-u \\[bmkp-bmenu-describe-this-bookmark]',
+then you won't see that.  The help output removes that noise, to just
+show you \"NAME\".)
+
+That propertized-string Lisp syntax shows that the bookmark-name
+string \"NAME\" has property `bmkp-full-record', whose value is in
+fact the list that is the full bookmark record, including that string
+itself!
+
+___
+
 Emacs 20 users: If you need to use your bookmarks with Emacs 20 then
 set this to nil.  In particular, if your bookmark file was written
 with this as non-nil, then it contains propertized strings which are
@@ -942,14 +1002,15 @@ prompting with completion for the new path."
 
 ;; REPLACES ORIGINAL in `bookmark.el'.
 ;;
-;; 1. Add bookmark to `bmkp-bmenu-marked-bookmarks'.  Delete it from `bmkp-flagged-bookmarks'.
-;; 2. Don't call `bookmark-bmenu-ensure-position' again at end.
-;; 3. Raise error if not in `*Bookmark List*'.
-;; 4. Narrower scope for `with-buffer-modified-unmodified' and `let'.
-;; 5. If current sort is `s >' (marked first or last), and it was unmarked before, then re-sort.
-;; 6. Added optional arg NO-RE-SORT-P to inhibit #5.
-;; 7. Added optional arg MSG-P.
-;; 8. Call `bmkp-bmenu-mode-line'.
+;; 1. Don't use `tabulated-list-mode' (Emacs 28+).
+;; 2 Add bookmark to `bmkp-bmenu-marked-bookmarks'.  Delete it from `bmkp-flagged-bookmarks'.
+;; 3. Don't call `bookmark-bmenu-ensure-position' again at end.
+;; 4. Raise error if not in `*Bookmark List*'.
+;; 5. Narrower scope for `with-buffer-modified-unmodified' and `let'.
+;; 6. If current sort is `s >' (marked first or last), and it was unmarked before, then re-sort.
+;; 7. Added optional arg NO-RE-SORT-P to inhibit #5.
+;; 8. Added optional arg MSG-P.
+;; 9. Call `bmkp-bmenu-mode-line'.
 ;;
 ;;;###autoload (autoload 'bookmark-bmenu-mark "bookmark+")
 (defun bookmark-bmenu-mark (&optional no-re-sort-p msg-p) ; Bound to `m' in bookmark list
@@ -992,15 +1053,16 @@ Non-interactively:
 
 ;; REPLACES ORIGINAL in `bookmark.el'.
 ;;
-;; 1. Remove bookmark from `bmkp-bmenu-marked-bookmarks' and `bmkp-flagged-bookmarks'.
-;; 2. Use `bmkp-delete-bookmark-name-from-list', not `delete'.
-;; 3. Don't call `bookmark-bmenu-ensure-position' again at end.
-;; 4. Raise error if not in `*Bookmark List*'.
-;; 5. Narrower scope for `with-buffer-modified-unmodified' and `let'.
-;; 6. If current sort is `s >' (marked first or last), and it was marked before, then re-sort.
-;; 7. Added optional arg NO-RE-SORT-P to inhibit #6.
-;; 8. Added optional arg MSG-P.
-;; 9. Call `bmkp-bmenu-mode-line'.
+;;  1. Don't use `tabulated-list-mode' (Emacs 28+).
+;;  2. Remove bookmark from `bmkp-bmenu-marked-bookmarks' and `bmkp-flagged-bookmarks'.
+;;  3. Use `bmkp-delete-bookmark-name-from-list', not `delete'.
+;;  4. Don't call `bookmark-bmenu-ensure-position' again at end.
+;;  5. Raise error if not in `*Bookmark List*'.
+;;  6. Narrower scope for `with-buffer-modified-unmodified' and `let'.
+;;  7. If current sort is `s >' (marked first or last), and it was marked before, then re-sort.
+;;  8. Added optional arg NO-RE-SORT-P to inhibit #6.
+;;  9. Added optional arg MSG-P.
+;; 10. Call `bmkp-bmenu-mode-line'.
 ;;
 ;;;###autoload (autoload 'bookmark-bmenu-unmark "bookmark+")
 (defun bookmark-bmenu-unmark (&optional backup no-re-sort-p msg-p) ; Bound to `u' in bookmark list
@@ -1038,13 +1100,14 @@ Non-interactively:
 
 ;; REPLACES ORIGINAL in `bookmark.el'.
 ;;
-;; 1. Do not use `bookmark-bmenu-ensure-position' as a test - it always returns non-nil anyway.
+;; 1. Don't use `tabulated-list-mode' (Emacs 28+).
+;; 2. Do not use `bookmark-bmenu-ensure-position' as a test - it always returns non-nil anyway.
 ;;    And don't call it again the end.
-;; 2. Use `bmkp-delete-bookmark-name-from-list', not `delete'.
-;; 3. Use face `bmkp-D-mark' on the `D' flag.
-;; 4. Raise error if not in buffer `*Bookmark List*'.
-;; 5. Remove bookmark from `bmkp-bmenu-marked-bookmarks'.  Add it to `bmkp-flagged-bookmarks'.
-;; 6. Call `bmkp-bmenu-mode-line'.
+;; 3. Use `bmkp-delete-bookmark-name-from-list', not `delete'.
+;; 4. Use face `bmkp-D-mark' on the `D' flag.
+;; 5. Raise error if not in buffer `*Bookmark List*'.
+;; 6. Remove bookmark from `bmkp-bmenu-marked-bookmarks'.  Add it to `bmkp-flagged-bookmarks'.
+;; 7. Call `bmkp-bmenu-mode-line'.
 ;;
 ;;;###autoload (autoload 'bmkp-bmenu-flag-for-deletion "bookmark+")
 (defalias 'bmkp-bmenu-flag-for-deletion 'bookmark-bmenu-delete) ; A better name.
@@ -1138,7 +1201,7 @@ Use `customize-face' if you want to change the appearance.
  `bmkp-su-or-sudo', `bmkp-url', `bmkp-variable-list'
 
 If option `bmkp-bmenu-state-file' is non-nil then the state of the
-displayed bookmark-list is saved when you quit it, and it is restored
+displayed bookmark list is saved when you quit it, and it is restored
 when you next use this command.  That saved state is not restored,
 however, if it represents a different file from the current bookmark
 file.
@@ -1279,7 +1342,7 @@ Non-nil INTERACTIVEP means `bookmark-bmenu-list' was called
     (insert (format "Bookmark file:\n%s\n\n" bmkp-current-bookmark-file))
     (forward-line bmkp-bmenu-header-lines)
     (let ((max-width  0)
-          name markedp flaggedp tags annotation temporaryp start)
+          name markedp flaggedp tags annotation start)
       (setq bmkp-sorted-alist  (bmkp-sort-omit bookmark-alist
                                                (and (not (eq bmkp-bmenu-filter-function
                                                              'bmkp-omitted-alist-only))
@@ -1332,9 +1395,10 @@ Non-nil INTERACTIVEP means `bookmark-bmenu-list' was called
 ;; REPLACES ORIGINAL in `bookmark.el'.
 ;;
 ;; Redefined.
-;; 1. Get name of the current bookmark from text property `bmkp-bookmark-name'.
-;; 2. Added optional arg FULL, to return full bookmark record.
-;; 3. Use `condition-case' in case we're at eob (so cannot advance).
+;; 1. Don't use `tabulated-list-mode' (Emacs 28+).
+;; 2. Get name of the current bookmark from text property `bmkp-bookmark-name'.
+;; 3. Added optional arg FULL, to return full bookmark record.
+;; 4. Use `condition-case' in case we're at eob (so cannot advance).
 ;;
 (defun bookmark-bmenu-bookmark (&optional full)
   "Return the name of the bookmark on this line.
@@ -1352,7 +1416,8 @@ Non-nil optional FULL means return the bookmark record, not the name."
 ;; REPLACES ORIGINAL in `bookmark.el'.
 ;;
 ;; 1. Mode-line major-mode name is different, and indicates whether in temporary bookmarking minor mode.
-;; 2. Doc string is different.
+;; 2. Don't derive from `tabulated-list-mode' (Emacs 28+).
+;; 3. Doc string is different.
 ;;
 (defun bookmark-bmenu-mode ()
   "Major mode for editing a list of bookmarks.
@@ -1371,51 +1436,56 @@ Help - Bookmark Info
 --------------------
 
 \\<bookmark-bmenu-mode-map>\
-\\[bookmark-bmenu-toggle-filenames]\t- Toggle showing filenames next to bookmarks
-\\[bmkp-bmenu-describe-this-bookmark]\t- Show information about bookmark       (`C-u': internal form)
-\\[bmkp-bmenu-describe-this+move-down]\t- Show the info, then move to next bookmark
-\\[bmkp-bmenu-describe-this+move-up]\t- Show the info, then move to previous bookmark
-\\[bmkp-bmenu-describe-marked]\t- Show info about the marked bookmarks  (`C-u': internal form)
-\\[bookmark-bmenu-locate]\t- Show location of bookmark (in minibuffer)
-\\[bookmark-bmenu-show-annotation]\t- Show bookmark's annotation
-\\[bookmark-bmenu-show-all-annotations]\t- Show the annotations of all annotated bookmarks
-
-\\[bmkp-list-defuns-in-commands-file]
+`\\[bookmark-bmenu-toggle-filenames]'\t- Toggle showing filenames next to bookmarks
+`\\[bmkp-bmenu-describe-this-bookmark]'
+\t- Show information about bookmark       (`C-u': internal form)
+`\\[bmkp-bmenu-describe-this+move-down]'
+\t- Show the info, then move to next bookmark
+`\\[bmkp-bmenu-describe-this+move-up]'\t- Show the info, then move to previous bookmark
+`\\[bmkp-bmenu-describe-marked]'\t- Show info about the marked bookmarks  (`C-u': internal form)
+`\\[bookmark-bmenu-locate]'\t- Show location of bookmark (in minibuffer)
+`\\[bookmark-bmenu-show-annotation]'\t- Show bookmark's annotation
+`\\[bookmark-bmenu-show-all-annotations]'\t- Show the annotations of all annotated bookmarks
+
+`\\[bmkp-list-defuns-in-commands-file]'
 \t- List the commands defined in `bmkp-bmenu-commands-file'
 
 
 Bookmark-List Display (`*Bookmark List*')
 -----------------------------------------
 
-\\[bmkp-toggle-saving-menu-list-state]\t- Toggle autosaving bookmark-list display state
-\\[bmkp-save-menu-list-state]\t- Save bookmark-list display state
+`\\[bmkp-toggle-saving-menu-list-state]'\t- Toggle autosaving bookmark-list display state
+`\\[bmkp-save-menu-list-state]'\t- Save bookmark-list display state
 
-\\[bmkp-bmenu-refresh-menu-list]\t- Refresh display to current bookmark list  (`C-u': from file)
-\\[bmkp-bmenu-show-all]\t- Show all bookmarks
-\\[bmkp-toggle-bookmark-set-refreshes]
+`\\[bmkp-bmenu-refresh-menu-list]'\t- Refresh display to current bookmark list  (`C-u': from file)
+`\\[bmkp-bmenu-show-all]'\t- Show all bookmarks
+`\\[bmkp-toggle-bookmark-set-refreshes]'
 \t- Toggle whether `bookmark-set' refreshes the bookmark list
-\\[bmkp-bmenu-mode-status-help]\t- Show this help
-\\[bmkp-bmenu-quit]\t- Quit (`*Bookmark List*')
+
+`\\[bmkp-bmenu-mode-status-help]'\t- Show this help
+`\\[bmkp-bmenu-quit]'\t- Quit (`*Bookmark List*')
 
 
 Bookmark Files
 --------------
 
-\\[bmkp-toggle-saving-bookmark-file]\t- Toggle autosaving to the current bookmark file
-\\[bookmark-bmenu-save]\t- Save bookmarks now     (`C-u': Save As... - prompt for file)
-\\[bmkp-empty-file]\t- Empty existing bookmark file or create new, empty one
+`\\[bmkp-toggle-saving-bookmark-file]'\t- Toggle autosaving to the current bookmark file
+`\\[bookmark-bmenu-save]'\t- Save bookmarks now (`C-u': Save As... - prompt for file)
+`\\[bmkp-empty-file]'
+\t- Empty existing bookmark file or create new, empty one
 
-C-u \\[bmkp-bmenu-refresh-menu-list]\t- Revert to bookmarks in the bookmark file    (overwrite load)
-\\[bmkp-switch-bookmark-file-create]\t- Switch to a different bookmark file         (overwrite load)
-C-u \\[bmkp-switch-bookmark-file-create]\t- Switch back to the previous bookmark file   (overwrite load)
-\\[bookmark-bmenu-load]\t- Add bookmarks from a different bookmark file    (extra load)
-\\[bmkp-bmenu-load-marked-bookmark-file-bookmarks]\t- Load marked bookmark-file bookmarks             \
-\(extra load)
+`C-u \\[bmkp-bmenu-refresh-menu-list]'\t- Revert to bookmarks in the bookmark file    (overwrite load)
+`\\[bmkp-switch-bookmark-file-create]'\t- Switch to a different bookmark file         (overwrite load)
+`C-u \\[bmkp-switch-bookmark-file-create]'
+\t- Switch back to the previous bookmark file   (overwrite load)
+`\\[bookmark-bmenu-load]'\t- Add bookmarks from a different bookmark file    (extra load)
+`\\[bmkp-bmenu-load-marked-bookmark-file-bookmarks]'\t- Load marked bookmark-file bookmarks\
+             (extra load)
 
-\\[bmkp-bmenu-move-marked-to-bookmark-file]\t- Move the marked bookmarks to a bookmark file
-\\[bmkp-bmenu-copy-marked-to-bookmark-file]\t- Copy the marked bookmarks to a bookmark file
-\\[bmkp-bmenu-create-bookmark-file-from-marked]\t- Copy the marked bookmarks to a new bookmark file
-C-u \\[bmkp-bmenu-create-bookmark-file-from-marked]\t- Same, plus create bookmark-file bookmark for it
+`\\[bmkp-bmenu-move-marked-to-bookmark-file]'\t- Move the marked bookmarks to a bookmark file
+`\\[bmkp-bmenu-copy-marked-to-bookmark-file]'\t- Copy the marked bookmarks to a bookmark file
+`\\[bmkp-bmenu-create-bookmark-file-from-marked]'\t- Copy the marked bookmarks to a new bookmark file
+`C-u \\[bmkp-bmenu-create-bookmark-file-from-marked]'\t- Same, plus create bookmark-file bookmark for it
 
 
 General
@@ -1423,125 +1493,128 @@ General
 
 Here:
 
-\\[bmkp-bmenu-dired-marked]\t- Open Dired for the marked file and directory bookmarks
-\\[bmkp-bmenu-make-sequence-from-marked]
+`\\[bmkp-bmenu-dired-marked]'\t- Open Dired for the marked file and directory bookmarks
+`\\[bmkp-bmenu-make-sequence-from-marked]'
 \t- Create a sequence bookmark from the marked bookmarks
-\\[bmkp-temporary-bookmarking-mode]\t- Toggle temporary-only bookmarking (new, empty bookmark file)
+`\\[bmkp-temporary-bookmarking-mode]'\t- Toggle temporary-only bookmarking (new, empty bookmark file)
 
 Anywhere:
 
 \\<global-map>\
-\\[bmkp-toggle-autotemp-on-set]\t- Toggle making bookmarks temporary when setting them
-\\[bmkp-set-bookmark-file-bookmark]\t- Create a bookmark to a bookmark file (`j y' to load it)
-\\[bmkp-delete-bookmarks]\t- Delete some bookmarks at point or all in buffer
-\\[bmkp-make-function-bookmark]\t- Create a function bookmark
-
-\\[bmkp-choose-navlist-of-type]\t- Set the navlist to the bookmarks of a type you choose
-\\[bmkp-choose-navlist-from-bookmark-list]\t- Set the navlist to the bookmarks of a \
-bookmark-list bookmark
-\\[bmkp-navlist-bmenu-list]\t- Open `*Bookmark List*' for bookmarks in navlist
-
-\\[bmkp-this-file/buffer-bmenu-list]\t- Open `*Bookmark List*' for bookmarks in current file/buffer
-\\[bmkp-switch-to-bookmark-file-this-file/buffer]\t- Switch to bookmark file for current file/buffer
-\\[bmkp-save-bookmarks-this-file/buffer]\t- Save bookmarks for current file/buffer to a file
+`\\[bmkp-toggle-autotemp-on-set]'
+\t- Toggle making bookmarks temporary when setting them
+`\\[bmkp-set-bookmark-file-bookmark]'\t- Create a bookmark to a bookmark file
+\t(`\\[bmkp-bookmark-file-jump]' to load it, `C-u \\[bmkp-bookmark-file-jump]' to switch to it)
+`\\[bmkp-delete-bookmarks]'\t- Delete some bookmarks at point or all in buffer
+`\\[bmkp-make-function-bookmark]'\t- Create a function bookmark
+
+`\\[bmkp-choose-navlist-of-type]'\t- Set navlist to bookmarks of a type you choose
+`\\[bmkp-choose-navlist-from-bookmark-list]'\t- Set navlist to bookmarks of a bookmark-list bookmark
+`\\[bmkp-navlist-bmenu-list]'\t- Open `*Bookmark List*' for bookmarks in navlist
+
+`\\[bmkp-this-file/buffer-bmenu-list]'
+\t- Open `*Bookmark List*' for bookmarks in current file/buffer
+`\\[bmkp-switch-to-bookmark-file-this-file/buffer]'\t- Switch to bookmark file for current file/buffer
+`\\[bmkp-save-bookmarks-this-file/buffer]'\t- Save bookmarks for current file/buffer to a file
 \\<bookmark-bmenu-mode-map>
 
 
 Create/Set Bookmarks (anywhere)
 --------------------
 
-\\[bmkp-toggle-autonamed-bookmark-set/delete]\t- Set/delete an autonamed bookmark here
-\\[bmkp-autofile-set]\t- Set and autoname a bookmark for a file
-\\[bmkp-file-target-set]\t- Set a bookmark for a file
-\\[bmkp-url-target-set]\t- Set a bookmark for a URL
-\\[bmkp-bookmark-set-confirm-overwrite]\t\t- Set a bookmark here
-\\[bmkp-set-desktop-bookmark]\t\t- Set a bookmark for the current desktop
-\\[bmkp-set-bookmark-file-bookmark]\t\t- Set a bookmark for a bookmark file
-\\[bmkp-set-snippet-bookmark]\t- Save the region text as a snippet bookmark
+`\\[bmkp-toggle-autonamed-bookmark-set/delete]'\t- Set/delete an autonamed bookmark here
+`\\[bmkp-autofile-set]'\t- Set and autoname a bookmark for a file
+`\\[bmkp-file-target-set]'\t- Set a bookmark for a file
+`\\[bmkp-url-target-set]'\t- Set a bookmark for a URL
+`\\[bmkp-bookmark-set-confirm-overwrite]'\t- Set a bookmark here
+`\\[bmkp-set-desktop-bookmark]'\t- Set a bookmark for the current desktop
+`\\[bmkp-set-bookmark-file-bookmark]'\t- Set a bookmark for a bookmark file
+`\\[bmkp-set-snippet-bookmark]'\t- Save the region text as a snippet bookmark
 
 
 Jump to (Visit) Bookmarks
 -------------------------
 
-\\[bookmark-bmenu-this-window]\t- This bookmark in the same window
-\\[bookmark-bmenu-other-window]\t- This bookmark in another window
-\\[bookmark-bmenu-switch-other-window]\t- This bookmark in other window, without selecting it
-\\[bookmark-bmenu-2-window]\t- This bookmark and last-visited bookmark
-\\[bookmark-bmenu-1-window]\t- This bookmark in a full-frame window
-\\[bookmark-bmenu-other-frame]\t- This bookmark in another frame
+`\\[bookmark-bmenu-this-window]'\t- This bookmark in the same window
+`\\[bookmark-bmenu-other-window]'\t- This bookmark in another window
+`\\[bookmark-bmenu-switch-other-window]'\t- This bookmark in other window, without selecting it
+`\\[bookmark-bmenu-2-window]'\t- This bookmark and last-visited bookmark
+`\\[bookmark-bmenu-1-window]'\t- This bookmark in a full-frame window
+`\\[bookmark-bmenu-other-frame]'
+\t- This bookmark in another frame
 
-\\[bmkp-bmenu-jump-to-marked]\t- Bookmarks marked `>', in other windows
+`\\[bmkp-bmenu-jump-to-marked]'\t- Bookmarks marked `>', in other windows
 
 Prefix `j' uses another window; prefix `J' reuses this window:
 
-\\[bookmark-jump-other-window]\t- Bookmark by name
-\\[bmkp-jump-in-navlist-other-window]\t- Bookmark in the navigation list
-\\[bmkp-lighted-jump-other-window]\t- Highlighted bookmark
-
-\\[bmkp-jump-to-type-other-window]\t- Bookmark by type
-\\[bmkp-autonamed-jump-other-window]\t- Autonamed bookmark
-\\[bmkp-autonamed-this-buffer-jump-other-window]\t- Autonamed bookmark in this buffer
-\\[bmkp-temporary-jump-other-window]\t- Temporary bookmark
-
-\\[bmkp-autofile-jump-other-window]\t- Autofile bookmark
-\\[bmkp-dired-jump-other-window]\t- Dired bookmark
-\\[bmkp-file-jump-other-window]\t- File or directory bookmark
-\\[bmkp-dired-this-dir-jump-other-window]\t- Dired bookmark for this dir
-\\[bmkp-file-this-dir-jump-other-window]\t- Bookmark for a file or subdir in this dir
-\\[bmkp-local-file-jump-other-window]\t- Local-file bookmark
-\\[bmkp-remote-file-jump-other-window]\t- Remote-file bookmark
-\\[bmkp-non-file-jump-other-window]\t- Non-file (buffer) bookmark
-
-\\[bmkp-desktop-jump]\t- Desktop bookmark
-\\[bmkp-bookmark-list-jump]\t- Bookmark-list bookmark
-\\[bmkp-bookmark-file-jump]\t- Bookmark-file bookmark
-
-\\[bmkp-region-jump-other-window]\t- Region bookmark (restore region)
-\\[bmkp-snippet-to-kill-ring]\t- Snippet bookmark (copy to `kill-ring')
-\\[bmkp-image-jump-other-window]\t- Image-file bookmark
-\\[bmkp-info-jump-other-window]\t- Info bookmark
-\\[bmkp-man-jump-other-window]\t- `man'-page bookmark
-\\[bmkp-gnus-jump-other-window]\t- Gnus bookmark
-\\[bmkp-url-jump-other-window]\t- URL bookmark
-\\[bmkp-variable-list-jump]\t- Variable-list bookmark
-
-\\[bmkp-some-tags-jump-other-window]\t- Bookmark having some tags you specify
-\\[bmkp-all-tags-jump-other-window]\t- Bookmark having each tag you specify
-\\[bmkp-some-tags-regexp-jump-other-window]\t- Bookmark having a tag that matches a regexp
-\\[bmkp-all-tags-regexp-jump-other-window]\t- Bookmark having all its tags match a regexp
-\\[bmkp-file-some-tags-jump-other-window]\t- File bookmark having some tags you specify
-\\[bmkp-file-all-tags-jump-other-window]\t- File bookmark having each tag you specify
-\\[bmkp-file-some-tags-regexp-jump-other-window]\t- File bookmark having a tag that matches a regexp
-\\[bmkp-file-all-tags-regexp-jump-other-window]\t- File bookmark having all its tags match a regexp
-\\[bmkp-file-this-dir-some-tags-jump-other-window]\t- File in this dir having some tags you specify
-\\[bmkp-file-this-dir-all-tags-jump-other-window]\t- File in this dir having each tag you specify
-\\[bmkp-file-this-dir-some-tags-regexp-jump-other-window]\t- \
+`\\[bookmark-jump-other-window]'\t- Bookmark by name
+`\\[bmkp-jump-in-navlist-other-window]'\t- Bookmark in the navigation list
+`\\[bmkp-lighted-jump-other-window]'\t- Highlighted bookmark
+
+`\\[bmkp-jump-to-type-other-window]'\t- Bookmark by type
+`\\[bmkp-autonamed-jump-other-window]'\t- Autonamed bookmark
+`\\[bmkp-autonamed-this-buffer-jump-other-window]'\t- Autonamed bookmark in this buffer
+`\\[bmkp-temporary-jump-other-window]'\t- Temporary bookmark
+
+`\\[bmkp-autofile-jump-other-window]'\t- Autofile bookmark
+`\\[bmkp-dired-jump-other-window]'\t- Dired bookmark
+`\\[bmkp-file-jump-other-window]'\t- File or directory bookmark
+`\\[bmkp-dired-this-dir-jump-other-window]'\t- Dired bookmark for this dir
+`\\[bmkp-file-this-dir-jump-other-window]'\t- Bookmark for a file or subdir in this dir
+`\\[bmkp-local-file-jump-other-window]'\t- Local-file bookmark
+`\\[bmkp-remote-file-jump-other-window]'\t- Remote-file bookmark
+`\\[bmkp-non-file-jump-other-window]'\t- Non-file (buffer) bookmark
+
+`\\[bmkp-desktop-jump]'\t- Desktop bookmark
+`\\[bmkp-bookmark-list-jump]'\t- Bookmark-list bookmark
+`\\[bmkp-bookmark-file-jump]'\t- Bookmark-file bookmark
+
+`\\[bmkp-region-jump-other-window]'\t- Region bookmark (restore region)
+`\\[bmkp-snippet-to-kill-ring]'\t- Snippet bookmark (copy to `kill-ring')
+`\\[bmkp-image-jump-other-window]'\t- Image-file bookmark
+`\\[bmkp-info-jump-other-window]'\t- Info bookmark
+`\\[bmkp-man-jump-other-window]'\t- `man'-page bookmark
+`\\[bmkp-gnus-jump-other-window]'\t- Gnus bookmark
+`\\[bmkp-url-jump-other-window]'\t- URL bookmark
+`\\[bmkp-variable-list-jump]'\t- Variable-list bookmark
+
+`\\[bmkp-some-tags-jump-other-window]'\t- Bookmark having some tags you specify
+`\\[bmkp-all-tags-jump-other-window]'\t- Bookmark having each tag you specify
+`\\[bmkp-some-tags-regexp-jump-other-window]'\t- Bookmark having a tag that matches a regexp
+`\\[bmkp-all-tags-regexp-jump-other-window]'\t- Bookmark having all its tags match a regexp
+`\\[bmkp-file-some-tags-jump-other-window]'\t- File bookmark having some tags you specify
+`\\[bmkp-file-all-tags-jump-other-window]'\t- File bookmark having each tag you specify
+`\\[bmkp-file-some-tags-regexp-jump-other-window]'\t- File bookmark having a tag that matches a regexp
+`\\[bmkp-file-all-tags-regexp-jump-other-window]'\t- File bookmark having all its tags match a regexp
+`\\[bmkp-file-this-dir-some-tags-jump-other-window]'\t- File in this dir having some tags you specify
+`\\[bmkp-file-this-dir-all-tags-jump-other-window]'\t- File in this dir having each tag you specify
+`\\[bmkp-file-this-dir-some-tags-regexp-jump-other-window]'\t- \
 File in this dir having a tag that matches a regexp
-\\[bmkp-file-this-dir-all-tags-regexp-jump-other-window]\t- \
+`\\[bmkp-file-this-dir-all-tags-regexp-jump-other-window]'\t- \
 File in this dir having all its tags match a regexp
 
 
 Autonamed Bookmarks
 -------------------
 
-\\[bmkp-toggle-autonamed-bookmark-set/delete]\t- Create/delete autonamed bookmark at point
-C-u \\[bmkp-toggle-autonamed-bookmark-set/delete]\t- Delete all autonamed bookmarks in current buffer
-\\[bmkp-autonamed-jump-other-window]\t\t- Jump to an autonamed bookmark
-\\[bmkp-autonamed-this-buffer-jump-other-window]\t\t- Jump to an autonamed bookmark in a given buffer
+`\\[bmkp-toggle-autonamed-bookmark-set/delete]'\t- Create/delete autonamed bookmark at point
+`C-u \\[bmkp-toggle-autonamed-bookmark-set/delete]'\t- Delete all autonamed bookmarks in current buffer
+`\\[bmkp-autonamed-jump-other-window]'\t\t- Jump to an autonamed bookmark
+`\\[bmkp-autonamed-this-buffer-jump-other-window]'\t\t- Jump to an autonamed bookmark in a given buffer
 
 
 Cycle Bookmarks (anywhere)
 ---------------
 
-\\[bmkp-next-bookmark-this-file/buffer-repeat]...\t- Next bookmark in buffer         (C-x x n, C-x x C-n)
-\\[bmkp-previous-bookmark-this-file/buffer-repeat]...\t- Prev bookmark in buffer         (C-x x p, \
+`\\[bmkp-next-bookmark-this-file/buffer-repeat]'...\t- Next bookmark in buffer         (C-x x n, C-x x C-n)
+`\\[bmkp-previous-bookmark-this-file/buffer-repeat]'...\t- Prev bookmark in buffer         (C-x x p, \
 C-x x C-p)
-\\[bmkp-next-bookmark-repeat]...- Next bookmark in navlist        (C-x x f, C-x x C-f)
-\\[bmkp-previous-bookmark-repeat]...\t- Prev bookmark in navlist        (C-x x b, C-x x C-b)
-\\[bmkp-next-bookmark-w32-repeat]...\t- MS Windows `Open' next     in navlist   (C-x x next)
-\\[bmkp-previous-bookmark-w32-repeat]...- MS Windows `Open' previous in navlist  (C-x x prior)
-\\[bmkp-next-lighted-this-buffer-repeat]...- Next highlighted bookmark in buffer  (C-x x C-down)
-\\[bmkp-previous-lighted-this-buffer-repeat]...\t- Prev highlighted bookmark in buffer     (C-x x C-up)
+`\\[bmkp-next-bookmark-repeat]'...- Next bookmark in navlist        (C-x x f, C-x x C-f)
+`\\[bmkp-previous-bookmark-repeat]'...\t- Prev bookmark in navlist        (C-x x b, C-x x C-b)
+`\\[bmkp-next-bookmark-w32-repeat]'...\t- MS Windows `Open' next     in navlist   (C-x x next)
+`\\[bmkp-previous-bookmark-w32-repeat]'...- MS Windows `Open' previous in navlist  (C-x x prior)
+`\\[bmkp-next-lighted-this-buffer-repeat]'...- Next highlighted bookmark in buffer  (C-x x C-down)
+`\\[bmkp-previous-lighted-this-buffer-repeat]'...\t- Prev highlighted bookmark in buffer     (C-x x C-up)
 
  Similar, but not bound to keys by default:
   \\[bmkp-next-autonamed-bookmark-repeat]        (and `previous')
@@ -1566,10 +1639,10 @@ C-x x C-p)
 Search-and-Replace in Bookmark Targets (here, in sort order)
 --------------------------------------
 
-\\[bmkp-bmenu-isearch-marked-bookmarks]\t- Isearch the marked bookmarks            (`C-u': all)
-\\[bmkp-bmenu-isearch-marked-bookmarks-regexp]\t- Regexp-isearch the marked bookmarks     (`C-u': all)
-\\[bmkp-bmenu-search-marked-bookmarks-regexp]\t- Regexp-search the marked file bookmarks (`C-u': all)
-\\[bmkp-bmenu-query-replace-marked-bookmarks-regexp]\t\t- Query-replace the marked file bookmarks
+`\\[bmkp-bmenu-isearch-marked-bookmarks]'\t- Isearch the marked bookmarks            (`C-u': all)
+`\\[bmkp-bmenu-isearch-marked-bookmarks-regexp]'\t- Regexp-isearch the marked bookmarks     (`C-u': all)
+`\\[bmkp-bmenu-search-marked-bookmarks-regexp]'\t- Regexp-search the marked file bookmarks (`C-u': all)
+`\\[bmkp-bmenu-query-replace-marked-bookmarks-regexp]'\t\t- Query-replace the marked file bookmarks
 
 
 Mark/Unmark Bookmarks
@@ -1577,63 +1650,64 @@ Mark/Unmark Bookmarks
 
 \(Mark means `>'.  Flag means `D'.   See also `Tags', below.)
 
-\\[bmkp-bmenu-flag-for-deletion]\t- Flag bookmark `D' for deletion, then move down
-\\[bmkp-bmenu-flag-for-deletion-backwards]\t- Flag bookmark `D' for deletion, then move up
-
-\\[bookmark-bmenu-mark]\t- Mark bookmark
-\\[bookmark-bmenu-unmark]\t- Unmark bookmark                    (`C-u': move up one line)
-\\[bookmark-bmenu-backup-unmark]\t- Unmark previous bookmark (move up, then unmark)
-
-\\[bmkp-bmenu-mark-all]\t- Mark all bookmarks
-\\[bmkp-bmenu-regexp-mark]\t- Mark all bookmarks whose names match a regexp
-\\[bmkp-bmenu-unmark-all]\t- Unmark all bookmarks              (`C-u': interactive query)
-\\[bmkp-bmenu-toggle-marks]\t- Toggle marks: unmark the marked and mark the unmarked
-
-\\[bmkp-bmenu-mark-autofile-bookmarks]\t- Mark autofile bookmarks
-\\[bmkp-bmenu-mark-autonamed-bookmarks]\t- Mark autonamed bookmarks
-\\[bmkp-bmenu-mark-temporary-bookmarks]\t- Mark temporary bookmarks
-\\[bmkp-bmenu-mark-lighted-bookmarks]\t- Mark highlighted bookmarks (requires `bookmark+-lit.el)
-
-\\[bmkp-bmenu-mark-non-file-bookmarks]\t- Mark non-file (i.e. buffer) bookmarks
-\\[bmkp-bmenu-mark-dired-bookmarks]\t- Mark Dired bookmarks
-\\[bmkp-bmenu-mark-file-bookmarks]\t- Mark file & directory bookmarks          (`C-u': local only)
-\\[bmkp-bmenu-mark-gnus-bookmarks]\t- Mark Gnus bookmarks
-\\[bmkp-bmenu-mark-info-bookmarks]\t- Mark Info bookmarks
-\\[bmkp-bmenu-mark-icicles-search-hits-bookmarks]\t- Mark Icicles search-hits bookmarks
-\\[bmkp-bmenu-mark-non-invokable-bookmarks]\t- Mark non-invokable bookmarks
-\\[bmkp-bmenu-mark-image-bookmarks]\t- Mark image-file bookmarks
-\\[bmkp-bmenu-mark-desktop-bookmarks]\t- Mark desktop bookmarks
-\\[bmkp-bmenu-mark-man-bookmarks]\t- Mark `man' page bookmarks (that's `M' twice, not Meta-M)
-\\[bmkp-bmenu-mark-orphaned-local-file-bookmarks]\t- Mark orphaned local file/dir bookmarks  (`C-u': \
+`\\[bmkp-bmenu-flag-for-deletion]'\t- Flag bookmark `D' for deletion, then move down
+`\\[bmkp-bmenu-flag-for-deletion-backwards]'\t- Flag bookmark `D' for deletion, then move up
+
+`\\[bookmark-bmenu-mark]'\t- Mark bookmark
+`\\[bookmark-bmenu-unmark]'\t- Unmark bookmark                    (`C-u': move up one line)
+`\\[bookmark-bmenu-backup-unmark]'\t- Unmark previous bookmark (move up, then unmark)
+
+`\\[bmkp-bmenu-mark-all]'\t- Mark all bookmarks
+`\\[bmkp-bmenu-regexp-mark]'\t- Mark all bookmarks whose names match a regexp
+`\\[bmkp-bmenu-unmark-all]'\t- Unmark all bookmarks              (`C-u': interactive query)
+`\\[bmkp-bmenu-toggle-marks]'\t- Toggle marks: unmark the marked and mark the unmarked
+
+`\\[bmkp-bmenu-mark-autofile-bookmarks]'\t- Mark autofile bookmarks
+`\\[bmkp-bmenu-mark-autonamed-bookmarks]'\t- Mark autonamed bookmarks
+`\\[bmkp-bmenu-mark-temporary-bookmarks]'\t- Mark temporary bookmarks
+`\\[bmkp-bmenu-mark-lighted-bookmarks]'\t- Mark highlighted bookmarks (requires `bookmark+-lit.el)
+
+`\\[bmkp-bmenu-mark-non-file-bookmarks]'\t- Mark non-file (i.e. buffer) bookmarks
+`\\[bmkp-bmenu-mark-dired-bookmarks]'\t- Mark Dired bookmarks
+`\\[bmkp-bmenu-mark-file-bookmarks]'\t- Mark file & directory bookmarks          (`C-u': local only)
+`\\[bmkp-bmenu-mark-gnus-bookmarks]'\t- Mark Gnus bookmarks
+`\\[bmkp-bmenu-mark-info-bookmarks]'\t- Mark Info bookmarks
+`\\[bmkp-bmenu-mark-icicles-search-hits-bookmarks]'\t- Mark Icicles search-hits bookmarks
+`\\[bmkp-bmenu-mark-non-invokable-bookmarks]'\t- Mark non-invokable bookmarks
+`\\[bmkp-bmenu-mark-image-bookmarks]'\t- Mark image-file bookmarks
+`\\[bmkp-bmenu-mark-desktop-bookmarks]'\t- Mark desktop bookmarks
+`\\[bmkp-bmenu-mark-man-bookmarks]'\t- Mark `man' page bookmarks (that's `M' twice, not Meta-M)
+`\\[bmkp-bmenu-mark-orphaned-local-file-bookmarks]'\t- Mark orphaned local file/dir bookmarks  (`C-u': \
 remote also)
-\\[bmkp-bmenu-mark-region-bookmarks]\t- Mark region bookmarks
-\\[bmkp-bmenu-mark-function-bookmarks]\t- Mark function bookmarks
-\\[bmkp-bmenu-mark-url-bookmarks]\t- Mark URL bookmarks
-\\[bmkp-bmenu-mark-variable-list-bookmarks]\t- Mark variable-list bookmarks
-\\[bmkp-bmenu-mark-w3m-bookmarks]\t- Mark W3M (URL) bookmarks
-\\[bmkp-bmenu-mark-snippet-bookmarks]\t- Mark snippet bookmarks
-\\[bmkp-bmenu-mark-bookmark-file-bookmarks]\t- Mark bookmark-file bookmarks
-\\[bmkp-bmenu-mark-bookmark-list-bookmarks]\t- Mark bookmark-list bookmarks
-
+`\\[bmkp-bmenu-mark-region-bookmarks]'\t- Mark region bookmarks
+`\\[bmkp-bmenu-mark-function-bookmarks]'\t- Mark function bookmarks
+`\\[bmkp-bmenu-mark-url-bookmarks]'\t- Mark URL bookmarks
+`\\[bmkp-bmenu-mark-variable-list-bookmarks]'\t- Mark variable-list bookmarks
+`\\[bmkp-bmenu-mark-w3m-bookmarks]'\t- Mark W3M (URL) bookmarks
+`\\[bmkp-bmenu-mark-snippet-bookmarks]'\t- Mark snippet bookmarks
+`\\[bmkp-bmenu-mark-bookmark-file-bookmarks]'\t- Mark bookmark-file bookmarks
+`\\[bmkp-bmenu-mark-bookmark-list-bookmarks]'\t- Mark bookmark-list bookmarks
+`
 
 Modify, Delete Bookmarks
 ------------------------
 
 \(See also `Tags', next.)
 
-\\[bmkp-bmenu-edit-bookmark-name-and-location]\t- Rename or relocate bookmark
-\\[bookmark-bmenu-relocate]\t- Relocate bookmark
-\\[bmkp-bmenu-relocate-marked]\t- Relocate marked bookmarks
-\\[bmkp-bmenu-edit-tags]\t- Edit bookmark's tags
-\\[bookmark-bmenu-edit-annotation]\t- Edit bookmark's annotation
-\\[bmkp-bmenu-edit-annotations-for-marked]\t- Edit annotations of marked bookmarks (`C-u': all)
-\\[bmkp-bmenu-edit-bookmark-record]\t- Edit internal Lisp record for bookmark
-\\[bmkp-bmenu-edit-marked]\t- Edit internal Lisp records of marked bookmarks  (`C-u': all)
-\\[bmkp-bmenu-toggle-temporary]\t- Toggle temporary/savable status of bookmark
-\\[bmkp-bmenu-toggle-marked-temporary/savable]\t- Toggle temporary/savable status of marked bookmarks
-\\[bmkp-delete-all-temporary-bookmarks]\t- Delete all temp bookmarks
-\\[bookmark-bmenu-execute-deletions]\t- Delete (visible) bookmarks flagged `D'
-\\[bmkp-bmenu-delete-marked]\t- Delete (visible) bookmarks marked `>'
+`\\[bmkp-bmenu-edit-bookmark-name-and-location]'\t- Rename or relocate bookmark
+`\\[bookmark-bmenu-relocate]'\t- Relocate bookmark
+`\\[bmkp-bmenu-relocate-marked]'\t- Relocate marked bookmarks
+`\\[bmkp-bmenu-edit-tags]'\t- Edit bookmark's tags
+`\\[bookmark-bmenu-edit-annotation]'\t- Edit bookmark's annotation
+`\\[bmkp-bmenu-edit-annotations-for-marked]'\t- Edit annotations of marked bookmarks            (`C-u': all)
+`\\[bmkp-bmenu-edit-bookmark-record]'\t- Edit internal Lisp record for bookmark
+`\\[bmkp-bmenu-edit-marked]'\t- Edit internal Lisp records of marked bookmarks  (`C-u': all)
+`\\[bmkp-bmenu-toggle-temporary]'\t- Toggle temporary/savable status of bookmark
+`\\[bmkp-bmenu-toggle-marked-temporary/savable]'\t- Toggle temporary/savable status of marked bookmarks
+`\\[bmkp-delete-all-temporary-bookmarks]'
+\t- Delete all temporary bookmarks
+`\\[bookmark-bmenu-execute-deletions]'\t- Delete (visible) bookmarks flagged `D'
+`\\[bmkp-bmenu-delete-marked]'\t- Delete (visible) bookmarks marked `>'
 
 
 Bookmark Tags
@@ -1641,86 +1715,87 @@ Bookmark Tags
 
 Here:
 
-\\[bmkp-bmenu-copy-tags]\t- Copy tags from this bookmark (for subsequent pasting)
-\\[bmkp-bmenu-paste-add-tags]\t- Paste tags (copied from another) to this bookmark
-\\[bmkp-bmenu-paste-replace-tags]\t- Replace tags for this bookmark (with those copied)
-\\[bmkp-add-tags]\t- Add some tags to a bookmark
-\\[bmkp-remove-tags]\t- Remove some tags from a bookmark (`C-u': from all bookmarks)
-\\[bmkp-remove-all-tags]\t- Remove all tags from a bookmark
-\\[bmkp-remove-tags-from-all]\t- Remove some tags from all bookmarks
-\\[bmkp-rename-tag]\t- Rename a tag in all bookmarks
-\\[bmkp-list-all-tags]\t- List all tags used in any bookmarks (`C-u': show tag values)
-\\[bmkp-bmenu-list-tags-of-marked]\t- List tags used in marked bookmarks  (`C-u': show tag values)
-\\[bmkp-bmenu-edit-tags]\t- Edit bookmark's tags
-\\[bmkp-bmenu-set-tag-value]\t- Set the value of a tag (as attribute)
-
-\\[bmkp-bmenu-set-tag-value-for-marked]\t- Set value of a tag, for each marked bookmark    (`C-u': all)
-\\[bmkp-bmenu-paste-add-tags-to-marked]\t- Add tags copied from a bookmark to those marked (`C-u': all)
-\\[bmkp-bmenu-paste-replace-tags-for-marked]\t- Replace tags of marked with copied tags \
+`\\[bmkp-bmenu-copy-tags]'\t- Copy tags from this bookmark (for subsequent pasting)
+`\\[bmkp-bmenu-paste-add-tags]'\t- Paste tags (copied from another) to this bookmark
+`\\[bmkp-bmenu-paste-replace-tags]'\t- Replace tags for this bookmark (with those copied)
+`\\[bmkp-add-tags]'\t- Add some tags to a bookmark
+`\\[bmkp-remove-tags]'\t- Remove some tags from a bookmark (`C-u': from all bookmarks)
+`\\[bmkp-remove-all-tags]'\t- Remove all tags from a bookmark
+`\\[bmkp-remove-tags-from-all]'\t- Remove some tags from all bookmarks
+`\\[bmkp-rename-tag]'\t- Rename a tag in all bookmarks
+`\\[bmkp-list-all-tags]'\t- List all tags used in any bookmarks (`C-u': show tag values)
+`\\[bmkp-bmenu-list-tags-of-marked]'\t- List tags used in marked bookmarks  (`C-u': show tag values)
+`\\[bmkp-bmenu-edit-tags]'\t- Edit bookmark's tags
+`\\[bmkp-bmenu-set-tag-value]'\t- Set the value of a tag (as attribute)
+
+`\\[bmkp-bmenu-set-tag-value-for-marked]'\t- Set value of a tag, for each marked bookmark    (`C-u': all)
+`\\[bmkp-bmenu-paste-add-tags-to-marked]'
+\t- Add tags copied from a bookmark to those marked (`C-u': all)
+`\\[bmkp-bmenu-paste-replace-tags-for-marked]'\t- Replace tags of marked with copied tags \
         (`C-u': all)
-\\[bmkp-bmenu-add-tags-to-marked]\t- Add some tags to the marked bookmarks           (`C-u': all)
-\\[bmkp-bmenu-remove-tags-from-marked]\t- Remove some tags from the marked bookmarks      (`C-u': all)
+`\\[bmkp-bmenu-add-tags-to-marked]'\t- Add some tags to the marked bookmarks           (`C-u': all)
+`\\[bmkp-bmenu-remove-tags-from-marked]'\t- Remove some tags from the marked bookmarks      (`C-u': all)
 
-\\[bmkp-bmenu-mark-bookmarks-tagged-regexp]\t- Mark bookmarks having at least one \
+`\\[bmkp-bmenu-mark-bookmarks-tagged-regexp]'\t- Mark bookmarks having at least one \
 tag that matches a regexp
-\\[bmkp-bmenu-mark-bookmarks-tagged-some]\t- Mark bookmarks having at least one tag \
+`\\[bmkp-bmenu-mark-bookmarks-tagged-some]'\t- Mark bookmarks having at least one tag \
 in a set    (OR)
-\\[bmkp-bmenu-mark-bookmarks-tagged-all]\t- Mark bookmarks having all of the tags \
+`\\[bmkp-bmenu-mark-bookmarks-tagged-all]'\t- Mark bookmarks having all of the tags \
 in a set     (AND)
-\\[bmkp-bmenu-mark-bookmarks-tagged-none]\t- Mark bookmarks not having any of the tags \
-in a set (NOT OR)
-\\[bmkp-bmenu-mark-bookmarks-tagged-not-all]\t- Mark bookmarks not having all of the \
-tags in a set (NOT AND)
+`\\[bmkp-bmenu-mark-bookmarks-tagged-none]'
+\t- Mark bookmarks not having any of the tags in a set (NOT OR)
+`\\[bmkp-bmenu-mark-bookmarks-tagged-not-all]'
+\t- Mark bookmarks not having all of the tags in a set (NOT AND)
 
-\\[bmkp-bmenu-unmark-bookmarks-tagged-regexp]\t- Unmark bookmarks having a \
+`\\[bmkp-bmenu-unmark-bookmarks-tagged-regexp]'\t- Unmark bookmarks having a \
 tag that matches a regexp
-\\[bmkp-bmenu-unmark-bookmarks-tagged-some]\t- Unmark bookmarks having at least one \
+`\\[bmkp-bmenu-unmark-bookmarks-tagged-some]'\t- Unmark bookmarks having at least one \
 tag in a set  (OR)
-\\[bmkp-bmenu-unmark-bookmarks-tagged-all]\t- Unmark bookmarks having all of the tags \
+`\\[bmkp-bmenu-unmark-bookmarks-tagged-all]'\t- Unmark bookmarks having all of the tags \
 in a set   (AND)
-\\[bmkp-bmenu-unmark-bookmarks-tagged-none]\t- Unmark bookmarks not having any tags \
-in a set      (NOT OR)
-\\[bmkp-bmenu-unmark-bookmarks-tagged-not-all]\t- Unmark bookmarks not having all tags \
-in a set      (NOT AND)
+`\\[bmkp-bmenu-unmark-bookmarks-tagged-none]'
+\t- Unmark bookmarks not having any tags in a set      (NOT OR)
+`\\[bmkp-bmenu-unmark-bookmarks-tagged-not-all]'
+\t- Unmark bookmarks not having all tags in a set      (NOT AND)
 
 Anywhere:
 
 \\<global-map>\
-\\[bmkp-list-all-tags]\t- List all tags
-\\[bmkp-edit-tags]\t- Edit the tags of a bookmark
-\\[bmkp-rename-tag]\t- Rename a tag (everywhere)
-\\[bmkp-copy-tags]\t- Copy tags from a bookmark (for subsequent pasting)
-\\[bmkp-paste-add-tags]\t- Add (paste) tags copied from a bookmark
-\\[bmkp-paste-replace-tags]\t- Replace (paste) a bookmark's tags with copied tags
-\\[bmkp-add-tags]\t- Add some tags to a bookmark
-\\[bmkp-remove-tags]\t- Remove some tags from a bookmark
-\\[bmkp-remove-all-tags]\t- Remove ALL tags from a bookmark
-\\[bmkp-remove-tags-from-all]\t- Remove some tags from ALL bookmarks
-\\[bmkp-tag-a-file]\t- Add tags to a file (create/update autofile bookmark)
-\\[bmkp-untag-a-file]\t- Remove tags from a file (an autofile bookmark)
-\\[bmkp-set-tag-value]\t- Set a tag value for a bookmark
-\\[bmkp-set-tag-value-for-navlist]\t- Set a tag value for each bookmark in navlist
+`\\[bmkp-list-all-tags]'\t- List all tags
+`\\[bmkp-edit-tags]'\t- Edit the tags of a bookmark
+`\\[bmkp-rename-tag]'\t- Rename a tag (everywhere)
+`\\[bmkp-copy-tags]'\t- Copy tags from a bookmark (for subsequent pasting)
+`\\[bmkp-paste-add-tags]'\t- Add (paste) tags copied from a bookmark
+`\\[bmkp-paste-replace-tags]'\t- Replace (paste) a bookmark's tags with copied tags
+`\\[bmkp-add-tags]'\t- Add some tags to a bookmark
+`\\[bmkp-remove-tags]'\t- Remove some tags from a bookmark
+`\\[bmkp-remove-all-tags]'\t- Remove ALL tags from a bookmark
+`\\[bmkp-remove-tags-from-all]'\t- Remove some tags from ALL bookmarks
+`\\[bmkp-tag-a-file]'\t- Add tags to a file (create/update autofile bookmark)
+`\\[bmkp-untag-a-file]'\t- Remove tags from a file (an autofile bookmark)
+`\\[bmkp-set-tag-value]'\t- Set a tag value for a bookmark
+`\\[bmkp-set-tag-value-for-navlist]'\t- Set a tag value for each bookmark in navlist
 \\<bookmark-bmenu-mode-map>
 
 
 Bookmark Highlighting
 ---------------------
 
-\\[bmkp-bmenu-show-only-lighted-bookmarks]\t- Show only the highlighted bookmarks
-\\[bmkp-bmenu-set-lighting]\t- Set highlighting for bookmark
-\\[bmkp-bmenu-set-lighting-for-marked]\t- Set highlighting for marked bookmarks
-\\[bmkp-bmenu-light]\t- Highlight bookmark
-\\[bmkp-bmenu-unlight]\t- Unhighlight bookmark
-\\[bmkp-bmenu-mark-lighted-bookmarks]\t- Mark the highlighted bookmarks
-\\[bmkp-bmenu-light-marked]\t- Highlight the marked bookmarks
-\\[bmkp-bmenu-unlight-marked]\t- Unhighlight the marked bookmarks
-\\[bmkp-light-bookmark-this-buffer]\t- Highlight a bookmark in current buffer
-\\[bmkp-unlight-bookmark-this-buffer]\t- Unhighlight a bookmark in current buffer
-\\[bmkp-light-bookmarks]\t- Highlight bookmarks (see prefix arg)
-\\[bmkp-unlight-bookmarks]\t- Unhighlight bookmarks (see prefix arg)
-\\[bmkp-bookmarks-lighted-at-point]\t- List bookmarks highlighted at point
-\\[bmkp-unlight-bookmark-here]\t- Unhighlight a bookmark at point or on same line
-\\[bmkp-lighted-jump-other-window]\t- Jump to a highlighted bookmark (other window)
+`\\[bmkp-bmenu-show-only-lighted-bookmarks]'\t- Show only the highlighted bookmarks
+`\\[bmkp-bmenu-set-lighting]'\t- Set highlighting for bookmark
+`\\[bmkp-bmenu-set-lighting-for-marked]'\t- Set highlighting for marked bookmarks
+`\\[bmkp-bmenu-light]'\t- Highlight bookmark
+`\\[bmkp-bmenu-unlight]'\t- Unhighlight bookmark
+`\\[bmkp-bmenu-mark-lighted-bookmarks]'\t- Mark the highlighted bookmarks
+`\\[bmkp-bmenu-light-marked]'\t- Highlight the marked bookmarks
+`\\[bmkp-bmenu-unlight-marked]'\t- Unhighlight the marked bookmarks
+`\\[bmkp-light-bookmark-this-buffer]'\t- Highlight a bookmark in current buffer
+`\\[bmkp-unlight-bookmark-this-buffer]'\t- Unhighlight a bookmark in current buffer
+`\\[bmkp-light-bookmarks]'\t- Highlight bookmarks (see prefix arg)
+`\\[bmkp-unlight-bookmarks]'\t- Unhighlight bookmarks (see prefix arg)
+`\\[bmkp-bookmarks-lighted-at-point]'\t- List bookmarks highlighted at point
+`\\[bmkp-unlight-bookmark-here]'\t- Unhighlight a bookmark at point or on same line
+`\\[bmkp-lighted-jump-other-window]'\t- Jump to a highlighted bookmark (other window)
 
 
 Sort `*Bookmark List*' (`s C-h' to see this)
@@ -1728,136 +1803,137 @@ Sort `*Bookmark List*' (`s C-h' to see this)
 
 \(Repeat to cycle normal/reversed/off, except as noted.)
 
-\\[bmkp-reverse-sort-order]\t- Reverse current sort direction       (repeat to toggle)
-\\[bmkp-reverse-multi-sort-order]\t- Complement sort predicate decisions  (repeat \
+`\\[bmkp-reverse-sort-order]'\t- Reverse current sort direction       (repeat to toggle)
+`\\[bmkp-reverse-multi-sort-order]'\t- Complement sort predicate decisions  (repeat \
 to toggle)
-\\[bmkp-bmenu-change-sort-order-repeat]\t- Cycle sort orders                    (repeat \
+`\\[bmkp-bmenu-change-sort-order-repeat]'\t- Cycle sort orders                    (repeat \
 to cycle)
 
-\\[bmkp-bmenu-sort-marked-before-unmarked]\t- Sort marked (`>') bookmarks first
-\\[bmkp-bmenu-sort-flagged-before-unflagged]\t- Sort flagged (`D') bookmarks first
-\\[bmkp-bmenu-sort-modified-before-unmodified]\t- Sort modified (`*') bookmarks first
-\\[bmkp-bmenu-sort-tagged-before-untagged]\t- Sort tagged (`t') bookmarks first
-\\[bmkp-bmenu-sort-annotated-before-unannotated]\t- Sort annotated (`a') bookmarks first
+`\\[bmkp-bmenu-sort-marked-before-unmarked]'\t- Sort marked (`>') bookmarks first
+`\\[bmkp-bmenu-sort-flagged-before-unflagged]'\t- Sort flagged (`D') bookmarks first
+`\\[bmkp-bmenu-sort-modified-before-unmodified]'\t- Sort modified (`*') bookmarks first
+`\\[bmkp-bmenu-sort-tagged-before-untagged]'\t- Sort tagged (`t') bookmarks first
+`\\[bmkp-bmenu-sort-annotated-before-unannotated]'\t- Sort annotated (`a') bookmarks first
 
-\\[bmkp-bmenu-sort-by-creation-time]\t- Sort by bookmark creation time
-\\[bmkp-bmenu-sort-by-last-buffer-or-file-access]\t- Sort by last buffer or file \
+`\\[bmkp-bmenu-sort-by-creation-time]'\t- Sort by bookmark creation time
+`\\[bmkp-bmenu-sort-by-last-buffer-or-file-access]'\t- Sort by last buffer or file \
 access
-\\[bmkp-bmenu-sort-by-last-bookmark-access]\t- Sort by last bookmark access time
-\\[bmkp-bmenu-sort-by-Gnus-thread]\t- Sort by Gnus thread: group, article, message
-\\[bmkp-bmenu-sort-by-Info-node-name]\t- Sort by Info manual, node, position in node
-\\[bmkp-bmenu-sort-by-Info-position]\t- Sort by Info manual, position in manual
-\\[bmkp-bmenu-sort-by-bookmark-type]\t- Sort by bookmark type
-\\[bmkp-bmenu-sort-by-bookmark-name]\t- Sort by bookmark name
-\\[bmkp-bmenu-sort-by-url]\t- Sort by URL
-\\[bmkp-bmenu-sort-by-bookmark-visit-frequency]\t- Sort by bookmark visit frequency
-
-\\[bmkp-bmenu-sort-by-last-local-file-access]\t- Sort by last local file access
-\\[bmkp-bmenu-sort-by-local-file-type]\t- Sort by local file type: file, symlink, dir
-\\[bmkp-bmenu-sort-by-file-name]\t- Sort by file name
-\\[bmkp-bmenu-sort-by-local-file-size]\t- Sort by local file size
-\\[bmkp-bmenu-sort-by-last-local-file-update]\t- Sort by last local file update (edit)
+`\\[bmkp-bmenu-sort-by-last-bookmark-access]'\t- Sort by last bookmark access time
+`\\[bmkp-bmenu-sort-by-Gnus-thread]'\t- Sort by Gnus thread: group, article, message
+`\\[bmkp-bmenu-sort-by-Info-node-name]'\t- Sort by Info manual, node, position in node
+`\\[bmkp-bmenu-sort-by-Info-position]'\t- Sort by Info manual, position in manual
+`\\[bmkp-bmenu-sort-by-bookmark-type]'\t- Sort by bookmark type
+`\\[bmkp-bmenu-sort-by-bookmark-name]'\t- Sort by bookmark name
+`\\[bmkp-bmenu-sort-by-url]'\t- Sort by URL
+`\\[bmkp-bmenu-sort-by-bookmark-visit-frequency]'\t- Sort by bookmark visit frequency
+
+`\\[bmkp-bmenu-sort-by-last-local-file-access]'\t- Sort by last local file access
+`\\[bmkp-bmenu-sort-by-local-file-type]'\t- Sort by local file type: file, symlink, dir
+`\\[bmkp-bmenu-sort-by-file-name]'\t- Sort by file name
+`\\[bmkp-bmenu-sort-by-local-file-size]'\t- Sort by local file size
+`\\[bmkp-bmenu-sort-by-last-local-file-update]'\t- Sort by last local file update (edit)
 
 
 Hide/Show (Filtering `*Bookmark List*')
 ---------------------------------------
 
-\\[bmkp-bmenu-show-all]\t- Show all bookmarks
-\\[bmkp-bmenu-toggle-show-only-marked]\t- Toggle showing only marked bookmarks
-\\[bmkp-bmenu-toggle-show-only-unmarked]\t- Toggle showing only unmarked bookmarks
-
-\\[bmkp-bmenu-show-only-autonamed-bookmarks]\t- Show only autonamed bookmarks
-\\[bmkp-bmenu-show-only-autofile-bookmarks]\t- Show only autofile bookmarks
-\\[bmkp-bmenu-show-only-temporary-bookmarks]\t- Show only temporary bookmarks
-
-\\[bmkp-bmenu-show-only-non-file-bookmarks]\t- Show only non-file (i.e. buffer) bookmarks
-\\[bmkp-bmenu-show-only-dired-bookmarks]\t- Show only Dired bookmarks
-\\[bmkp-bmenu-show-only-file-bookmarks]\t- Show only file & directory bookmarks     (`C-u': local only)
-\\[bmkp-bmenu-show-only-gnus-bookmarks]\t- Show only Gnus bookmarks
-\\[bmkp-bmenu-show-only-info-bookmarks]\t- Show only Info bookmarks
-\\[bmkp-bmenu-show-only-icicles-search-hits-bookmarks]\t- Show only Icicles search-hits bookmarks
-\\[bmkp-bmenu-show-only-non-invokable-bookmarks]\t- Show only non-invokable bookmarks
-\\[bmkp-bmenu-show-only-image-bookmarks]\t- Show only image-file bookmarks
-\\[bmkp-bmenu-show-only-orphaned-local-file-bookmarks]\t- Show only orphaned local file \
+`\\[bmkp-bmenu-show-all]'\t- Show all bookmarks
+`\\[bmkp-bmenu-toggle-show-only-marked]'\t- Toggle showing only marked bookmarks
+`\\[bmkp-bmenu-toggle-show-only-unmarked]'\t- Toggle showing only unmarked bookmarks
+
+`\\[bmkp-bmenu-show-only-autonamed-bookmarks]'\t- Show only autonamed bookmarks
+`\\[bmkp-bmenu-show-only-autofile-bookmarks]'\t- Show only autofile bookmarks
+`\\[bmkp-bmenu-show-only-temporary-bookmarks]'\t- Show only temporary bookmarks
+
+`\\[bmkp-bmenu-show-only-non-file-bookmarks]'\t- Show only non-file (i.e. buffer) bookmarks
+`\\[bmkp-bmenu-show-only-dired-bookmarks]'\t- Show only Dired bookmarks
+`\\[bmkp-bmenu-show-only-file-bookmarks]'\t- Show only file & directory bookmarks     (`C-u': local only)
+`\\[bmkp-bmenu-show-only-gnus-bookmarks]'\t- Show only Gnus bookmarks
+`\\[bmkp-bmenu-show-only-info-bookmarks]'\t- Show only Info bookmarks
+`\\[bmkp-bmenu-show-only-icicles-search-hits-bookmarks]'\t- Show only Icicles search-hits bookmarks
+`\\[bmkp-bmenu-show-only-non-invokable-bookmarks]'\t- Show only non-invokable bookmarks
+`\\[bmkp-bmenu-show-only-image-bookmarks]'\t- Show only image-file bookmarks
+`\\[bmkp-bmenu-show-only-orphaned-local-file-bookmarks]'\t- Show only orphaned local file \
 bookmarks (`C-u': remote also)
-\\[bmkp-bmenu-show-only-desktop-bookmarks]\t- Show only desktop bookmarks
-\\[bmkp-bmenu-show-only-man-bookmarks]\t- Show only `man' page bookmarks
-\\[bmkp-bmenu-show-only-region-bookmarks]\t- Show only region bookmarks
-\\[bmkp-bmenu-show-only-function-bookmarks]\t- Show only function bookmarks
-\\[bmkp-bmenu-show-only-url-bookmarks]\t- Show only URL bookmarks
-\\[bmkp-bmenu-show-only-eww-bookmarks]\t- Show only EWW bookmarks
-\\[bmkp-bmenu-show-only-w3m-bookmarks]\t- Show only W3M bookmarks
-\\[bmkp-bmenu-show-only-variable-list-bookmarks]\t- Show only variable-list bookmarks
-\\[bmkp-bmenu-show-only-tagged-bookmarks]\t- Show only tagged bookmarks
-\\[bmkp-bmenu-show-only-untagged-bookmarks]\t- Show only untagged bookmarks
-\\[bmkp-bmenu-show-only-snippet-bookmarks]\t- Show only snippet bookmarks
-\\[bmkp-bmenu-show-only-bookmark-file-bookmarks]\t- Show only bookmark-file bookmarks
-\\[bmkp-bmenu-show-only-bookmark-list-bookmarks]\t- Show only bookmark-list bookmarks
-
-\\[bmkp-bmenu-filter-annotation-incrementally]\t- Incrementally show bookmarks whose \
+`\\[bmkp-bmenu-show-only-desktop-bookmarks]'\t- Show only desktop bookmarks
+`\\[bmkp-bmenu-show-only-man-bookmarks]'\t- Show only `man' page bookmarks
+`\\[bmkp-bmenu-show-only-region-bookmarks]'\t- Show only region bookmarks
+`\\[bmkp-bmenu-show-only-function-bookmarks]'\t- Show only function bookmarks
+`\\[bmkp-bmenu-show-only-url-bookmarks]'\t- Show only URL bookmarks
+`\\[bmkp-bmenu-show-only-eww-bookmarks]'\t- Show only EWW bookmarks
+`\\[bmkp-bmenu-show-only-w3m-bookmarks]'\t- Show only W3M bookmarks
+`\\[bmkp-bmenu-show-only-variable-list-bookmarks]'\t- Show only variable-list bookmarks
+`\\[bmkp-bmenu-show-only-tagged-bookmarks]'\t- Show only tagged bookmarks
+`\\[bmkp-bmenu-show-only-untagged-bookmarks]'\t- Show only untagged bookmarks
+`\\[bmkp-bmenu-show-only-snippet-bookmarks]'\t- Show only snippet bookmarks
+`\\[bmkp-bmenu-show-only-bookmark-file-bookmarks]'\t- Show only bookmark-file bookmarks
+`\\[bmkp-bmenu-show-only-bookmark-list-bookmarks]'\t- Show only bookmark-list bookmarks
+
+`\\[bmkp-bmenu-filter-annotation-incrementally]'\t- Incrementally show bookmarks whose \
 annotations match regexp
-\\[bmkp-bmenu-filter-bookmark-name-incrementally]\t- Incrementally show only bookmarks \
+`\\[bmkp-bmenu-filter-bookmark-name-incrementally]'\t- Incrementally show only bookmarks \
 whose names match a regexp
-\\[bmkp-bmenu-filter-file-name-incrementally]\t- Incrementally show only bookmarks whose \
+`\\[bmkp-bmenu-filter-file-name-incrementally]'\t- Incrementally show only bookmarks whose \
 files match a regexp
-\\[bmkp-bmenu-filter-tags-incrementally]\t- Incrementally show only bookmarks whose tags \
+`\\[bmkp-bmenu-filter-tags-incrementally]'\t- Incrementally show only bookmarks whose tags \
 match a regexp
 
 
 Omit/Un-omit (`*Bookmark List*')
 --------------------------------
 
-\\[bmkp-bmenu-show-only-omitted-bookmarks]\t- Show (only) the omitted bookmarks
-\\[bmkp-bmenu-show-all]\t- Show the un-omitted bookmarks (all)
-\\[bmkp-bmenu-omit/unomit-marked]\t- Omit the marked bookmarks; un-omit them if after \
+`\\[bmkp-bmenu-show-only-omitted-bookmarks]'\t- Show (only) the omitted bookmarks
+`\\[bmkp-bmenu-show-all]'\t- Show the un-omitted bookmarks (all)
+`\\[bmkp-bmenu-omit/unomit-marked]'\t- Omit the marked bookmarks; un-omit them if after \
 `\\[bmkp-bmenu-show-only-omitted-bookmarks]'
-\\[bmkp-unomit-all]\t- Un-omit all omitted bookmarks
+`\\[bmkp-unomit-all]'\t- Un-omit all omitted bookmarks
 
 
 Define Commands for `*Bookmark List*'
 -------------------------------------
 
-\\[bmkp-bmenu-define-command]\t- Define a command to restore the current sort order & filter
-\\[bmkp-bmenu-define-full-snapshot-command]\t- Define a command to restore current bookmark list
-\\[bmkp-define-tags-sort-command]\t- Define a command to sort bookmarks by tags
-\\[bmkp-bmenu-define-jump-marked-command]\t- Define a command to jump to a bookmark that is \
-now marked
+`\\[bmkp-bmenu-define-command]'
+\t- Define a command to restore the current sort order & filter
+`\\[bmkp-bmenu-define-full-snapshot-command]'\t- Define a command to restore current bookmark list
+`\\[bmkp-define-tags-sort-command]'\t- Define a command to sort bookmarks by tags
+`\\[bmkp-bmenu-define-jump-marked-command]'
+\t- Define a command to jump to a bookmark that is now marked
 
 
 Options for `*Bookmark List*'
 -----------------------------
 
-bookmark-bmenu-file-column       - Bookmark width if files are shown
-bookmark-bmenu-toggle-filenames  - Show filenames initially?
+`bookmark-bmenu-file-column'       - Bookmark width if files are shown
+`bookmark-bmenu-toggle-filenames'  - Show filenames initially?
 
-bmkp-bmenu-omitted-bookmarks     - List of omitted bookmarks
-bmkp-bmenu-state-file            - File to save bookmark-list state
+`bmkp-bmenu-omitted-bookmarks'     - List of omitted bookmarks
+`bmkp-bmenu-state-file'            - File to save bookmark-list state
                                    (\"home\") nil: do not save/restore
-bmkp-sort-comparer               - Initial sort
-bmkp-sort-orders-for-cycling-alist - Sort orders that `\\[bmkp-bmenu-change-sort-order-repeat]'... cycles
+`bmkp-sort-comparer'               - Initial sort
+`bmkp-sort-orders-for-cycling-alist' - Sort orders that `\\[bmkp-bmenu-change-sort-order-repeat]'... cycles
 
 
 Other Options
 -------------
 
-bookmark-automatically-show-annotations  - Show annotation when visit?
-bookmark-completion-ignore-case  - Case-sensitive completion?
-bookmark-default-file            - File to save bookmarks in
-bookmark-menu-length             - Max size of bookmark-name menu item
-bookmark-save-flag               - Whether and when to save
-bookmark-use-annotations         - Edit annotation when set bookmark?
-bookmark-version-control         - Numbered backups of bookmark file?
-
-bmkp-autoname-format        - Format of autonamed bookmark name
-bmkp-last-as-first-bookmark-file - Whether to start with last b. file
-bmkp-crosshairs-flag        - Highlight position when visit?
-bmkp-menu-popup-max-length  - Use menus to choose bookmarks?
-bmkp-save-new-location-flag - Save if bookmark relocated?
-bmkp-sequence-jump-display-function - How to display a sequence
-bmkp-sort-comparer          - Predicates for sorting bookmarks
-bmkp-su-or-sudo-regexp      - Bounce-show each end of region?
-bmkp-this-file/buffer-cycle-sort-comparer -  cycling sort for here
-bmkp-use-region             - Activate saved region when visit?"
+`bookmark-automatically-show-annotations'  - Show annotation when visit?
+`bookmark-completion-ignore-case'  - Case-sensitive completion?
+`bookmark-default-file'            - File to save bookmarks in
+`bookmark-menu-length'             - Max size of bookmark-name menu item
+`bookmark-save-flag'               - Whether and when to save
+`bookmark-use-annotations'         - Edit annotation when set bookmark?
+`bookmark-version-control'         - Numbered backups of bookmark file?
+
+`bmkp-autoname-format'        - Format of autonamed bookmark name
+`bmkp-last-as-first-bookmark-file' - Whether to start with last b. file
+`bmkp-crosshairs-flag'        - Highlight position when visit?
+`bmkp-menu-popup-max-length'  - Use menus to choose bookmarks?
+`bmkp-save-new-location-flag' - Save if bookmark relocated?
+`bmkp-sequence-jump-display-function' - How to display a sequence
+`bmkp-sort-comparer'          - Predicates for sorting bookmarks
+`bmkp-su-or-sudo-regexp'      - Bounce-show each end of region?
+`bmkp-this-file/buffer-cycle-sort-comparer' -  cycling sort for here
+`bmkp-use-region'             - Activate saved region when visit?"
   (kill-all-local-variables)
   (use-local-map bookmark-bmenu-mode-map)
   (setq truncate-lines    t
@@ -2129,21 +2205,22 @@ Non-interactively, non-nil MSG-P means display messages."
 
 ;; REPLACES ORIGINAL in `bookmark.el'.
 ;;
-;;  1. Added optional arg MARKEDP: handle bookmarks marked `>', not just those flagged `D'.
-;;  2. Added optional arg NO-CONFIRM-P.
-;;  3. Delete bookmark on current line (after confirmation) if none are flagged/marked.
-;;  4. Inhibit saving until all are deleted, then save all.  This is because the Bookmark+ version of
+;;  1. Don't use progress-reporter.
+;;  2. Added optional arg MARKEDP: handle bookmarks marked `>', not just those flagged `D'.
+;;  3. Added optional arg NO-CONFIRM-P.
+;;  4. Delete bookmark on current line (after confirmation) if none are flagged/marked.
+;;  5. Inhibit saving until all are deleted, then save all.  This is because the Bookmark+ version of
 ;;     `bookmark-save' refreshes the bookmark list display, and that removes `D' flags.
-;;  5. Use `bmkp-get-bookmark' instead of `bookmark-get-bookmark', so we can get the right bookmarks when
+;;  6. Use `bmkp-get-bookmark' instead of `bookmark-get-bookmark', so we can get the right bookmarks when
 ;;     they have names with property `bmkp-full-record'.  But don't require that they have names, so
 ;;     calls from vanilla or other code won't be bothered.
-;;  6. Use `bookmark-bmenu-surreptitiously-rebuild-list', instead of using
+;;  7. Use `bookmark-bmenu-surreptitiously-rebuild-list', instead of using
 ;;     `bookmark-bmenu-list', updating the modification count, and saving.
-;;  7. Update `bmkp-latest-bookmark-alist' to reflect the deletions.
-;;  8. Pass full bookmark, not name, to `delete' (and do not use `assoc').
-;;  9. Use `bmkp-bmenu-goto-bookmark-named'.
-;; 10. Added status messages.
-;; 11. Raise error if not in buffer `*Bookmark List*'.
+;;  8. Update `bmkp-latest-bookmark-alist' to reflect the deletions.
+;;  9. Pass full bookmark, not name, to `delete' (and do not use `assoc').
+;; 10. Use `bmkp-bmenu-goto-bookmark-named'.
+;; 11. Added status messages.
+;; 12. Raise error if not in buffer `*Bookmark List*'.
 ;;
 ;;;###autoload (autoload 'bookmark-bmenu-execute-deletions "bookmark+")
 (defun bookmark-bmenu-execute-deletions (&optional markedp no-confirm-p) ; Bound to `x' in bookmark list
@@ -2156,7 +2233,7 @@ arg was used), then delete the bookmark on this line, but only after
 confirmation.
 
 Non-interactively, optional arg NO-CONFIRM-P non-nil means do not ask
-for confirmation."
+for confirmation when deleting marked (not flagged) bookmarks."
   (interactive "P")
   (bmkp-bmenu-barf-if-not-in-menu-list)
   (if (and (null (if markedp bmkp-bmenu-marked-bookmarks bmkp-flagged-bookmarks))
@@ -2288,7 +2365,7 @@ for confirmation."
                                bmkp-info-alist-only)                                          ; `I S'
 (bmkp-define-show-only-command desktop  "Display (only) the desktop bookmarks."
                                bmkp-desktop-alist-only)                                       ; `K S'
-(bmkp-define-show-only-command man-page "Display (only) the `man' page bookmarks."
+(bmkp-define-show-only-command man "Display (only) the `man' page bookmarks."
                                bmkp-man-alist-only)                                           ; `M S'
 (bmkp-define-show-only-command function "Display (only) the function bookmarks."
                                bmkp-function-alist-only)                                      ; `Q S'
@@ -2720,7 +2797,6 @@ Non-interactively:
          (some-marked-p      bmkp-bmenu-marked-bookmarks)
          (inhibit-read-only  t)
          (case-fold-search   nil)
-         (query              nil)
          (string             (format "\n%c" mark))
          (help-form          "Type SPC or `y' to unmark one bookmark, DEL or `n' to skip to next,
 `!' to unmark all remaining bookmarks with no more questions."))
@@ -2736,7 +2812,7 @@ Non-interactively:
                       (search-forward string nil t))))
         (when (or (prog1 (not arg) (when msg-p (message "Updating bookmark-list display...")))
                   (let ((bmk  (bookmark-bmenu-bookmark)))
-                    (and bmk  (dired-query 'query "Unmark bookmark `%s'? " bmk))))
+                    (and bmk  (dired-query 'bmkp-bmenu-unmark-all-query "Unmark bookmark `%s'? " bmk))))
           (bookmark-bmenu-unmark nil 'NO-RE-SORT-P) (forward-line -1)
           (setq count  (1+ count)))))
     (unless no-re-sort-p
@@ -2992,7 +3068,7 @@ Non-interactively:
     (when msg-p (if (= 1 count) (message "1 bookmark matched") (message "%d bookmarks matched" count)))))
 
 ;;;###autoload (autoload 'bmkp-bmenu-toggle-marks "bookmark+")
-(defun bmkp-bmenu-toggle-marks (&optional backup no-re-sort-p msg-p) ; Bound to `t' in bookmark list
+(defun bmkp-bmenu-toggle-marks (&optional no-re-sort-p msg-p) ; Bound to `t' in bookmark list
   "Toggle marks: Unmark all marked bookmarks; mark all unmarked bookmarks.
 This affects only the `>' mark, not the `D' flag.
 
@@ -3103,18 +3179,21 @@ that are marked are included."
     (dired-other-window (cons dirbufname files))))
 
 ;;;###autoload (autoload 'bmkp-bmenu-delete-marked "bookmark+")
-(defun bmkp-bmenu-delete-marked (&optional no-confirm-p)      ; Bound to `D' in bookmark list
-  "Delete all (visible) bookmarks that are marked `>', after confirmation.
-Optional arg NO-CONFIRM-P non-nil means do not ask for confirmation."
-  (interactive)
+(defun bmkp-bmenu-delete-marked (&optional no-confirm-p) ; Bound to `D' in bookmark list
+  "Delete all (visible) bookmarks that are marked `>'.
+With a prefix arg (or non-nil arg NO-CONFIRM-P from Lisp), do not ask
+for confirmation."
+  (interactive "P")
   (bmkp-bmenu-barf-if-not-in-menu-list)
-  (bookmark-bmenu-execute-deletions 'MARKED 'NO-CONFIRM))
+  (bookmark-bmenu-execute-deletions 'MARKED no-confirm-p))
 
 ;;;###autoload (autoload 'bmkp-bmenu-move-marked-to-bookmark-file "bookmark+")
 (defun bmkp-bmenu-move-marked-to-bookmark-file (file &optional duplicates-ok include-omitted-p batchp)
                                         ; Bound to `Y > -' in bookmark list
   "Move the marked bookmarks to bookmark file FILE.
 You are prompted for FILE.
+If FILE doesn't exist then you're prompted to confirm creating it.
+
 The marked bookmarks are removed from the current bookmark list and
 appended to those in FILE.  If any of them has the same name as a
 bookmark already in FILE then it is renamed by appending a numeric
@@ -3594,10 +3673,10 @@ arg, any that are marked are included."
                      (and current-prefix-arg  (>= (prefix-numeric-value current-prefix-arg) 0))
                      (and current-prefix-arg  (<  (prefix-numeric-value current-prefix-arg) 0))))
   (bmkp-bmenu-barf-if-not-in-menu-list)
-  (tags-search regexp '(let ((files  ())
+  (tags-search regexp `(let ((files  ())
                              file)
                         (dolist (bmk  (bmkp-sort-omit
-                                       (bmkp-bmenu-marked-or-this-or-all allp include-omitted-p)))
+                                       (bmkp-bmenu-marked-or-this-or-all ',allp ',include-omitted-p)))
                           (setq file  (bookmark-get-filename bmk))
                           (when (and (not (equal bmkp-non-file-filename file))
                                      (not (file-directory-p file)))
@@ -3624,10 +3703,10 @@ prefix arg, any that are marked are included."
                        (and current-prefix-arg  (<= (prefix-numeric-value current-prefix-arg) 0)))))
   (bmkp-bmenu-barf-if-not-in-menu-list)
   (tags-query-replace from to delimited
-                     '(let ((files  ())
+                     `(let ((files  ())
                              file)
                         (dolist (bmk  (bmkp-sort-omit
-                                       (bmkp-bmenu-marked-or-this-or-all nil include-omitted-p)))
+                                       (bmkp-bmenu-marked-or-this-or-all nil ',include-omitted-p)))
                           (setq file  (bookmark-get-filename bmk))
                           (let ((buffer  (get-file-buffer file)))
                             (when (and buffer  (with-current-buffer buffer buffer-read-only))
@@ -4269,183 +4348,186 @@ Unlike `bookmark-bmenu-select', this command:
   (interactive) (let ((bmkp-use-w32-browser-p  t))  (bmkp-bmenu-jump-to-marked)))
 
 ;;;###autoload (autoload 'bmkp-bmenu-mode-status-help "bookmark+")
-(defun bmkp-bmenu-mode-status-help ()   ; Bound to `C-h m' and `?' in bookmark list
+(defun bmkp-bmenu-mode-status-help () ; Bound to `C-h m' and `?' in bookmark list
   "`describe-mode' + current status of `*Bookmark List*' + face legend."
   (interactive)
   (unless (string= (buffer-name) "*Help*") (bmkp-bmenu-barf-if-not-in-menu-list))
-  (with-current-buffer (get-buffer-create "*Help*")
-    (bmkp-with-help-window "*Help*"
-      (let ((buffer-read-only  nil)
-            top)
-        (erase-buffer)
-        (save-excursion
-          (let ((standard-output  (current-buffer)))
-            (if (> emacs-major-version 21)
-                (describe-function-1 'bookmark-bmenu-mode)
-              (describe-function-1 'bookmark-bmenu-mode nil t)))
-          (help-setup-xref (list #'bmkp-bmenu-mode-status-help) (interactive-p))
-          (goto-char (point-min))
-          (search-forward               ; This depends on the text written by `bookmark-bmenu-mode'.
-           "More bookmarking help below." nil t)
-          (delete-region (point-min) (point)) ; Get rid of intro from `describe-function'.
-          (insert "*************************** Bookmark List ***************************\n\n")
-          (insert "Major mode for editing a list of bookmarks.\n")
-          (insert "Each line in `*Bookmark List*' represents an Emacs bookmark.\n")
-          (setq top  (copy-marker (point)))
-          ;; Add buttons to access help and Customize.
-          ;; Not for Emacs 21.3 - its `help-insert-xref-button' signature is different.
-          (when (and (> emacs-major-version 21) ; In `help-mode.el'.
-                     (condition-case nil (require 'help-mode nil t) (error nil))
-                     (fboundp 'help-insert-xref-button))
-            (goto-char (point-min))
-            (help-insert-xref-button "[Doc in Commentary]" 'bmkp-commentary-button)
-            (insert "           ")
-            (help-insert-xref-button "[Doc on the Web]" 'bmkp-help-button)
-            (insert "           ")
-            (help-insert-xref-button "[Customize]" 'bmkp-customize-button)
-            (insert "\n\n")
-            (goto-char (point-max))
-            (insert (substitute-command-keys
-                     "\nSend a Bookmark+ bug report: `\\[bmkp-send-bug-report]'.\n\n"))
-            (help-insert-xref-button "[Doc in Commentary]" 'bmkp-commentary-button)
-            (insert "           ")
-            (help-insert-xref-button "[Doc on the Web]" 'bmkp-help-button)
-            (insert "           ")
-            (help-insert-xref-button "[Customize]" 'bmkp-customize-button)
-            (insert "\n\n")
-            (goto-char (point-min))
-            (forward-line 2))
-          (goto-char top)
-          (insert (format
-                   "\n\nCurrent Status\n--------------\n
+  (let ((describe-function-orig-buffer  (current-buffer)))
+    (with-current-buffer (get-buffer-create "*Help*")
+      (bmkp-with-help-window
+       "*Help*"
+       (let ((buffer-read-only  nil)
+             top)
+         (erase-buffer)
+         (save-excursion
+           (let ((standard-output  (current-buffer)))
+             (if (> emacs-major-version 21)
+                 (describe-function-1 'bookmark-bmenu-mode)
+               (describe-function-1 'bookmark-bmenu-mode nil t)))
+           (help-setup-xref (list #'bmkp-bmenu-mode-status-help) (interactive-p))
+           (goto-char (point-min))
+           (search-forward ; This depends on the text written by `bookmark-bmenu-mode'.
+            "More bookmarking help below." nil t)
+           (delete-region (point-min) (point)) ; Get rid of intro from `describe-function'.
+           (insert "*************************** Bookmark List ***************************\n\n")
+           (insert "Major mode for editing a list of bookmarks.\n")
+           (insert "Each line in `*Bookmark List*' represents an Emacs bookmark.\n")
+           (setq top  (copy-marker (point)))
+           ;; Add buttons to access help and Customize.
+           ;; Not for Emacs 21.3 - its `help-insert-xref-button' signature is different.
+           (when (and (> emacs-major-version 21) ; In `help-mode.el'.
+                      (condition-case nil (require 'help-mode nil t) (error nil))
+                      (fboundp 'help-insert-xref-button))
+             (goto-char (point-min))
+             (help-insert-xref-button "[Doc in Commentary]" 'bmkp-commentary-button)
+             (insert "           ")
+             (help-insert-xref-button "[Doc on the Web]" 'bmkp-help-button)
+             (insert "           ")
+             (help-insert-xref-button "[Customize]" 'bmkp-customize-button)
+             (insert "\n\n")
+             (goto-char (point-max))
+             (insert (substitute-command-keys
+                      "\nSend a Bookmark+ bug report: `\\[bmkp-send-bug-report]'.\n\n"))
+             (help-insert-xref-button "[Doc in Commentary]" 'bmkp-commentary-button)
+             (insert "           ")
+             (help-insert-xref-button "[Doc on the Web]" 'bmkp-help-button)
+             (insert "           ")
+             (help-insert-xref-button "[Customize]" 'bmkp-customize-button)
+             (insert "\n\n")
+             (goto-char (point-min))
+             (forward-line 2))
+           (goto-char top)
+           (insert (format
+                    "\n\nCurrent Status\n--------------\n
 Bookmark file:\t%s\nSorted:\t\t\t%s\nFiltering:\t\t%s\nMarked:\t\t\t%d\nOmitted:\t\t%d\n\
 Autosave bookmarks:\t%s\nAutosave list display:\t%s\n\n\n"
-                   bmkp-current-bookmark-file
-                   (if (not bmkp-sort-comparer)
-                       "no"
-                     (format "%s%s" (or (bmkp-current-sort-order)  "")
-                             ;; Code essentially the same as found in `bmkp-msg-about-sort-order'.
-                             (if (not (and (consp bmkp-sort-comparer) ; Ordinary single predicate
-                                           (consp (car bmkp-sort-comparer))))
-                                 (if bmkp-reverse-sort-p "; reversed" "")
-                               (if (not (cadr (car bmkp-sort-comparer)))
-                                   ;; Single PRED.
-                                   (if (or (and bmkp-reverse-sort-p  (not bmkp-reverse-multi-sort-p))
-                                           (and bmkp-reverse-multi-sort-p  (not bmkp-reverse-sort-p)))
-                                       "; reversed"
-                                     "")
-                                 ;; In case we want to distinguish:
-                                 ;; (if (and bmkp-reverse-sort-p
-                                 ;;          (not bmkp-reverse-multi-sort-p))
-                                 ;;     "; reversed"
-                                 ;;   (if (and bmkp-reverse-multi-sort-p
-                                 ;;            (not bmkp-reverse-sort-p))
-                                 ;;       "; reversed +"
-                                 ;;     ""))
-
-                                 ;; At least two PREDs.
-                                 (cond ((and bmkp-reverse-sort-p  (not bmkp-reverse-multi-sort-p))
-                                        "; reversed")
-                                       ((and bmkp-reverse-multi-sort-p  (not bmkp-reverse-sort-p))
-                                        "; each predicate group reversed")
-                                       ((and bmkp-reverse-multi-sort-p  bmkp-reverse-sort-p)
-                                        "; order of predicate groups reversed")
-                                       (t ""))))))
-                   (or (and bmkp-bmenu-filter-function  (downcase bmkp-bmenu-title))  "none")
-                   (length bmkp-bmenu-marked-bookmarks)
-                   (length bmkp-bmenu-omitted-bookmarks)
-                   (if bookmark-save-flag "yes" "no")
-                   (if bmkp-bmenu-state-file "yes" "no")))
-
-          ;; Add markings legend.
-          (let ((mm   "  >")
-                (DD   "  D")
-                (tt   "  t")
-                (aa   "  a")
-                (XX   "  X")
-                (mod  "  *"))
-            (put-text-property 2 3 'face 'bmkp->-mark mm)
-            (put-text-property 2 3 'face 'bmkp-D-mark DD)
-            (put-text-property 2 3 'face 'bmkp-t-mark tt)
-            (put-text-property 2 3 'face 'bmkp-a-mark aa)
-            (put-text-property 2 3 'face 'bmkp-X-mark XX)
-            (put-text-property 2 3 'face 'bmkp-*-mark mod)
-            (insert "Legend for Markings\n-------------------\n\n")
-            (insert (concat mm  "  marked\n"))
-            (insert (concat DD  "  flagged for deletion                     (`x' to delete all such)\n"))
-            (insert (concat tt  "  tagged                                   (`C-h C-RET' to see)\n"))
-            (insert (concat aa  "  annotated                                (`C-h C-RET' to see)\n"))
-            (insert (concat mod "  modified (not saved)\n"))
-            (insert (concat XX  "  temporary (will not be saved)\n"))
-            (insert "\n\n"))
-
-          ;; Add face legend.
-          (let ((gnus             "Gnus\n")
-                (no-jump          "Bookmarks you cannot jump to from `*Bookmark List*'\n")
-                (info             "Info node\n")
-                (man              "Man page\n")
-                (url              "URL\n")
-                (local-no-region  "Local file with no region\n")
-                (local-w-region   "Local file with a region\n")
-                (no-file          "No such local file\n")
-                (buffer           "Buffer\n")
-                (no-buf           "No such buffer now\n")
-                (bad              "Possibly invalid bookmark\n")
-                (remote           "Remote file/directory or Dired buffer (could have wildcards)\n")
-                (sudo             "Remote accessed by `su' or `sudo'\n")
-                (local-dir        "Local directory or Dired buffer (could have wildcards)\n")
-                (file-handler     "Bookmark with entry `file-handler'\n")
-                (bookmark-list    "*Bookmark List*\n")
-                (bookmark-file    "Bookmark file\n")
-                (snippet          "Snippet\n")
-                (desktop          "Desktop\n")
-                (sequence         "Sequence\n")
-                (variable-list    "Variable list\n")
-                (function         "Function\n"))
-            (put-text-property 0 (1- (length gnus))          'face 'bmkp-gnus         gnus)
-            (put-text-property 0 (1- (length info))          'face 'bmkp-info         info)
-            (put-text-property 0 (1- (length man))           'face 'bmkp-man          man)
-            (put-text-property 0 (1- (length url))           'face 'bmkp-url          url)
-            (put-text-property 0 (1- (length local-no-region))
-                               'face 'bmkp-local-file-without-region                  local-no-region)
-            (put-text-property 0 (1- (length local-w-region))
-                               'face 'bmkp-local-file-with-region                     local-w-region)
-            (put-text-property 0 (1- (length no-file))       'face 'bmkp-no-local     no-file)
-            (put-text-property 0 (1- (length buffer))        'face 'bmkp-buffer       buffer)
-            (put-text-property 0 (1- (length no-buf))        'face 'bmkp-non-file     no-buf)
-            (put-text-property 0 (1- (length remote))        'face 'bmkp-remote-file  remote)
-            (put-text-property 0 (1- (length sudo))          'face 'bmkp-su-or-sudo   sudo)
-            (put-text-property 0 (1- (length local-dir))
-                               'face 'bmkp-local-directory                            local-dir)
-            (put-text-property 0 (1- (length file-handler))  'face 'bmkp-file-handler file-handler)
-            (put-text-property 0 (1- (length bookmark-list))
-                               'face 'bmkp-bookmark-list                               bookmark-list)
-            (put-text-property 0 (1- (length bookmark-file))
-                               'face 'bmkp-bookmark-file                               bookmark-file)
-            (put-text-property 0 (1- (length snippet))       'face 'bmkp-snippet       snippet)
-            (put-text-property 0 (1- (length desktop))       'face 'bmkp-desktop       desktop)
-            (put-text-property 0 (1- (length sequence))      'face 'bmkp-sequence      sequence)
-            (put-text-property 0 (1- (length variable-list)) 'face 'bmkp-variable-list variable-list)
-            (put-text-property 0 (1- (length function))      'face 'bmkp-function      function)
-            (put-text-property 0 (1- (length no-jump))       'face 'bmkp-no-jump       no-jump)
-            (put-text-property 0 (1- (length bad))           'face 'bmkp-bad-bookmark  bad)
-            (insert "Legend for Bookmark Types\n-------------------------\n\n")
-            (when (and (fboundp 'display-images-p)  (display-images-p)
-                       bmkp-bmenu-image-bookmark-icon-file
-                       (file-readable-p bmkp-bmenu-image-bookmark-icon-file))
-              (let ((image  (create-image bmkp-bmenu-image-bookmark-icon-file nil nil :ascent 95)))
-                (when image (insert "  ")  (insert-image image)  (insert " Image file\n"))))
-            (insert "  " gnus) (insert "  " info) (insert "  " man) (insert "  " url)
-            (insert "  " local-no-region) (insert "  " local-w-region) (insert "  " no-file)
-            (insert "  " buffer) (insert "  " no-buf) (insert "  " remote) (insert "  " sudo)
-            (insert "  " local-dir) (insert "  " file-handler) (insert "  " bookmark-list)
-            (insert "  " bookmark-file) (insert "  " snippet) (insert "  " desktop)
-            (insert "  " sequence) (insert "  " variable-list) (insert "  " function)
-            (insert "  " no-jump) (insert "  " bad)
-            (insert "\n\nKeys without prefix `C-x' are available only here (`*Bookmark List*').\n")
-            (insert "Keys with prefix `C-x' are available everywhere.\n\n")
-            (insert "Remember that you can see all bindings for a prefix key by hitting it,\n")
-            (insert "then `C-h'.  E.g., `s C-h' to see keys with prefix `s' (sorting).")))))))
+                    bmkp-current-bookmark-file
+                    (if (not bmkp-sort-comparer)
+                        "no"
+                      (format "%s%s" (or (bmkp-current-sort-order)  "")
+                              ;; Code essentially the same as found in `bmkp-msg-about-sort-order'.
+                              (if (not (and (consp bmkp-sort-comparer) ; Ordinary single predicate
+                                            (consp (car bmkp-sort-comparer))))
+                                  (if bmkp-reverse-sort-p "; reversed" "")
+                                (if (not (cadr (car bmkp-sort-comparer)))
+                                    ;; Single PRED.
+                                    (if (or (and bmkp-reverse-sort-p  (not bmkp-reverse-multi-sort-p))
+                                            (and bmkp-reverse-multi-sort-p  (not bmkp-reverse-sort-p)))
+                                        "; reversed"
+                                      "")
+                                  ;; In case we want to distinguish:
+                                  ;; (if (and bmkp-reverse-sort-p
+                                  ;;          (not bmkp-reverse-multi-sort-p))
+                                  ;;     "; reversed"
+                                  ;;   (if (and bmkp-reverse-multi-sort-p
+                                  ;;            (not bmkp-reverse-sort-p))
+                                  ;;       "; reversed +"
+                                  ;;     ""))
+
+                                  ;; At least two PREDs.
+                                  (cond ((and bmkp-reverse-sort-p  (not bmkp-reverse-multi-sort-p))
+                                         "; reversed")
+                                        ((and bmkp-reverse-multi-sort-p  (not bmkp-reverse-sort-p))
+                                         "; each predicate group reversed")
+                                        ((and bmkp-reverse-multi-sort-p  bmkp-reverse-sort-p)
+                                         "; order of predicate groups reversed")
+                                        (t ""))))))
+                    (or (and bmkp-bmenu-filter-function  (downcase bmkp-bmenu-title))  "none")
+                    (length bmkp-bmenu-marked-bookmarks)
+                    (length bmkp-bmenu-omitted-bookmarks)
+                    (if bookmark-save-flag "yes" "no")
+                    (if bmkp-bmenu-state-file "yes" "no")))
+
+           ;; Add markings legend.
+           (let ((mm   "  >")
+                 (DD   "  D")
+                 (tt   "  t")
+                 (aa   "  a")
+                 (XX   "  X")
+                 (mod  "  *"))
+             (put-text-property 2 3 'face 'bmkp->-mark mm)
+             (put-text-property 2 3 'face 'bmkp-D-mark DD)
+             (put-text-property 2 3 'face 'bmkp-t-mark tt)
+             (put-text-property 2 3 'face 'bmkp-a-mark aa)
+             (put-text-property 2 3 'face 'bmkp-X-mark XX)
+             (put-text-property 2 3 'face 'bmkp-*-mark mod)
+             (insert "Legend for Markings\n-------------------\n\n")
+             (insert (concat mm  "  marked\n"))
+             (insert (concat DD  "  flagged for deletion                     (`x' to delete all such)\n"))
+             (insert (concat tt  "  tagged                                   (`C-h C-RET' to see)\n"))
+             (insert (concat aa  "  annotated                                (`C-h C-RET' to see)\n"))
+             (insert (concat mod "  modified (not saved)\n"))
+             (insert (concat XX  "  temporary (will not be saved)\n"))
+             (insert "\n\n"))
+
+           ;; Add face legend.
+           (let ((gnus             "Gnus\n")
+                 (no-jump          "Bookmarks you cannot jump to from `*Bookmark List*'\n")
+                 (info             "Info node\n")
+                 (man              "Man page\n")
+                 (url              "URL\n")
+                 (local-no-region  "Local file with no region\n")
+                 (local-w-region   "Local file with a region\n")
+                 (no-file          "No such local file\n")
+                 (buffer           "Buffer\n")
+                 (no-buf           "No such buffer now\n")
+                 (bad              "Possibly invalid bookmark\n")
+                 (remote           "Remote file/directory or Dired buffer (could have wildcards)\n")
+                 (sudo             "Remote accessed by `su' or `sudo'\n")
+                 (local-dir        "Local directory or Dired buffer (could have wildcards)\n")
+                 (file-handler     "Bookmark with entry `file-handler'\n")
+                 (bookmark-list    "*Bookmark List*\n")
+                 (bookmark-file    "Bookmark file\n")
+                 (snippet          "Snippet\n")
+                 (desktop          "Desktop\n")
+                 (sequence         "Sequence\n")
+                 (variable-list    "Variable list\n")
+                 (function         "Function\n"))
+             (put-text-property 0 (1- (length gnus))          'face 'bmkp-gnus         gnus)
+             (put-text-property 0 (1- (length info))          'face 'bmkp-info         info)
+             (put-text-property 0 (1- (length man))           'face 'bmkp-man          man)
+             (put-text-property 0 (1- (length url))           'face 'bmkp-url          url)
+             (put-text-property 0 (1- (length local-no-region))
+                                'face 'bmkp-local-file-without-region                  local-no-region)
+             (put-text-property 0 (1- (length local-w-region))
+                                'face 'bmkp-local-file-with-region                     local-w-region)
+             (put-text-property 0 (1- (length no-file))       'face 'bmkp-no-local     no-file)
+             (put-text-property 0 (1- (length buffer))        'face 'bmkp-buffer       buffer)
+             (put-text-property 0 (1- (length no-buf))        'face 'bmkp-non-file     no-buf)
+             (put-text-property 0 (1- (length remote))        'face 'bmkp-remote-file  remote)
+             (put-text-property 0 (1- (length sudo))          'face 'bmkp-su-or-sudo   sudo)
+             (put-text-property 0 (1- (length local-dir))
+                                'face 'bmkp-local-directory                            local-dir)
+             (put-text-property 0 (1- (length file-handler))  'face 'bmkp-file-handler file-handler)
+             (put-text-property 0 (1- (length bookmark-list))
+                                'face 'bmkp-bookmark-list                               bookmark-list)
+             (put-text-property 0 (1- (length bookmark-file))
+                                'face 'bmkp-bookmark-file                               bookmark-file)
+             (put-text-property 0 (1- (length snippet))       'face 'bmkp-snippet       snippet)
+             (put-text-property 0 (1- (length desktop))       'face 'bmkp-desktop       desktop)
+             (put-text-property 0 (1- (length sequence))      'face 'bmkp-sequence      sequence)
+             (put-text-property 0 (1- (length variable-list)) 'face 'bmkp-variable-list variable-list)
+             (put-text-property 0 (1- (length function))      'face 'bmkp-function      function)
+             (put-text-property 0 (1- (length no-jump))       'face 'bmkp-no-jump       no-jump)
+             (put-text-property 0 (1- (length bad))           'face 'bmkp-bad-bookmark  bad)
+             (insert "Legend for Bookmark Types\n-------------------------\n\n")
+             (when (and (fboundp 'display-images-p)  (display-images-p)
+                        bmkp-bmenu-image-bookmark-icon-file
+                        (file-readable-p bmkp-bmenu-image-bookmark-icon-file))
+               (let ((image  (create-image bmkp-bmenu-image-bookmark-icon-file nil nil :ascent 95)))
+                 (when image (insert "  ")  (insert-image image)  (insert " Image file\n"))))
+             (insert "  " gnus) (insert "  " info) (insert "  " man) (insert "  " url)
+             (insert "  " local-no-region) (insert "  " local-w-region) (insert "  " no-file)
+             (insert "  " buffer) (insert "  " no-buf) (insert "  " remote) (insert "  " sudo)
+             (insert "  " local-dir) (insert "  " file-handler) (insert "  " bookmark-list)
+             (insert "  " bookmark-file) (insert "  " snippet) (insert "  " desktop)
+             (insert "  " sequence) (insert "  " variable-list) (insert "  " function)
+             (insert "  " no-jump) (insert "  " bad)
+             (insert "\n\nKeys without prefix `C-x' are available only here (`*Bookmark List*').\n")
+             (insert "Keys with prefix `C-x' are available everywhere.\n\n")
+             (insert "Remember that you can see all bindings for a prefix key by hitting it,\n")
+             (insert "then `C-h'.  E.g., `s C-h' to see keys with prefix `s' (sorting)."))))))))
+
 
 (when (and (> emacs-major-version 21)
            (condition-case nil (require 'help-mode nil t) (error nil))
@@ -4485,8 +4567,8 @@ Save the command definition in `bmkp-bmenu-commands-file'."
          (fn     (intern (read-string "Define command to jump to a bookmark now marked: " nil
                                       bmkp-bmenu-define-command-history)))
          (def    `(defun ,fn (bookmark-name &optional flip-use-region-p)
-                   (interactive (list (bmkp-read-bookmark-for-type nil ',cands t) current-prefix-arg))
-                   (bmkp-jump-1 bookmark-name 'bmkp-select-buffer-other-window flip-use-region-p))))
+                    (interactive (list (bmkp-read-bookmark-for-type nil ',cands t) current-prefix-arg))
+                    (bmkp-jump-1 bookmark-name 'bmkp-select-buffer-other-window flip-use-region-p))))
     (eval def)
     (with-current-buffer (find-file-noselect bmkp-bmenu-commands-file)
       (goto-char (point-max))
@@ -4637,7 +4719,8 @@ the omit list and the sort & filter information."
                                                                  (convert-standard-filename
                                                                   (expand-file-name
                                                                    bmkp-current-bookmark-file))))
-                      ;; $$$$$$ (let ((bookmark-alist  (bmkp-refresh-latest-bookmark-list))) ; Sets *-latest-* also.
+                      ;; $$$$$$ Sets *-latest-* also:
+                      ;;   (let ((bookmark-alist  (bmkp-refresh-latest-bookmark-list)))
                       (let ((bookmark-alist  (or bmkp-latest-bookmark-alist
                                                  (bmkp-refresh-latest-bookmark-list)))) ; Sets *-latest-* also.
                         (bmkp-bmenu-list-1 'filteredp nil (interactive-p)))
@@ -4645,7 +4728,8 @@ the omit list and the sort & filter information."
                         (with-current-buffer (get-buffer bmkp-bmenu-buffer)
                           (bmkp-bmenu-goto-bookmark-named bmkp-last-bmenu-bookmark)))
                       (when (interactive-p)
-                        (bmkp-msg-about-sort-order (car (rassoc bmkp-sort-comparer bmkp-sort-orders-alist)))))))
+                        (bmkp-msg-about-sort-order
+                         (car (rassoc bmkp-sort-comparer bmkp-sort-orders-alist)))))))
     (eval def)
     (with-current-buffer (find-file-noselect bmkp-bmenu-commands-file)
       (goto-char (point-min)) ; Delete any preexisting defs of the same command.
@@ -4757,7 +4841,7 @@ specified tags, in order, separated by hyphens (`-').  E.g., for TAGS
 If you use this function non-interactively, be sure to load library
 `bookmark+-mac.el' first."
   (interactive
-   (progn (or (condition-case nil       ; Load `bookmark+-mac.el' when called interactively.
+   (progn (or (condition-case nil ; Load `bookmark+-mac.el' when called interactively.
                   (load-library "bookmark+-mac") ; Use load-library to ensure latest .elc.
                 (error nil))
               (require 'bookmark+-mac))
@@ -4768,16 +4852,16 @@ If you use this function non-interactively, be sure to load library
         def)
     (dolist (tag  tags)
       (push `(lambda (b1 b2)
-              (let ((tags1  (bmkp-get-tags b1))
-                    (tags2  (bmkp-get-tags b2)))
-                (cond ((and (assoc-default ,tag tags1 nil t)
-                            (assoc-default ,tag tags2 nil t))  nil)
-                      ((assoc-default ,tag tags1 nil t)        '(t))
-                      ((assoc-default ,tag tags2 nil t)        '(nil))
-                      ((and tags1  tags2)                      nil)
-                      (tags1                                   '(t))
-                      (tags2                                   '(nil))
-                      (t                                       nil))))
+               (let ((tags1  (bmkp-get-tags b1))
+                     (tags2  (bmkp-get-tags b2)))
+                 (cond ((and (assoc-default ,tag tags1 nil t)
+                             (assoc-default ,tag tags2 nil t))  nil)
+                       ((assoc-default ,tag tags1 nil t)        '(t))
+                       ((assoc-default ,tag tags2 nil t)        '(nil))
+                       ((and tags1  tags2)                      nil)
+                       (tags1                                   '(t))
+                       (tags2                                   '(nil))
+                       (t                                       nil))))
             comparer))
     (setq comparer  (nreverse comparer)
           comparer  (list comparer 'bmkp-alpha-p))
@@ -5110,8 +5194,23 @@ the same name."
 Starting with Emacs 22, the first element is `font-lock-face'."
   (list (if (> emacs-major-version 21) 'font-lock-face 'face) value))
 
-(when (or (> emacs-major-version 24)    ; Emacs bug #12867 was partially fixed for Emacs 24.3+.
+(when (or (> emacs-major-version 24) ; Emacs bug #12867 was partially fixed for Emacs 24.3+.
           (and (= emacs-major-version 24)  (> emacs-minor-version 2)))
+
+  (defconst bmkp--bmenu-regexp-> "^>" "Regexp to match `>' in *Bookmark List* first column.")
+  (defconst bmkp--bmenu-regexp-D "^D" "Regexp to match `D' in *Bookmark List* first column.")
+  (defconst bmkp--bmenu-regexp-t "^t" "Regexp to match `t' in *Bookmark List* second column.")
+  (defconst bmkp--bmenu-regexp-X "^X" "Regexp to match `X' in *Bookmark List* third column.")
+  (defconst bmkp--bmenu-regexp-a "^a" "Regexp to match `a' in *Bookmark List* third column.")
+  (defconst bmkp--bmenu-regexp-* "^*" "Regexp to match `*' in *Bookmark List* fourth column.")
+
+  (defvar bmkp--bmenu-nb-> 0 "Number of `>' in *Bookmark List* first column.")
+  (defvar bmkp--bmenu-nb-D 0 "Number of `D' in *Bookmark List* first column.")
+  (defvar bmkp--bmenu-nb-t 0 "Number of `>' in *Bookmark List* second column.")
+  (defvar bmkp--bmenu-nb-X 0 "Number of `X' in *Bookmark List* third column.")
+  (defvar bmkp--bmenu-nb-a 0 "Number of `a' in *Bookmark List* third column.")
+  (defvar bmkp--bmenu-nb-* 0 "Number of `*' in *Bookmark List* fourth column.")
+
   (defun bmkp-bmenu-mode-line-string ()
     "Show, in mode line, information about the current bookmark-list display.
 The information includes the sort order and the number of marked,
@@ -5123,27 +5222,21 @@ For each number indication:
  others with the same indicator listed after it, then show `N/M',
  where N is the number indicated through the current line and M is the
  total number indicated."
-    (let* ((regexp->   "^>")
-           (regexp-D   "^D")
-           (regexp-t   "^.t")
-           (regexp-X   "^..X")
-           (regexp-a   "^..a")
-           (regexp-*   "^...\\*")
-           (nb->       (count-matches regexp-> (point-min) (point-max)))
-           (nb-D       (count-matches regexp-D (point-min) (point-max)))
-           (nb-t       (count-matches regexp-t (point-min) (point-max)))
-           (nb-X       (count-matches regexp-X (point-min) (point-max)))
-           (nb-a       (count-matches regexp-a (point-min) (point-max)))
-           (nb-*       (count-matches regexp-* (point-min) (point-max)))
-           (text-sort  (propertize
-                        (concat "sorting " (bmkp-sorting-description (bmkp-current-sort-order)))
-                        'face 'bmkp-heading))
+    (let* ((bmkp--bmenu-nb->  (count-matches bmkp--bmenu-regexp-> (point-min) (point-max)))
+           (bmkp--bmenu-nb-D  (count-matches bmkp--bmenu-regexp-D (point-min) (point-max)))
+           (bmkp--bmenu-nb-t  (count-matches bmkp--bmenu-regexp-t (point-min) (point-max)))
+           (bmkp--bmenu-nb-X  (count-matches bmkp--bmenu-regexp-X (point-min) (point-max)))
+           (bmkp--bmenu-nb-a  (count-matches bmkp--bmenu-regexp-a (point-min) (point-max)))
+           (bmkp--bmenu-nb-*  (count-matches bmkp--bmenu-regexp-* (point-min) (point-max)))
+           (text-sort   (propertize
+                         (concat "sorting " (bmkp-sorting-description (bmkp-current-sort-order)))
+                         'face 'bmkp-heading))
            regexp)
       (let ((desc  "")
             nb)
         (dolist (mk  '(?> ?D ?t ?a ?X ?*))
-          (setq nb      (symbol-value (intern (format "nb-%c" mk)))
-                regexp  (symbol-value (intern (format "regexp-%c" mk)))
+          (setq nb      (symbol-value (intern (format "bmkp--bmenu-nb-%c" mk)))
+                regexp  (symbol-value (intern (format "bmkp--bmenu-regexp-%c" mk)))
                 desc    (concat
                          desc
                          (and (> nb 0)
@@ -5160,7 +5253,7 @@ For each number indication:
                          (and (> nb 0)  " "))))
         (format "%s%s" desc text-sort))))
 
-  (defun bmkp-bmenu-mode-line ()        ; This works, but it shows the line number also.
+  (defun bmkp-bmenu-mode-line () ; This works, but it shows the line number also.
     "Set the mode line for buffer `*Bookmark List*'."
     (condition-case nil
         (progn
@@ -5171,7 +5264,9 @@ For each number indication:
           (set (make-local-variable 'mode-line-position) '("%360l (line)")) ; Move it off the screen.
           (set (make-local-variable 'mode-line-format)
                '(("" mode-name "\t" mode-line-buffer-identification mode-line-position))))
-      (error nil))))
+      (error nil)))
+
+  )
 
 (when (fboundp 'org-add-link-type)
   (org-add-link-type "bookmark"           'bookmark-jump)
@@ -5196,11 +5291,9 @@ prefix arg, the link will use another window.  The link type is
 ;;  *** Sorting - Commands ***
 
 ;;;###autoload (autoload 'bmkp-bmenu-change-sort-order-repeat "bookmark+")
-(defun bmkp-bmenu-change-sort-order-repeat (arg) ; Bound to `s s'... in bookmark list
-  "Cycle to the next sort order.
-With a prefix arg, reverse current sort order.
-This is a repeatable version of `bmkp-bmenu-change-sort-order'."
-  (interactive "P")
+(defun bmkp-bmenu-change-sort-order-repeat () ; Bound to `s s'... in bookmark list
+  "Cycle to the next sort order."
+  (interactive)
   (require 'repeat)
   (bmkp-repeat-command 'bmkp-bmenu-change-sort-order))
 
@@ -5523,7 +5616,7 @@ Return non-nil only if there was such an annotation buffer."
 With a prefix argument, show the internal definition of the bookmark."
   (interactive "P")
   (forward-line 1)
-  (bmkp-bmenu-describe-this-bookmark))
+  (bmkp-bmenu-describe-this-bookmark defn))
 
 ;;;###autoload (autoload 'bmkp-bmenu-describe-this+move-up "bookmark+")
 (defun bmkp-bmenu-describe-this+move-up (&optional defn) ; Bound to `C-up' in bookmark list
@@ -5531,7 +5624,7 @@ With a prefix argument, show the internal definition of the bookmark."
 With a prefix argument, show the internal definition of the bookmark."
   (interactive "P")
   (forward-line -1)
-  (bmkp-bmenu-describe-this-bookmark))
+  (bmkp-bmenu-describe-this-bookmark defn))
 
 ;;;###autoload (autoload 'bmkp-bmenu-describe-this-bookmark "bookmark+")
 (defun bmkp-bmenu-describe-this-bookmark (&optional defn) ; Bound to `C-h RET' in bookmark list
@@ -5837,7 +5930,7 @@ are marked or ALLP is non-nil."
 
 ;;; `Bookmark+' menu-bar menu in `*Bookmark List*'
 
-(defvar bmkp-bmenu-menubar-menu (make-sparse-keymap "Bookmark+") "`Boomark+' menu-bar menu.")
+(defvar bmkp-bmenu-menubar-menu (make-sparse-keymap "Bookmark+") "`Bookmark+' menu-bar menu.")
 (define-key bookmark-bmenu-mode-map [menu-bar bmkp]
   (cons "Bookmark+" bmkp-bmenu-menubar-menu))
 
@@ -5845,6 +5938,10 @@ are marked or ALLP is non-nil."
 (define-key bmkp-bmenu-menubar-menu [bmkp-bmenu-quit]
   '(menu-item "Quit" bmkp-bmenu-quit
     :help "Quit the bookmark list, saving its state and the current set of bookmarks"))
+(define-key bmkp-bmenu-menubar-menu [bmkp-send-bug-report]
+  '(menu-item "Send Bug Report" bmkp-send-bug-report
+    :help "Send an email reporting a Bookmark+ bug"))
+(define-key bmkp-bmenu-menubar-menu [top-sep8] '("--")) ; ------------
 (define-key bmkp-bmenu-menubar-menu [bmkp-list-defuns-in-commands-file]
   '(menu-item "List User-Defined Bookmark Commands" bmkp-list-defuns-in-commands-file
     :help "List the functions defined in `bmkp-bmenu-commands-file'"))
index 3c8653b677b2c3074d4913afe86d4bfd3ace184a..d13a5922249c26a5187acb38380d2a5053534f0c 100644 (file)
@@ -4,11 +4,11 @@
 ;; Description: Change logs for Bookmark+ libraries.
 ;; Author: Drew Adams
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 2000-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2000-2024, Drew Adams, all rights reserved.
 ;; Created: Fri Sep 15 07:58:41 2000
-;; Last-Updated: Fri Jan 14 12:54:17 2022 (-0800)
+;; Last-Updated: Tue Oct 15 14:27:18 2024 (-0700)
 ;;           By: dradams
-;;     Update #: 16855
+;;     Update #: 17025
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b-chg.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, bookmark+
  
 ;;;(@* "CHANGE LOG FOR `bookmark+-1.el'")
 ;;
+;; 2024/02/01 dadams
+;;     Move bmkp-make-plain-predicate to bookmark+-mac.el, changing it to a macro.
+;; 2023/10/24 dadams
+;;     bookmark-location: Respect new option, bmkp-bmenu-show-file-not-buffer-flag.
+;; 2023/10/23 dadams
+;;     lexical-binding = t.
+;;     bmkp-make-obsolete-variable: Handle also Emacs 24+ (arg ACCESS-TYPE).
+;;     Added vacuous defvars: bmkp-setting-automatic-bmk-p, cl-print-readably, desktop-restore-eager,
+;;       icicle-bookmark-completing-p, Man-notify-method, orig-buff, repeat-previous-repeated-command,
+;;       repeat-message-function.
+;;     bmkp-(automatic|temporary)-bookmark-mode, bmkp-bookmark-set-confirm-overwrite,
+;;      bmkp-isearch-next-bookmark-buffer, bmkp-describe-bookmark-internals, bmkp-store-org-link:
+;;        Add _ prefix to unused args.
+;;     bookmark-set, bmkp-read-tags-completing, bmkp-buffer-last-access-cp,
+;;      bmkp-purge-notags-autofiles, bmkp-bookmark-description, bmkp-read-variables-completing,
+;;      bmkp-set-eww-bookmark-here, bmkp-delete-bookmarks:
+;;        Removed unused let vars.
+;;     bmkp-*-alist-only, bmkp(-autofile)-remove-tags, bmkp-sort-omit, bmkp-set-*-bookmark,
+;;      bmkp-create-variable-list-bookmark, bmkp-jump-dired, bmkp-find-file-(all|some)-tags*:
+;;        Use new macro bmkp-lexlet[*], not lexical-let (removed from Emacs 29).
+;;     bmkp-new-bookmark-default-names, bmkp-(buffer|file)-names, bmkp-tags-list,
+;;      bmkp-read-(tags|variables)-completing, bmkp-tags-in-bookmark-file, bmkp-read-(buffers|files),
+;;      bmkp-printable-vars+vals, bmkp-(automatic|temporary)-bookmark(ing)-mode:
+;;        Replace add-to-list with membership test and setq, since lexical-binding.
+;;     bmkp-switch-to-bookmark-file-this-file/buffer: Removed unused arg BATCHP.
+;;     bmkp-write-alist-bookmarks-to-file, bmkp-save-bookmarks-this-file/buffer:
+;;       Removed arg ADDP, don't pass it to bmkp-write-alist-bookmarks-to-file, and remove from doc.
+;;     bmkp-crosshairs-highlight: Removed binding of obsolete crosshairs-overlay-priority.
+;;     bmkp-tags-list: Use cl-typecase, not typecase.
+;;     bmkp-make-bookmark-file-record: Rename arg from BOOKMARK-FILE (global var) to BMK-FILE.
+;;     bmkp-desktop-save: Renamed let var from DESKTOP-DIR to DESK-DIR.
+;;     bmkp-desktop-delete: Renamed let var from DESKTOP-DIR to global var DESKTOP-DIRNAME.
+;;     bmkp-create-variable-list-bookmark: Use ', (in backquote) for bmkp-lexlet var values.
+;;     bmkp-readable-p: Bind cl-print-readably, not print-readably.
+;;     bmkp-*-tags(-*)-jump(-*): Added optional arg INTERACTIVEP.  Added error test to body (also).
+;;                               Corrected error messages.
+;;     bmkp-(next|previous)-bookmark-*-repeat: Removed arg from *-repeat (maybe put back later?).
+;;     bmkp-visit-external-annotation: Show message only when arg MSG-P.
+;; 2023/09/27 dadams
+;;     Require cl-lib when available, else defalias cl-* to *.  Use only cl-*, not *.
+;; 2023/06/30 dadams
+;;     Added: bmkp-bookmarks-already-loaded, as replacement for vanilla bookmarks-already-loaded and
+;;            bookmark-bookmarks-timestamp.
+;;     bookmark-maybe-load-default-file, bookmark-load,
+;;      bmkp-delete-(temporary|autonamed(-this-buffer))-no-confirm:
+;;        Use bmkp-bookmarks-already-loaded, not bookmarks-already-loaded.
+;;     bookmark-load: Add _IGNORED &rest arg, for optional DEFAULT arg added by Emacs 27+.
+;; 2023/06/12 dadams
+;;     Added: bmkp-describe-bookmark-button, bmkp-describe-bookmark-internals-button,
+;;            bmkp-add-describe-bookmark-button, bmkp-add-describe-bookmark-internals-button.
+;;     bmkp-describe-bookmark(-internals): Use bmkp-add-describe-bookmark(-internals)-button.
+;; 2022/09/07 dadams
+;;     bmkp-jump-function: Use arrayp, not vectorp (keyboard macros can be strings).
+;; 2022/08/17 dadams
+;;     bmkp-jump-to-list: Removed unused optional args.
+;; 2022/08/16 dadams
+;;     bmkp-bookmark-description, Dired bookmark:
+;;       Ensure prop dired-directory is a cons when get list of explicitly listed files.
+;; 2022/08/03 dadams
+;;     bookmark-alist doc string: Mention that HANDLER should generally display the destination.
+;; 2022/06/21 dadams
+;;     bmkp-edit-tags: Use prin1 for bookmark name, in case of embedded " chars etc.
+;;                     Strip properties from bookmark name, and historicize it.
+;; 2022/06/09 dadams
+;;     bmkp-bookmark-description: Added list of explicit files, for Dired snapshots.
+;; 2022/06/05 dadams
+;;     bmkp-sort-comparer: Updated default value to what's used in bmkp-bmenu-sort-by-bookmark-type.
 ;; 2021/09/19 dadams
 ;;     Everywhere: Use bmkp-bmenu-buffer, not vanilla bookmark-bmenu-buffer.
 ;;     bmkp-bmenu-barf-if-not-in-menu-list: Test mode with derived-mode-p; don't test buffer name.
  
 ;;;(@* "CHANGE LOG FOR `bookmark+-bmu.el'")
 ;;
+;; 2024/02/10 dadams
+;;     bookmark-bmenu-mode: Reformatted to put keys within `...'.
+;;     bmkp-bmenu-move-marked-to-bookmark-file: Mention confirmation prompt if FILE doesn't exist.
+;; 2023/10/24 dadams
+;;     Added option bmkp-bmenu-show-file-not-buffer-flag.
+;; 2023/10/23 dadams
+;;     lexical-binding = t.
+;;     Added: bmkp--bmenu-nb->, bmkp--bmenu-nb-a, bmkp--bmenu-nb-D, bmkp--bmenu-nb-t,
+;;       bmkp--bmenu-nb-X, bmkp--bmenu-nb-*, bmkp--bmenu-regexp->, bmkp--bmenu-regexp-a,
+;;       bmkp--bmenu-regexp-D, bmkp--bmenu-regexp-t, bmkp--bmenu-regexp-X, bmkp--bmenu-regexp-*.
+;;     bmkp-bmenu-list-1: Removed unused let var TEMPORARYP.
+;;     bookmark-bmenu-execute-deletions: Clarified doc: NO-CONFIRM-P is only for marked, not flagged.
+;;     bmkp-bmenu-unmark-all: Removed unused let var QUERY.
+;;     bmkp-bmenu-toggle-marks: Removed unused arg BACKUP.
+;;     bmkp-bmenu-delete-marked: Added "P" arg to interactive.
+;;                               Pass NO-CONFIRM-P arg to bookmark-bmenu-execute-deletions.
+;;                               Clarified doc string.
+;;     bmkp-bmenu-(search|query-replace)-marked-bookmarks-regexp:
+;;       Use backquote and use ', for args to bmkp-bmenu-marked-or-this-or-all.
+;;     bmkp-bmenu-mode-line-string: Use bmkp--bmenu-(nb|regexp)- dyn vars, since lexical binding now.
+;;     bmkp-bmenu-change-sort-order-repeat: Removed arg (maybe put back later?).
+;;     bmkp-bmenu-describe-this+move-(down|up): Pass arg DEFN to bmkp-bmenu-describe-this-bookmark.
+;; 2023/09/27 dadams
+;;     Require cl-lib when available, else defalias cl-* to *.  Use only cl-*, not *.
+;; 2023/05/17 dadams
+;;     bmkp-bmenu-mode-status-help: Bind describe-function-orig-buffer (new in Emacs 28).
+;; 2022/11/05 dadams
+;;     Typo: bmkp-bmenu-show-only-man-page-bookmarks should be bmkp-bmenu-show-only-man-bookmarks.
+;; 2022/05/26 dadams
+;;     bmkp-bmenu-menubar-menu: Added bmkp-send-bug-report.
 ;; 2022/01/14 dadams
 ;;     bmkp-bmenu-edit-marked: Enable undo inside with-current-buffer (not significant).
 ;; 2021/09/19 dadams
  
 ;;;(@* "CHANGE LOG FOR `bookmark+-doc.el'")
 ;;
+;; 2024/09/16 dadams
+;;     Added doc about bmkp-define-type-from-hander.
 ;; 2020/07/04 dadams
 ;;     Changed all references to `C-x p' to `C-x x'.
  
 ;;;(@* "CHANGE LOG FOR `bookmark+-key.el'")
 ;;
+;; 2023/10/23 dadams
+;;     lexical-binding = t.
+;;     bmkp-exists-this-file/buffer-bookmarks-p: Pass arg ALIST to bmkp-exists-bookmark-satisfying-p.
+;; 2023/09/27 dadams
+;;     Require cl-lib when available, else defalias cl-* to *.  Use only cl-*, not *.
+;; 2022/05/26 dadams
+;;     menu-bar-bookmark-map:
+;;       Added bmkp-send-bug-report.
+;;       Corrected position of Insert Bookmark Contents to after bmkp-list-defuns-in-commands-file.
 ;; 2021/09/19 dadams
 ;;     Everywhere: Use bmkp-bmenu-buffer, not vanilla bookmark-bmenu-buffer.
 ;; 2021/02/12 dadams
  
 ;;;(@* "CHANGE LOG FOR `bookmark+-lit.el'")
 ;;
+;; 2023-10-26 dadams
+;;     Duplicate definition of bmkp-make-obsolete, and remove require of bookmark+-1.el.
+;; 2023/10/23 dadams
+;;     lexical-binding = t.
+;;     bmkp-bmenu-set-lighting: Pass MSGP arg, not 'MSG.
+;;     bmkp-(next|previous)-*-repeat: Removed arg from *-repeat (maybe put back later?).
+;;     bmkp-light-when: Removed let (unused vars).
+;;     bmkp-a-bookmark-lighted-on-this-line: Removed unused arg MSGP.
+;; 2023/09/27 dadams
+;;     Require cl-lib when available, else defalias cl-* to *.  Use only cl-*, not *.
+;; 2022/11/27 dadams
+;;     Corrected all C-x p to C-x x, in comments.
+;; 2022/11/18 dadams
+;;     bmkp-light-bookmarks: Arg ALIST is not optional.
+;;     Describe args for commands when called from Lisp.
+;; 2022/11/13 dadams
+;;     (Temporary - remove later): require bookmark+-1.el, for bmkp-make-obsolete.
+;; 2022/11/12 dadams
+;;     Added: bmkp-choose-bookmark-lighted-at-point.
+;;     Renamed: bmkp-describe-bookmark-lighted-here to bmkp-describe-bookmark-lighted-on-this-line,
+;;              bmkp-unlight-bookmark-here to bmkp-unlight-bookmark-on-this-line,
+;;              bmkp-lighted-jump-to-list to bmkp-lighted-here-jump-to-list.
+;; 2022/08/17 dadams
+;;     bmkp-jump-to-list: Removed unused optional args.
 ;; 2021/09/19 dadams
 ;;     Everywhere: Use bmkp-bmenu-buffer, not vanilla bookmark-bmenu-buffer.
 ;; 2021/04/16 dadams
 ;;       that depends on macros needs to be byte-compiled anew after loading the updated macros.
 ;; **************************************************************************************************
 ;;
+;; 2024/09/16 dadams
+;;     Added bmkp-define-type-from-hander.
+;; 2024/02/01 dadams
+;;     Move bmkp-make-plain-predicate here from bookmark+-1.el, changing it to a macro.
+;; 2023/10/23 dadams
+;;     lexical-binding = t.
+;;     Added: bmkp-lexlet, bmkp-lexlet*.
+;;     bmkp-define-next+prev-cycle-commands: Removed arg from *-repeat (maybe put back later?).
+;;     bmkp-define-history-variables: Need progn, and ENTRY was a free var.
 ;; 2021/04/16 dadams
 ;;     bmkp-define-file-sort-predicate: Use bmkp-get-bookmark, not bookmark-get-bookmark.
 ;; 2021/03/04 dadams
  
 ;;;(@* "CHANGE LOG FOR `bookmark+.el'")
 ;;
+;; 2024/10/15 dadams
+;;     Version: 2024.10.15
+;; 2024/03/23 dadams
+;;     Version: 2024.03.23
+;; 2023/10/26 dadams
+;;     Version: 2023.10.26, bmkp-version-number same.
+;; 2023/10/23 dadams
+;;     Version: 2023.10.23
+;;     Major update.  lexical-binding = t.
+;; 2023/09/27 dadams
+;;     Version: 2023.09.27
+;; 2023/06/12 dadams
+;;     Version: 2023.06.12
+;; 2022/08/16 dadams
+;;     Version: 2022.08.16
 ;; 2021/09/19 dadams
 ;;     Version 2021.09.19
 ;;     Added option bmkp-bmenu-buffer.
index 603ed104c1bdd3c9312c13ad5b3a47d8d208d013..0d307816cadb21017c5e810be7a6cfe63a862c78 100644 (file)
@@ -4,11 +4,11 @@
 ;; Description: Documentation for package Bookmark+
 ;; Author: Drew Adams
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 2000-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2000-2024, Drew Adams, all rights reserved.
 ;; Created: Fri Sep 15 07:58:41 2000
-;; Last-Updated: Fri Jan 14 12:46:47 2022 (-0800)
+;; Last-Updated: Tue Nov 19 12:31:28 2024 (-0800)
 ;;           By: dradams
-;;     Update #: 15385
+;;     Update #: 15425
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b-doc.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, bookmark+, placeholders, annotations, search,
 ;;      (@> "A Type-Aware `find-file'")
 ;;    (@> "Tagging Files")
 ;;    (@> "Using Multiple Bookmark Files")
+;;      (@> "Bookmark Files For Bookmarks with Specific Tags")
 ;;      (@> "Bookmark-File Bookmarks")
 ;;    (@> "The Bookmark List Display")
 ;;      (@> "Jumping To Bookmarks from the Bookmark List Display")
 ;;    using function `bookmark-make-record', or by binding variable
 ;;    `bookmark-make-record-function' for a given context.
 ;;
-;;    But you can also make jumping to a new type of bookmarks
+;;    You can also make jumping to a new type of bookmarks
 ;;    type-specific, usable with `bmkp-jump-to-type' (`C-x j :') or
 ;;    with your own type-specific jump command.
 ;;
-;;    For that, just:
+;;    For that, you need to do this:
 ;;
 ;;    1. Define a function `bmkp-TYPE-alist-only', which returns an
 ;;       alist of bookmarks that are only of your new TYPE, for use
 ;;       variable for your type, again, for use with
 ;;       `bookmark-completing-read'.
 ;;
+;;    You can use macro `bmkp-define-type-from-hander' to define a
+;;    simple bookmark type that's based only on a given handler.  You
+;;    pass it the TYPE name and HANDLER name as arguments.  It does #1
+;;    and #2 above, plus it defines:
+;;
+;;    * A predicate, `bmkp-TYPE-bookmark-p', which returns non-nil if
+;;      its bookmark argument has the given HANDLER.
+;;
+;;    * A command to show only bookmarks of TYPE in *Bookmark List*.
+;;      (Macro `bmkp-define-show-only-command' is used to do this.)
+;;
+;;    (Remember that to use any of the Bookmark+ macros directly
+;;    you'll need to load library `bookmark+-mac.el'.)
+;;
 ;;  * Extensive menus.
 ;;
 ;;     - In the `*Bookmark List*' display, a `mouse-3' popup menu has
 ;;  your choosing.  An annotation is thus metadata that is associated
 ;;  with a bookmark.  You can use it for any purpose you like.
 ;;
+;;  "Annotation" is arguably not the best name for what this is or
+;;  does.  But that's the name vanilla Emacs uses for it, so Bookmark+
+;;  does too.
+;;
 ;;  Command `bookmark-show-annotation' shows an annotation in
 ;;  read-only mode.  You can use `C-x C-q' in the annotation buffer to
 ;;  switch to edit mode (and back again).
 ;;
-;;  You can use command `bookmark-edit-annotation' or `bmkp-annotate'
-;;  anywhere to edit the annotation for a bookmark.  For
-;;  `bookmark-edit-annotation', you can choose among the bookmarks
-;;  that already have annotations.  With a prefix arg, you can choose
-;;  any bookmark (and so create an annotation).  Using `bmkp-annotate'
-;;  is the same as using `bookmark-edit-annotation' with a prefix arg.
+;;  You can use command `bookmark-edit-annotation' or
+;;  `bmkp-annotate-bookmark' anywhere to edit the annotation for a
+;;  bookmark.  For `bookmark-edit-annotation', you can choose among
+;;  the bookmarks that already have annotations.  With a prefix arg,
+;;  you can choose any bookmark (and so create an annotation).  Using
+;;  `bmkp-annotate-bookmark' is the same as using
+;;  `bookmark-edit-annotation' with a prefix arg.
+;;
+;;  The annotation edit buffer starts with some text that isn't saved
+;;  as part of the annotation.  It shows some editing instructions,
+;;  the user name, system name, and date+time of the current edit.
 ;;
 ;;  In the annotation edit buffer, make your changes and then use `C-c
-;;  C-c' to save the result.  Use `C-x C-k' if you do not want to save
+;;  C-c' to save the result.  Use `C-x C-k' if you don't want to save
 ;;  the changes.  You can also use `C-x C-q' and then `y' to confirm
 ;;  reverting the changes.
 ;;
 ;;  value then the buffer is in show (read-only) mode.
 ;;
 ;;  In the `*Bookmark List*' display, bookmarks with annotations are
-;;  marked by an `a' to the left of the bookmark name.  You can use `a
-;;  a' to show the annotation for the bookmark on the current line.
-;;  You can use `a e' to create an annotation or edit an existing
-;;  annotation for it.  You can use `a >' to edit annotations for all
-;;  of the marked bookmarks.  You can use `a A' to show a list of the
-;;  names and annotations of all annotated bookmarks.
+;;  marked by an `a' character to the left of the bookmark name.  You
+;;  can use `a a' to show the annotation for the bookmark on the
+;;  current line.  You can use `a e' to create an annotation or edit
+;;  an existing annotation for it.  You can use `a >' to edit
+;;  annotations for all of the marked bookmarks.  You can use `a A' to
+;;  show a list of the names and annotations of all annotated
+;;  bookmarks.
 ;;
 ;;  A bookmark annotation is stored as part of the bookmark itself.
 ;;  For this reason, you typically want to keep the text fairly short.
 ;;  annotation is Org mode, by default.  (To change the mode used,
 ;;  customize option `bmkp-annotation-modes-inherit-from'.)
 ;;
-;;  You can obtain the effect of using longer annotations, and some
-;;  other advantages as well, by using "external annotations".  These
-;;  are annotations that are short and serve only as pointers to
-;;  external files, URLs, or other bookmarks.
+;;  You can obtain the effect of using a longer annotation, and some
+;;  other advantages as well, by using an "annotation forward" in the
+;;  annotation text.  This is short text that serves only as a pointer
+;;  to an external file, URL, or another bookmark.
 ;;
-;;  Whenever you show the annotation of a bookmark (via `a' in the
+;;  Whenever you show the annotation of a bookmark (via `a a' in the
 ;;  `*Bookmark List*' display, `bookmark-show-annotation', or
-;;  `bookmark-automatically-show-annotations') and the annotation is
-;;  such a pointer, the effect is to visit the destination.
+;;  `bookmark-automatically-show-annotations') and the annotation
+;;  contains such a pointer (only one such is used), the effect is to
+;;  visit the pointer's destination.  That is, showing the annotation
+;;  goes to the forward destination, instead of showing the annotation
+;;  text stored with the bookmark.  (You can still see the latter, by
+;;  editing the annotation.)
 ;;
 ;;  So for example, you can use bookmarks to one or more Org files to
-;;  annotate (provide metadata for) one or more other bookmarks.
+;;  annotate (provide notes about, or metadata for) one or more other
+;;  bookmarks.  For example, set a bookmark at some place in an Info
+;;  manual, then write your own notes about that Info content in an
+;;  Org file, bookmark that Org-file destination, and use that as a
+;;  forward destination in your bookmark to that Info location.
 ;;
-;;  You create an external annotation for a bookmark by using one of
+;;  You create an annotation forward for a bookmark by using one of
 ;;  these forms as the annotation text.
 ;;
 ;;     bmkp-annot-url: "FILE"
 ;;     bmkp-annot-url: "URL"
 ;;     bmkp-annot-url: "BOOKMARK"
 ;;
-;;  * FILE is an absolute file name.  It is handled by
+;;  * FILE is an absolute file name.  Forwarding to it uses
 ;;    `find-file-other-window'.
-;;  * URL is a URL.  It is handled by `browse-url'.
+;;  * URL is a URL.  Forwarding to it uses `browse-url'.
 ;;  * BOOKMARK is the name of a bookmark in the current bookmark
-;;    alist.
+;;    alist.  Forwarding just jumps to it.
 ;;
 ;;  The double-quote characters are necessary here, so that you can
 ;;  include characters such as `SPC' in the name.  The text must be on
 ;;  the first line of the annotation (not counting the commented
 ;;  instruction lines).  It can be preceded only by whitespace.
 ;;
-;;  You can include other text in the annotation, after the
+;;  You can include other text in the annotation, after the external
 ;;  destination specification, and you can see or edit it when you
-;;  edit the annotation (e.g., using `C-u a' in buffer `*Bookmark
-;;  List*'), but it is ignored when the annotation is "shown" (e.g.,
-;;  using `a').
+;;  edit the annotation (e.g., `a e' in buffer `*Bookmark List*').
+;;  But it is ignored when the annotation is only shown (e.g., `a a').
 ;;
 ;;  In the `*Bookmark List*' display, `M-down' and `M-up' move the
 ;;  cursor down and up a line, respectively, but they also show the
 ;;  See Also: (@> "Bookmark+ Load Order and Option `bookmark-default-file'").
 ;;
 ;;
+;;(@* "Bookmark Files For Bookmarks with Specific Tags")
+;;  *** Bookmark Files For Bookmarks with Specific Tags ***
+;;
+;;  Bookmark+ provides various features for creating, manipulating,
+;;  and making use of bookmarks, but it generally doesn't provide
+;;  predefined ways to use such features together to accomplish a
+;;  particular goal.
+;;
+;;  This includes uses of features to organize bookmarks and their
+;;  destinations or results/effects.  But here's an example of using a
+;;  couple features out of the box to do that: create a bookmark file
+;;  for bookmarks with a given set of tags.
+;;
+;;  You can have multiple bookmark files, which you can use separately
+;;  or in combination.  If you use tags as a way of "categorizing"
+;;  bookmarks then you might create one or more bookmark files for
+;;  bookmarks tagged in particular ways.  For example, have a bookmark
+;;  file that contains only bookmarks tagged both `travel' and `2024'.
+;;
+;;  Loading that file alone gives you access to just those bookmarks,
+;;  simplifying bookmark commands (jump, tag, filter, edit,...).
+;;  Loading it together with another bookmark file, for example one
+;;  for bookmarks with another set of tags, gives you access to both
+;;  sets.
+;;
+;;  Here's one way to create a bookmark file for bookmarks tagged in a
+;;  particular way, using the bookmark-list display for a set of
+;;  bookmarks that includes those bookmarks but also others: mark the
+;;  bookmarks you want, then create a bookmark file from the marked
+;;  bookmarks.
+;;
+;;  1. Unmark all bookmarks, using `U'.
+;;
+;;  2. Mark the bookmarks that have the tags you're interested in.
+;;
+;;     You can do this using tags-command keys that mark according to
+;;     their tags.  These keys all begin with prefix key `T m'.  For
+;;     example, to mark bookmarks that are tagged with both `travel'
+;;     and `2024' you can use `T m *' and enter `travel' and `2024'
+;;     when prompted (end with an empty `RET').
+;;
+;;     Or if you want bookmarks with either `travel' or `2024' (or
+;;     both), use `T m +'.  Another way to do this is to use `T m %'
+;;     and enter the regexp `\(travel\|2024\)'.
+;;
+;;     (Marking and unmarking commands are also in menu `Bookmark+' >
+;;     `Mark'.)
+;;
+;;  3. Copy the marked bookmarks to a new bookmark file.
+;;
+;;     Use `Y > 0' to do this, entering the file name at the prompt.
+;;
+;;     Or if you want to move the bookmarks instead of copying them
+;;     (i.e., remove them from the current bookmark file), use `Y >
+;;     -'.
+;;
+;;     (Bookmark-file commands are also in menu `Bookmark+' >
+;;     `Bookmark File'.)
+;;
+;;  See Also: (@> "Tag Commands and Keys").
+;;
+;;
 ;;(@* "Bookmark-File Bookmarks")
 ;;  *** Bookmark-File Bookmarks ***
 ;;
 ;;    ----------------------------
 ;;
 ;;  (Bookmark+ does not use the sliding header line of vanilla Emacs
-;;  24+, which means that option `bookmark-bmenu-use-header-line' has
-;;  no effect.  You do not need to see `Bookmark' and `File' column
-;;  headers as you scroll.)
+;;  24-27, which means that option `bookmark-bmenu-use-header-line'
+;;  has no effect.  You do not need to see `Bookmark' and `File'
+;;  column headers as you scroll.  Bookmark+ also does not use
+;;  tabulated-list-mode, as vanilla Emacs 28+ does.  That mode is too
+;;  limited.)
 ;;
 ;;  Bookmarks are highlighted to indicate their type. You can mark and
 ;;  unmark bookmarks, show or hide bookmarks of particular types, and
 ;;  already tagged both `Java' and `ide'?
 ;;
 ;;  1. `T m * Java RET ide RET RET', to mark them.
-;;  2. `T > + Java IDE Projects RET RET, to tag them.
+;;  2. `T > + Java IDE Projects RET RET', to tag them.
 ;;
 ;;  How would you sort your bookmarks, to show all those tagged both
 ;;  `blue' and `moon' first?
 ;;      (let ((line  (line-number-at-pos position))
 ;;            (col   (save-excursion
 ;;                     (goto-char position) (current-column))))
-;;        (format "L%d,C%d %s" col line (buffer-name))))
+;;        (format "L%d,C%d %s" line col (buffer-name))))
 ;;
 ;;  To enable Bookmark+ to recognize such bookmarks as autonamed, you
 ;;  would then set `bmkp-autoname-format' to the format specification
index 5b2db9e5dd1924eb4c3bbbe22f599f294f39317c..dcc58b7cb183c1b48bec8e0b83821abfae4f5693 100644 (file)
@@ -1,14 +1,14 @@
-;;; bookmark+-key.el --- Bookmark+ key and menu bindings.
+;;; bookmark+-key.el --- Bookmark+ key and menu bindings.   -*- lexical-binding:t -*-
 ;;
 ;; Filename: bookmark+-key.el
 ;; Description: Bookmark+ key and menu bindings.
 ;; Author: Drew Adams
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 2010-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2010-2023, Drew Adams, all rights reserved.
 ;; Created: Fri Apr  1 15:34:50 2011 (-0700)
-;; Last-Updated: Fri Jan 14 12:49:18 2022 (-0800)
+;; Last-Updated: Mon Oct 23 13:52:32 2023 (-0700)
 ;;           By: dradams
-;;     Update #: 980
+;;     Update #: 991
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b-key.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, bookmark+, placeholders, annotations, search, info, url, eww, w3m, gnus
      (require 'bookmark+-mac)))         ; Require, so can load separately if not on `load-path'.
 ;; bmkp-menu-bar-make-toggle
 
-(eval-when-compile (require 'cl)) ;; case
+(eval-when-compile (unless (require 'cl-lib nil t)
+                     (require 'cl)
+                     (defalias 'cl-case 'case)))
 
 ;;;;;;;;;;;;;;;;;;;;;;;
 
 (defun bmkp-set-map-prefix-key (pref-keys-option keys)
   "Set prefix key option SYMBOL to key-sequence VALUE."
   (set pref-keys-option keys)
-  (let* ((g-map     (current-global-map))
-         (b-map     (cl-case pref-keys-option
-                      (bmkp-bookmark-map-prefix-keys          'bookmark-map)
-                      (bmkp-jump-map-prefix-keys              'bmkp-jump-map)
-                      (bmkp-jump-other-window-map-prefix-keys 'bmkp-jump-other-window-map))))
+  (let* ((g-map  (current-global-map))
+         (b-map  (cl-case pref-keys-option
+                   (bmkp-bookmark-map-prefix-keys          'bookmark-map)
+                   (bmkp-jump-map-prefix-keys              'bmkp-jump-map)
+                   (bmkp-jump-other-window-map-prefix-keys 'bmkp-jump-other-window-map))))
     (dolist (key  (where-is-internal b-map g-map))
       (define-key g-map key nil))
     (dolist (key  keys)
@@ -638,7 +640,8 @@ Put differently, return t iff the filtered alist is non-empty."
 
 (defun bmkp-exists-this-file/buffer-bookmarks-p (&optional alist)
   "Return t if there is a this-file or this-buffer bookmark in ALIST."
-  (bmkp-exists-bookmark-satisfying-p (if (buffer-file-name) #'bmkp-this-file-p #'bmkp-this-buffer-p)))
+  (bmkp-exists-bookmark-satisfying-p (if (buffer-file-name) #'bmkp-this-file-p #'bmkp-this-buffer-p)
+                                     alist))
 
 (defvar bmkp-bookmarks-here-menu-command-entries
   (list (list 'bmkp-next-bookmark-this-file/buffer-repeat
@@ -897,10 +900,9 @@ Menu for bookmarks that target this file or buffer.")
     :help "List the functions defined in `bmkp-bmenu-commands-file'"
     :enable (and bmkp-bmenu-commands-file  (file-readable-p bmkp-bmenu-commands-file)))
   'bmkp-choose-navlist-from-bookmark-list)
-
 (define-key-after menu-bar-bookmark-map [insert]
   '(menu-item "Insert Bookmark Contents..." bookmark-insert :help "Insert bookmarked text")
-  'bmkp-choose-navlist-from-bookmark-list)
+  'bmkp-list-defuns-in-commands-file)
 (define-key-after menu-bar-bookmark-map [locate]
   '(menu-item "Insert Bookmark Location..." bookmark-locate ; Alias for `bookmark-insert-location'.
     :help "Insert a bookmark's file or buffer name")
@@ -933,6 +935,14 @@ Menu for bookmarks that target this file or buffer.")
     :help "Empty an existing bookmark file or create a new, empty bookmark file")
   'load)
 
+(define-key-after menu-bar-bookmark-map [separator-4] '("--") ;-------------------------------------
+                  'bmkp-empty-file)
+(define-key-after menu-bar-bookmark-map [bmkp-send-bug-report]
+  '(menu-item "Send Bug Report" bmkp-send-bug-report
+    :help "Send an email reporting a Bookmark+ bug")
+  'separator-4)
+
+
 
 ;; `bmkp-annotate-menu' of vanilla `Bookmarks' menu: `Annotate'
 
index 0637faf8e3905c48179dbb6dfeee7bdccdcbca58..a30a89b6c97b4a4074d662d73a99f4d58a417858 100644 (file)
@@ -1,14 +1,14 @@
-;;; bookmark+-lit.el --- Bookmark highlighting for Bookmark+.
+;;; bookmark+-lit.el --- Bookmark highlighting for Bookmark+.   -*- lexical-binding:t -*-
 ;;
 ;; Filename: bookmark+-lit.el
 ;; Description: Bookmark highlighting for Bookmark+.
 ;; Author: Drew Adams
 ;; Maintainer: Drew Adams
-;; Copyright (C) 2010-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2010-2023, Drew Adams, all rights reserved.
 ;; Created: Wed Jun 23 07:49:32 2010 (-0700)
-;; Last-Updated: Fri Jan 14 12:50:59 2022 (-0800)
+;; Last-Updated: Thu Oct 26 15:09:05 2023 (-0700)
 ;;           By: dradams
-;;     Update #: 1005
+;;     Update #: 1091
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b-lit.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, highlighting, bookmark+
 ;;
 ;; Features that might be required by this library:
 ;;
-;;   `bookmark', `pp', `pp+'.
+;;   `backquote', `bookmark', `bookmark+-1', `button', `bytecomp',
+;;   `cconv', `cl-lib', `col-highlight', `crosshairs', `font-lock',
+;;   `font-lock+', `help-mode', `hl-line', `hl-line+', `kmacro',
+;;   `macroexp', `pp', `pp+', `replace', `syntax', `text-mode',
+;;   `thingatpt', `thingatpt+', `vline'.
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 ;;
 ;;    `bmkp-bmenu-unlight-marked', `bmkp-bookmarks-lighted-at-point',
 ;;    `bmkp-cycle-lighted-this-buffer',
 ;;    `bmkp-cycle-lighted-this-buffer-other-window',
-;;    `bmkp-describe-bookmark-lighted-here',
+;;    `bmkp-describe-bookmark-lighted-on-this-line',
 ;;    `bmkp-light-autonamed-this-buffer', `bmkp-light-bookmark',
 ;;    `bmkp-light-bookmark-this-buffer', `bmkp-light-bookmarks',
 ;;    `bmkp-light-bookmarks-in-region',
 ;;    `bmkp-light-navlist-bookmarks',
 ;;    `bmkp-light-non-autonamed-this-buffer',
-;;    `bmkp-light-this-buffer', `bmkp-lighted-jump',
-;;    `bmkp-lighted-jump-other-window', `bmkp-lighted-jump-to-list',
+;;    `bmkp-light-this-buffer', `bmkp-lighted-here-jump-to-list',
+;;    `bmkp-lighted-jump', `bmkp-lighted-jump-other-window',
 ;;    `bmkp-next-lighted-this-buffer',
 ;;    `bmkp-next-lighted-this-buffer-repeat',
 ;;    `bmkp-previous-lighted-this-buffer',
 ;;    `bmkp-toggle-auto-light-when-jump',
 ;;    `bmkp-toggle-auto-light-when-set',
 ;;    `bmkp-unlight-autonamed-this-buffer', `bmkp-unlight-bookmark',
-;;    `bmkp-unlight-bookmark-here',
+;;    `bmkp-unlight-bookmark-on-this-line',
 ;;    `bmkp-unlight-bookmark-this-buffer', `bmkp-unlight-bookmarks',
 ;;    `bmkp-unlight-non-autonamed-this-buffer',
 ;;    `bmkp-unlight-this-buffer'.
 ;;
 ;;  Non-interactive functions defined here:
 ;;
-;;    `bmkp--pop-to-buffer-same-window',
 ;;    `bmkp-a-bookmark-lighted-at-pos',
 ;;    `bmkp-a-bookmark-lighted-on-this-line',
 ;;    `bmkp-bookmark-data-from-record',
 ;;    `bmkp-bookmark-name-from-record', `bmkp-bookmark-overlay-p',
-;;    `bmkp-default-lighted', `bmkp-fringe-string' (Emacs 22+),
-;;    `bmkp-get-lighting', `bmkp-lighted-p', `bmkp-light-face',
-;;    `bmkp-light-style', `bmkp-light-style-choices',
-;;    `bmkp-light-when', `bmkp-lighted-alist-only',
-;;    `bmkp-lighting-attribute', `bmkp-lighting-face',
-;;    `bmkp-lighting-style', `bmkp-lighting-when',
-;;    `bmkp-make/move-fringe' (Emacs 22+),
-;;    `bmkp-make/move-overlay-of-style', `bmkp-number-lighted',
-;;    `bmkp-overlay-of-bookmark', `bmkp-read-set-lighting-args',
+;;    `bmkp-choose-bookmark-lighted-at-point', `bmkp-default-lighted',
+;;    `bmkp-fringe-string' (Emacs 22+), `bmkp-get-lighting',
+;;    `bmkp-lighted-p', `bmkp-light-face', `bmkp-light-style',
+;;    `bmkp-light-style-choices', `bmkp-light-when',
+;;    `bmkp-lighted-alist-only', `bmkp-lighting-attribute',
+;;    `bmkp-lighting-face', `bmkp-lighting-style',
+;;    `bmkp-lighting-when', `bmkp-make/move-fringe' (Emacs 22+),
+;;    `bmkp-make/move-overlay-of-style', `bmkp-make-obsolete',
+;;    `bmkp-number-lighted', `bmkp-overlay-of-bookmark',
+;;    `bmkp--pop-to-buffer-same-window',
+;;    `bmkp-read-set-lighting-args',
 ;;    `bmkp-set-lighting-for-bookmarks',
 ;;    `bmkp-this-buffer-lighted-alist-only',
 ;;    `bookmark-name-from-full-record', `bookmark-name-from-record'.
 
 ;;;;;;;;;;;;;;;;;;;;;;;
 
-(eval-when-compile (require 'cl)) ;; case (plus, for Emacs 20: push)
+(eval-when-compile (unless (require 'cl-lib nil t)
+                     (require 'cl)
+                     (defalias 'cl-case 'case)))
 
 (require 'bookmark)
 ;; bookmark-alist, bookmark-bmenu-bookmark, bookmark-completing-read, bmkp-get-bookmark,
 ;; bookmark-name-from-full-record, bookmark-name-from-record, bookmark-prop-get, bookmark-prop-set
 
 
+;; Just repeat definition of `bmkp-make-obsolete', to make requires less complicated.
+;;   (require 'bookmark+-1) ;; bmkp-make-obsolete
+;;
+;; Do this up front.  Emacs 23 made incompatible change to require all args.
+;;
+(defun bmkp-make-obsolete (obsolete-name current-name &optional when)
+  "Same as `make-obsolete', but usable also for Emacs prior to Emacs 23."
+  (if (< emacs-major-version 23)
+      (make-obsolete obsolete-name current-name)
+    (make-obsolete obsolete-name current-name when)))
+
+
 ;; Some general Renamings.
 ;;
 ;; 1. Fix incompatibility introduced by gratuitous Emacs name change.
@@ -467,8 +486,9 @@ To prevent showing any tooltip you can use a function, such as
   (bmkp-light-bookmark (bookmark-bmenu-bookmark) nil nil 'MSG))
 
 ;;;###autoload (autoload 'bmkp-bmenu-light-marked "bookmark+")
-(defun bmkp-bmenu-light-marked (&optional parg msgp) ; `H > H' in bookmark list
-  "Highlight the marked bookmarks."
+(defun bmkp-bmenu-light-marked (&optional msgp) ; `H > H' in bookmark list
+  "Highlight the marked bookmarks.
+When called from Lisp, non-nil MSGP means echo status messages."
   (interactive (list 'MSG))
   (bmkp-bmenu-barf-if-not-in-menu-list)
   (when msgp (message "Highlighting marked bookmarks..."))
@@ -485,8 +505,9 @@ To prevent showing any tooltip you can use a function, such as
   (bmkp-unlight-bookmark (bookmark-bmenu-bookmark) 'NOERROR))
 
 ;;;###autoload (autoload 'bmkp-bmenu-unlight-marked "bookmark+")
-(defun bmkp-bmenu-unlight-marked (&optional parg msgp) ; `H > U' in bookmark list
-  "Unhighlight the marked bookmarks."
+(defun bmkp-bmenu-unlight-marked (&optional msgp) ; `H > U' in bookmark list
+  "Unhighlight the marked bookmarks.
+When called from Lisp, non-nil MSGP means echo status messages."
   (interactive (list 'MSG))
   (bmkp-bmenu-barf-if-not-in-menu-list)
   (when msgp (message "Unhighlighting marked bookmarks..."))
@@ -499,7 +520,10 @@ To prevent showing any tooltip you can use a function, such as
 (defun bmkp-bmenu-set-lighting (style face when &optional msgp) ; `H +' in bookmark list
   "Set the `lighting' entry for this line's bookmark.
 You are prompted for the highlight STYLE, FACE, and condition (WHEN)
-that make up the property-list value of the `lighting' entry."
+that make up the property-list value of the `lighting' entry.
+
+When called from Lisp, the arguments are passed to
+`bmkp-set-lighting-for-bookmark' for the current line's bookmark."
   (interactive
    (let* ((bmk        (bookmark-bmenu-bookmark))
           (bmk-style  (bmkp-lighting-style bmk))
@@ -511,12 +535,16 @@ that make up the property-list value of the `lighting' entry."
               (and bmk-when   (format "%S" bmk-when)))
              '(MSG))))
   (bmkp-bmenu-barf-if-not-in-menu-list)
-  (bmkp-set-lighting-for-bookmark (bookmark-bmenu-bookmark) style face when 'MSG))
+  (bmkp-set-lighting-for-bookmark (bookmark-bmenu-bookmark) style face when msgp))
 
 ;;;###autoload (autoload 'bmkp-bmenu-set-lighting-for-marked "bookmark+")
 (defun bmkp-bmenu-set-lighting-for-marked (style face when &optional msgp) ; `H > +' in bookmark list
   "Set the `lighting' entry for the marked bookmarks.
-You are prompted for the highlight STYLE, FACE, and condition (WHEN)."
+You are prompted for the highlight STYLE, FACE, and condition (WHEN)
+that make up the property-list value of the `lighting' entry.
+
+When called from Lisp, the args are passed to `bookmark-prop-set' for
+the current line's bookmark."
   (interactive (append (bmkp-read-set-lighting-args) '(MSG)))
   (bmkp-bmenu-barf-if-not-in-menu-list)
   (when msgp (message "Setting highlighting..."))
@@ -537,12 +565,13 @@ You are prompted for the highlight STYLE, FACE, and condition (WHEN)."
 ;;  *** General Highlight Commands ***
 
 ;;;###autoload (autoload 'bmkp-bookmarks-lighted-at-point "bookmark+")
-(defun bmkp-bookmarks-lighted-at-point (&optional position fullp msgp) ; `C-x p ='
+(defun bmkp-bookmarks-lighted-at-point (&optional position fullp msgp) ; `C-x x ='
   "Return a list of the bookmarks highlighted at point.
 Include only those in the current bookmark list (`bookmark-alist').
 With no prefix arg, return the bookmark names.
 With a prefix arg, return the full bookmark data.
 Interactively, display the info.
+
 Non-interactively:
  Use the bookmarks at optional arg POSITION (default: point).
  Optional arg FULLP means return full bookmark data.
@@ -565,7 +594,9 @@ Non-interactively:
 (defun bmkp-toggle-auto-light-when-jump (&optional msgp) ; Not bound.
   "Toggle automatic bookmark highlighting when a bookmark is jumped to.
 Set option `bmkp-auto-light-when-jump' to nil if non-nil, and to its
-last non-nil value if nil."
+last non-nil value if nil.
+
+Non-interactively, non-nil MSGP means echo a status message."
   (interactive "p")
   (when (and bmkp-auto-light-when-jump  bmkp-last-auto-light-when-jump) ; Compensate for wrong default
     (setq bmkp-last-auto-light-when-jump  nil))
@@ -599,23 +630,41 @@ See `bmkp-lighted-jump'."
            current-prefix-arg)))
   (bmkp-jump-1 bookmark-name 'bmkp-select-buffer-other-window flip-use-region-p))
 
-;;;###autoload (autoload 'bmkp-lighted-jump-to-list "bookmark+")
-(defun bmkp-lighted-jump-to-list (bookmark &optional position msgp) ; Not bound.
-  "Jump to location in `*Bookmark List*' for a lighted bookmark at point.
-You are prompted for BOOKMARK (a bookmark name).
-Completion candidates are the lighted bookmarks at point."
-  (interactive (let* ((bmks    (bmkp-bookmarks-lighted-at-point (point) nil 'MSG))
-                      (IGNORE  (unless bmks (error "No highlighted bookmarks at point")))
-                      (bmk   (bookmark-completing-read "Bookmark" (car bmks) bmks)))
-                 (list bmk (point) t)))
+;; Keep the alias for a while, in case someone has it referenced in a state file.
+(defalias 'bmkp-lighted-jump-to-list 'bmkp-lighted-here-jump-to-list)
+(bmkp-make-obsolete 'bmkp-lighted-jump-to-list 'bmkp-lighted-here-jump-to-list "2022-11-12")
+
+;;;###autoload (autoload 'bmkp-lighted-here-jump-to-list "bookmark+")
+(defun bmkp-lighted-here-jump-to-list (bookmark) ; Not bound.
+  "Jump to location in `*Bookmark List*' for a lighted BOOKMARK at point.
+If there's more than one such bookmark then you're prompted for the
+bookmark name.  Completion candidates are the names of the lighted
+bookmarks at point."
+  (interactive (list (bmkp-choose-bookmark-lighted-at-point)))
   (pop-to-buffer (get-buffer-create bmkp-bmenu-buffer))
   (bookmark-bmenu-list)
   (bmkp-bmenu-goto-bookmark-named (setq bmkp-last-bmenu-bookmark  bookmark)))
 
+(defun bmkp-choose-bookmark-lighted-at-point (&optional position noerrorp)
+  "Return the name of a bookmark lighted at POSITION (default: point).
+If there is more than one such, prompt user to choose one.
+Optional arg POSITION is a buffer position to use instead of point.
+
+Raise an error if there is no highlighted bookmark present, unless
+optional arg NOERRORP is non-nil, in which case return nil."
+  (let ((lbmks  (bmkp-bookmarks-lighted-at-point position)))
+    (unless (or lbmks  noerrorp) (error "No highlighted bookmark %s" (if position "" "at point")))
+    (if (cdr lbmks)
+        (bookmark-completing-read "Bookmark" (car lbmks) lbmks)
+      (car lbmks))))
+
 ;;;###autoload (autoload 'bmkp-unlight-bookmark "bookmark+")
 (defun bmkp-unlight-bookmark (bookmark &optional noerrorp msgp) ; Not bound
   "Unhighlight BOOKMARK.
-BOOKMARK is a bookmark name or a bookmark record."
+BOOKMARK is a bookmark name or a bookmark record.
+When called from Lisp:
+ Non-nil NOERRORP means don't raise an error if not highlighted.
+ NOn-nil MSGP means echo a status message."
   (interactive
    (let ((lighted-bmks  (bmkp-lighted-alist-only)))
      (unless lighted-bmks (error "No highlighted bookmarks"))
@@ -631,20 +680,37 @@ BOOKMARK is a bookmark name or a bookmark record."
         (when (eq bmk (overlay-get ov 'bookmark))  (delete-overlay ov)))) ; Check full bookmark, not name.
     (when msgp (message "UNhighlighted bookmark `%s'" bmk-name))))
 
-;;;###autoload (autoload 'bmkp-unlight-bookmark-here "bookmark+")
-(defun bmkp-unlight-bookmark-here (&optional noerrorp msgp) ; `C-x p C-u'
-  "Unhighlight a bookmark at point or the same line (in that order)."
+;; Keep the alias for a while, in case someone has it referenced in a state file.
+(defalias 'bmkp-unlight-bookmark-here 'bmkp-unlight-bookmark-on-this-line)
+(bmkp-make-obsolete 'bmkp-unlight-bookmark-here 'bmkp-unlight-bookmark-on-this-line "2022-11-12")
+
+;;;###autoload (autoload 'bmkp-unlight-bookmark-on-this-line "bookmark+")
+(defun bmkp-unlight-bookmark-on-this-line (&optional noerrorp msgp) ; `C-x x C-u'
+  "Unhighlight a highlighted bookmark on this line, preferably at point.
+Other than preferring a bookmark at point, if more than one
+highlighted bookmark is present then which one gets unhighlighted is
+undefined.  When multiple highlighted bookmarks are present you might
+want to use `\\[bmkp-bookmarks-lighted-at-point]' to see the names of all of the bookmarks at
+point.
+
+When called from Lisp:
+ Non-nil NOERRORP means don't raise an error if not highlighted.
+ NOn-nil MSGP means echo a status message."
   (interactive (list nil 'MSG))
   (let ((bmk  (or (bmkp-a-bookmark-lighted-at-pos)  (bmkp-a-bookmark-lighted-on-this-line))))
     (unless bmk (error "No highlighted bookmark on this line"))
     (bmkp-unlight-bookmark bmk noerrorp msgp)))
 
 ;;;###autoload (autoload 'bmkp-unlight-bookmark-this-buffer "bookmark+")
-(defun bmkp-unlight-bookmark-this-buffer (bookmark &optional noerrorp msgp) ; `C-x p u'
+(defun bmkp-unlight-bookmark-this-buffer (bookmark &optional noerrorp msgp) ; `C-x x u'
   "Unhighlight a BOOKMARK in this buffer.
 BOOKMARK is a bookmark name or a bookmark record.
 With a prefix arg, choose from all lighted bookmarks, not just those
-in this buffer."
+in this buffer.
+
+When called from Lisp:
+ Non-nil NOERRORP means don't raise an error if not highlighted.
+ NOn-nil MSGP means echo a status message."
   (interactive
    (let ((lighted-bmks  (if current-prefix-arg
                             (bmkp-lighted-alist-only)
@@ -662,21 +728,28 @@ in this buffer."
   (bmkp-unlight-bookmark bookmark noerrorp msgp))
 
 ;;;###autoload (autoload 'bmkp-unlight-bookmarks "bookmark+")
-(defun bmkp-unlight-bookmarks (&optional overlays-symbols this-buffer-p msgp) ; `C-x p U'
+(defun bmkp-unlight-bookmarks (&optional overlays-symbols this-buffer-p msgp) ; `C-x x U'
   "Unhighlight lighted bookmarks.
 A prefix argument determines which bookmarks to unhighlight:
  none    - Current buffer, all lighted bookmarks.
  >= 0    - Current buffer, only autonamed lighted bookmarks.
  < 0     - Current buffer, only non-autonamed lighted bookmarks.
- C-u     - All buffers (all lighted bookmarks)."
+ C-u     - All buffers (all lighted bookmarks).
+
+Non-nil optional args used when called from Lisp:
+ OVERLAYS-SYMBOLS is a list whose possible elements are
+  `bmkp-autonamed-overlays' and `bmkp-non-autonamed-overlays'.
+  These name the kinds of highlighting overlays to delete.
+  An empty list is the same as a list with both symbols.
+ THIS-BUFFER-P means delete only overlays in this buffer.
+ MSGP means echo an action summary."
   (interactive (list (cond ((or (not current-prefix-arg)  (consp current-prefix-arg))
                             '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays))
                            ((natnump current-prefix-arg) '(bmkp-autonamed-overlays))
                            (current-prefix-arg           '(bmkp-non-autonamed-overlays)))
                      (or (not current-prefix-arg)  (atom current-prefix-arg))
                      'MSG))
-  (unless overlays-symbols
-    (setq overlays-symbols  '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays)))
+  (unless overlays-symbols (setq overlays-symbols  '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays)))
   (let ((count           0)
         (count-auto      0)
         (count-non-auto  0)
@@ -700,7 +773,9 @@ A prefix argument determines which bookmarks to unhighlight:
 (defun bmkp-unlight-autonamed-this-buffer (&optional everywherep) ; Not bound
   "Unhighlight autonamed bookmarks.
 No prefix arg: unhighlight them only in the current buffer.
-Prefix arg, unhighlight them everywhere."
+Prefix arg, unhighlight them everywhere.
+
+Non-interactively, non-nil EVERYWHEREP means unhighlight everywhere."
   (interactive "P")
   (bmkp-unlight-bookmarks '(bmkp-autonamed-overlays) (not everywherep)))
 
@@ -708,7 +783,9 @@ Prefix arg, unhighlight them everywhere."
 (defun bmkp-unlight-non-autonamed-this-buffer (&optional everywherep) ; Not bound
   "Unhighlight non-autonamed bookmarks.
 No prefix arg: unhighlight them only in the current buffer.
-Prefix arg, unhighlight them everywhere."
+Prefix arg, unhighlight them everywhere.
+
+Non-interactively, non-nil EVERYWHEREP means unhighlight everywhere."
   (interactive "P")
   (bmkp-unlight-bookmarks '(bmkp-non-autonamed-overlays) (not everywherep)))
 
@@ -722,7 +799,9 @@ Prefix arg, unhighlight them everywhere."
 (defun bmkp-toggle-auto-light-when-set (&optional msgp) ; Not bound.
   "Toggle automatic bookmark highlighting when a bookmark is set.
 Set option `bmkp-auto-light-when-set' to nil if non-nil, and to its
-last non-nil value if nil."
+last non-nil value if nil.
+
+When called from Lisp, non-nil MSGP means echo the new status."
   (interactive "p")
   (when (and bmkp-auto-light-when-set  bmkp-last-auto-light-when-set) ; Compensate for wrong default
     (setq bmkp-last-auto-light-when-set  nil))
@@ -742,11 +821,14 @@ condition (WHEN) that make up the property-list value of the
 
 With a prefix argument, do not highlight now.
 
+If there's a highlighted bookmark at point or on its line, then that's
+the default for BOOKMARK-NAME - use `\\<minibuffer-local-map>\\[next-history-element]' to retrieve it.
+
 Non-interactively:
-STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
-  properties, or nil if no such property.
-Non-nil MSGP means display a highlighting progress message.
-Non-nil LIGHT-NOW-P means apply the highlighting now."
+ STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
+   properties, or nil if no such property.
+ Non-nil MSGP means display a highlighting progress message.
+ Non-nil LIGHT-NOW-P means apply the highlighting now."
   (interactive
    (let* ((bmk        (bookmark-completing-read "Highlight bookmark"
                                                 (or (bmkp-default-lighted)  (bmkp-default-bookmark-name))))
@@ -776,10 +858,10 @@ You are prompted for the highlight STYLE, FACE, and condition (WHEN).
 With a prefix argument, do not highlight now.
 
 Non-interactively:
-STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
-  properties, or nil if no such property.
-Non-nil MSGP means display a highlighting progress message.
-Non-nil LIGHT-NOW-P means apply the highlighting now."
+ STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
+   properties, or nil if no such property.
+ Non-nil MSGP means display a highlighting progress message.
+ Non-nil LIGHT-NOW-P means apply the highlighting now."
   (interactive (append (list (bmkp-completing-read-buffer-name))
                        (bmkp-read-set-lighting-args)
                        (list 'MSGP (not current-prefix-arg))))
@@ -794,19 +876,20 @@ You are prompted for the highlight STYLE, FACE, and condition (WHEN).
 With a prefix argument, do not highlight now.
 
 Non-interactively:
-STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
-  properties, or nil if no such property.
-Non-nil MSGP means display a highlighting progress message.
-Non-nil LIGHT-NOW-P means apply the highlighting now."
+ STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
+   properties, or nil if no such property.
+ Non-nil MSGP means display a highlighting progress message.
+ Non-nil LIGHT-NOW-P means apply the highlighting now."
   (interactive (append (bmkp-read-set-lighting-args) (list 'MSGP (not current-prefix-arg))))
   (bmkp-set-lighting-for-bookmarks (bmkp-this-buffer-alist-only) style face when msgp light-now-p))
 
 (defun bmkp-set-lighting-for-bookmarks (alist style face when &optional msgp light-now-p)
   "Set the `lighting' entry for each of the bookmarks in ALIST.
-STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
-  properties, or nil if no such property.
-Non-nil MSGP means display a highlighting progress message.
-Non-nil LIGHT-NOW-P means apply the highlighting now."
+Non-interactively:
+ STYLE, FACE, and WHEN are as for a bookmark's `lighting' entry
+   properties, or nil if no such property.
+ Non-nil MSGP means display a highlighting progress message.
+ Non-nil LIGHT-NOW-P means apply the highlighting now."
   (when msgp (message "Setting highlighting..."))
   (dolist (bmk  alist) (bmkp-set-lighting-for-bookmark bmk style face when)) ; No MSGP arg here.
   (when msgp (message "Setting highlighting...done"))
@@ -874,8 +957,7 @@ Non-interactively:
                  ;; See note in comments of `bmkp-light-bookmarks' - same considerations here.
                  ;; (let ((bmkp-jump-display-function  nil)) (bookmark-handle-bookmark bmk))
                  ;;
-                 (with-current-buffer (or (and buf  (get-buffer buf))
-                                          (current-buffer))
+                 (with-current-buffer (or (and buf  (get-buffer buf))  (current-buffer))
 
                    ;; POINTP is non-nil when `bmkp-light-bookmark' is called from
                    ;; `bookmark--jump-via'.
@@ -884,9 +966,7 @@ Non-interactively:
                    (when (and pos  (< pos (point-max)))
                      (let ((ov  (bmkp-make/move-overlay-of-style styl pos autonamedp bmk)))
                        (when ov         ; nil means `none' style.
-                         (let ((ovs  (if autonamedp
-                                         'bmkp-autonamed-overlays
-                                       'bmkp-non-autonamed-overlays)))
+                         (let ((ovs  (if autonamedp 'bmkp-autonamed-overlays 'bmkp-non-autonamed-overlays)))
                            (push ov (symbol-value ovs)))
                          (when (and (not (bmkp-lighted-p bmk))
                                     (> (setq nb-lit  (1+ nb-lit)) bmkp-light-threshold))
@@ -908,13 +988,13 @@ Non-interactively:
                (when msgp (message "Bookmark's condition canceled highlighting"))))))))
 
 ;;;###autoload (autoload 'bmkp-light-bookmark-this-buffer "bookmark+")
-(defun bmkp-light-bookmark-this-buffer (bookmark &optional style face msgp) ; `C-x p h'
+(defun bmkp-light-bookmark-this-buffer (bookmark &optional style face msgp) ; `C-x x h'
   "Highlight a BOOKMARK in the current buffer.
 With a prefix arg you are prompted for the style and/or face to use:
  Plain prefix arg (`C-u'): prompt for both style and face.
  Numeric non-negative arg: prompt for face.
  Numeric negative arg: prompt for style.
-See `bmkp-light-bookmark' for argument descriptions."
+See `bmkp-light-bookmark' for arguments when called from Lisp."
   (interactive
    (let* ((bmk  (bookmark-completing-read "Highlight bookmark"
                                           nil
@@ -941,7 +1021,7 @@ See `bmkp-light-bookmark' for argument descriptions."
   (bmkp-light-bookmark bookmark style face msgp))
 
 ;;;###autoload (autoload 'bmkp-light-bookmarks "bookmark+")
-(defun bmkp-light-bookmarks (&optional alist overlays-symbols msgp) ; `C-x p H'
+(defun bmkp-light-bookmarks (alist &optional overlays-symbols msgp) ; `C-x x H'
   "Highlight bookmarks.
 A prefix argument determines which bookmarks to highlight:
  none    - Current buffer, all bookmarks.
@@ -952,7 +1032,13 @@ A prefix argument determines which bookmarks to highlight:
  C-u C-u - Navlist (all bookmarks).
 
 Non-interactively, ALIST is the alist of bookmarks to highlight.
-It must be provided: if nil then do not highlight any bookmarks."
+ It must be provided: if nil then do not highlight any bookmarks.
+Non-nil optional args used when called from Lisp:
+ OVERLAYS-SYMBOLS is a list whose possible elements are
+  `bmkp-autonamed-overlays' and `bmkp-non-autonamed-overlays'.
+  These name the kinds of highlighting overlays to highlight.
+  An empty list is the same as a list with both symbols.
+ MSGP means echo an action summary."
   (interactive
    (list (cond ((not current-prefix-arg)     (bmkp-this-buffer-alist-only))
                ((consp current-prefix-arg)   (if (> (prefix-numeric-value current-prefix-arg) 4)
@@ -971,8 +1057,7 @@ It must be provided: if nil then do not highlight any bookmarks."
                ((natnump current-prefix-arg) '(bmkp-autonamed-overlays))
                (current-prefix-arg           '(bmkp-non-autonamed-overlays)))
          'MSG))
-  (unless overlays-symbols
-    (setq overlays-symbols  '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays)))
+  (unless overlays-symbols (setq overlays-symbols  '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays)))
   (let ((bmkp-use-region  nil)          ; Inhibit region handling.
         (total            0)
         (nb-auto          0)
@@ -1047,7 +1132,9 @@ It must be provided: if nil then do not highlight any bookmarks."
   "Highlight bookmarks in the navigation list.
 No prefix arg:   all bookmarks.
 Prefix arg >= 0: autonamed bookmarks only.
-Prefix arg < 0:  non-autonamed bookmarks only."
+Prefix arg < 0:  non-autonamed bookmarks only.
+
+\(See `bmkp-light-bookmarks' for arguments when called from Lisp.)"
   (interactive
    (list (cond ((not current-prefix-arg) '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays))
                ((natnump (prefix-numeric-value current-prefix-arg)) '(bmkp-autonamed-overlays))
@@ -1060,7 +1147,9 @@ Prefix arg < 0:  non-autonamed bookmarks only."
   "Highlight bookmarks in the current buffer.
 No prefix arg:   all bookmarks.
 Prefix arg >= 0: autonamed bookmarks only.
-Prefix arg < 0:  non-autonamed bookmarks only."
+Prefix arg < 0:  non-autonamed bookmarks only.
+
+\(See `bmkp-light-bookmarks' for arguments when called from Lisp.)"
   (interactive
    (list (cond ((not current-prefix-arg) '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays))
                ((natnump (prefix-numeric-value current-prefix-arg)) '(bmkp-autonamed-overlays))
@@ -1073,7 +1162,9 @@ Prefix arg < 0:  non-autonamed bookmarks only."
   "Highlight bookmarks in the region.
 No prefix arg:   all bookmarks.
 Prefix arg >= 0: autonamed bookmarks only.
-Prefix arg < 0:  non-autonamed bookmarks only."
+Prefix arg < 0:  non-autonamed bookmarks only.
+
+\(See `bmkp-light-bookmarks' for arguments when called from Lisp.)"
   (interactive
    (list (region-beginning)
          (region-end)
@@ -1082,19 +1173,21 @@ Prefix arg < 0:  non-autonamed bookmarks only."
                (current-prefix-arg '(bmkp-non-autonamed-overlays)))
          'MSG))
   (bmkp-light-bookmarks (bmkp-remove-if-not (lambda (bmk) (let ((pos  (bookmark-get-position bmk)))
-                                                            (and (>= pos start)  (<= pos end))))
+                                                       (and (>= pos start)  (<= pos end))))
                                             (bmkp-this-buffer-alist-only))
                         overlays-symbols msgp))
 
 ;;;###autoload (autoload 'bmkp-light-autonamed-this-buffer "bookmark+")
 (defun bmkp-light-autonamed-this-buffer (&optional msgp) ; Not bound
-  "Highlight all autonamed bookmarks."
+  "Highlight all autonamed bookmarks.
+When called from Lisp non-nil MSGP is passed to `bmkp-light-bookmarks'."
   (interactive (list 'MSG))
   (bmkp-light-bookmarks (bmkp-autonamed-this-buffer-alist-only) '(bmkp-autonamed-overlays) msgp))
 
 ;;;###autoload (autoload 'bmkp-light-non-autonamed-this-buffer "bookmark+")
 (defun bmkp-light-non-autonamed-this-buffer (&optional msgp) ; Not bound
-  "Highlight all non-autonamed bookmarks."
+  "Highlight all non-autonamed bookmarks.
+When called from Lisp non-nil MSGP is passed to `bmkp-light-bookmarks'."
   (interactive (list 'MSG))
   (bmkp-light-bookmarks (bmkp-remove-if #'bmkp-autonamed-bookmark-p (bmkp-this-buffer-alist-only))
                         '(bmkp-non-autonamed-overlays) msgp))
@@ -1118,7 +1211,7 @@ Then you can cycle the bookmarks using `bookmark-cycle'
 In Lisp code:
  Non-nil OTHER-WINDOW means jump to the bookmark in another window.
  Non-nil STARTOVERP means reset `bmkp-current-nav-bookmark' to the
- first bookmark in the navlist."
+  first bookmark in the navlist."
   (interactive (let ((startovr  (consp current-prefix-arg)))
                  (list (if startovr 1 (prefix-numeric-value current-prefix-arg)) nil startovr)))
   (bookmark-maybe-load-default-file)
@@ -1163,35 +1256,40 @@ See `bmkp-next-lighted-this-buffer'."
   (bmkp-cycle-lighted-this-buffer (- n) nil startoverp))
 
 ;;;###autoload (autoload 'bmkp-next-lighted-this-buffer-repeat "bookmark+")
-(defun bmkp-next-lighted-this-buffer-repeat (arg) ; `C-x p C-down'
-  "Jump to the Nth next highlighted bookmark in the current buffer.
-This is a repeatable version of `bmkp-next-bookmark-this-buffer'.
-N defaults to 1, meaning the next one.
-Plain `C-u' means start over at the first one (and no repeat)."
-  (interactive "P")
+(defun bmkp-next-lighted-this-buffer-repeat () ; `C-x x C-down'
+  "Jump to the next highlighted bookmark in the current buffer.
+This is a repeatable version of `bmkp-next-bookmark-this-buffer'."
+  (interactive)
   (require 'repeat)
   (bmkp-repeat-command 'bmkp-next-lighted-this-buffer))
 
 ;;;###autoload (autoload 'bmkp-previous-lighted-this-buffer-repeat "bookmark+")
-(defun bmkp-previous-lighted-this-buffer-repeat (arg) ; `C-x p C-up'
-  "Jump to the Nth previous highlighted bookmark in the current buffer.
+(defun bmkp-previous-lighted-this-buffer-repeat () ; `C-x x C-up'
+  "Jump to the previous highlighted bookmark in the current buffer.
 See `bmkp-next-lighted-this-buffer-repeat'."
-  (interactive "P")
+  (interactive)
   (require 'repeat)
   (bmkp-repeat-command 'bmkp-previous-lighted-this-buffer))
 
+;; Keep the alias for a while, in case someone has it referenced in a state file.
+(defalias 'bmkp-describe-bookmark-lighted-here 'bmkp-describe-bookmark-lighted-on-this-line)
+(bmkp-make-obsolete 'bmkp-describe-bookmark-lighted-here 'bmkp-describe-bookmark-lighted-on-this-line
+                    "2022-11-12")
+
 ;;;###autoload (autoload 'bmkp-describe-bookmark-lighted-here "bookmark+")
-(defun bmkp-describe-bookmark-lighted-here (&optional position defn) ; `C-x p ?'
-  "Describe a highlighted bookmark at point or the same line.
-If there is more than one highlighted bookmark present then which one
-is described is undefined.  When multiple highlighted bookmarks are
-present you might want to use `\\[bmkp-bookmarks-lighted-at-point]' to see the names of all of the
-bookmarks at point, and then use `\\[bmkp-describe-bookmark]' to describe one of them.
+;;;###autoload (autoload 'bmkp-describe-bookmark-lighted-on-this-line "bookmark+")
+(defun bmkp-describe-bookmark-lighted-on-this-line (&optional position defn) ; `C-x x ?'
+  "Describe a highlighted bookmark on this line, preferably one at point.
+Other than preferring a bookmark at point, if more than one
+highlighted bookmark is present then which one is described is
+undefined.  When multiple highlighted bookmarks are present you might
+want to use `\\[bmkp-bookmarks-lighted-at-point]' to see the names of all of the bookmarks at
+point, and then use `\\[bmkp-describe-bookmark]' to describe one of them.
 
 When called from Lisp:
- * Use POSITION, not point.
- * DEFN corresponds to the prefix arg: non-nil means show show the
-   internal definition of the bookmark."
+ Use POSITION, not point.
+ DEFN corresponds to the prefix arg: non-nil means show the internal
+  definition of the bookmark."
   (interactive (list (point) current-prefix-arg))
   (let ((bmk  (or (bmkp-a-bookmark-lighted-at-pos position 'FULL)
                   (bmkp-a-bookmark-lighted-on-this-line 'FULL))))
@@ -1251,10 +1349,7 @@ Returns:
 BOOKMARK's  `:when' condition is used to determine this.
 BOOKMARK is a bookmark name or a bookmark record."
   (setq bookmark  (bmkp-get-bookmark bookmark 'NOERROR))
-  (let ((this-bookmark       bookmark)
-        (this-bookmark-name  (bmkp-bookmark-name-from-record bookmark))
-        (when-sexp           (bmkp-lighting-when bookmark)))
-    (not (eq :no-light (eval when-sexp)))))
+  (and bookmark  (not (eq :no-light (eval (bmkp-lighting-when bookmark))))))
 
 (defun bmkp-lighting-face (bookmark)
   "`:face' specified by BOOKMARK's `lighting', or nil if no `:face' entry.
@@ -1315,7 +1410,7 @@ For Emacs 23+, if there is a highlighted bookmark at point, return a
   (or (if (> emacs-major-version 22) (bmkp-bookmarks-lighted-at-point) (bmkp-a-bookmark-lighted-at-pos))
       (bmkp-a-bookmark-lighted-on-this-line)))
 
-(defun bmkp-a-bookmark-lighted-on-this-line (&optional fullp msgp)
+(defun bmkp-a-bookmark-lighted-on-this-line (&optional fullp)
   "Return a bookmark highlighted on the current line or nil if none.
 The search for a highlighted bookmark moves left to bol from point,
  then right to eol from point.
@@ -1394,9 +1489,9 @@ A new list is returned (no side effects)."
                       bookmark-alist))
 
 (defun bmkp-number-lighted (&optional overlays-symbols)
-  "Number of bookmarks highlighted."
-  (unless overlays-symbols
-    (setq overlays-symbols  '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays)))
+  "Number of bookmarks highlighted.
+\(See `bmkp-light-bookmarks' for argument when called from Lisp.)"
+  (unless overlays-symbols (setq overlays-symbols  '(bmkp-autonamed-overlays bmkp-non-autonamed-overlays)))
   (let ((count  0))
     (dolist (ov-symb  overlays-symbols)
       (dolist (ov  (symbol-value ov-symb)) (when (overlay-buffer ov) (setq count  (1+ count)))))
index 7b6745e9b945ced7b6384ec6843ea9ff4bac6935..eaeef4e62188be2b756eb5fb92c12d312909056a 100644 (file)
@@ -1,14 +1,14 @@
-;;; bookmark+-mac.el --- Macros for Bookmark+.
+;;; bookmark+-mac.el --- Macros for Bookmark+.   -*- lexical-binding:t -*-
 ;;
 ;; Filename: bookmark+-mac.el
 ;; Description: Macros for Bookmark+.
 ;; Author: Drew Adams
 ;; Maintainer: Drew Adams
-;; Copyright (C) 2000-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2000-2024, Drew Adams, all rights reserved.
 ;; Created: Sun Aug 15 11:12:30 2010 (-0700)
-;; Last-Updated: Fri Jan 14 12:34:20 2022 (-0800)
+;; Last-Updated: Sun Sep 15 18:09:29 2024 (-0700)
 ;;           By: dradams
-;;     Update #: 223
+;;     Update #: 238
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b-mac.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, bookmark+, placeholders, annotations, search, info, url, eww, w3m, gnus
 ;;
 ;;  Macros defined here:
 ;;
-;;    `bmkp-define-cycle-command', `bmkp-define-history-variables',
+;;    `bmkp-define-cycle-command', `bmkp-define-file-sort-predicate',
+;;    `bmkp-define-history-variables',
 ;;    `bmkp-define-next+prev-cycle-commands',
 ;;    `bmkp-define-show-only-command', `bmkp-define-sort-command',
-;;    `bmkp-define-file-sort-predicate', `bmkp-menu-bar-make-toggle',
+;;    `bmkp-define-type-from-hander', `bmkp-lexlet', `bmkp-lexlet*',
+;;    `bmkp-make-plain-predicate', `bmkp-menu-bar-make-toggle',
 ;;    `bmkp-with-bookmark-dir', `bmkp-with-help-window',
 ;;    `bmkp-with-output-to-plain-temp-buffer'.
 ;;
 (put 'bmkp-with-output-to-plain-temp-buffer 'common-lisp-indent-function '(4 &body))
 
 
+;;;###autoload (autoload 'bmkp-make-plain-predicate "bookmark+")
+(defmacro bmkp-make-plain-predicate (pred &optional final-pred)
+  "Return a plain predicate that corresponds to component-predicate PRED.
+PRED and FINAL-PRED correspond to their namesakes in
+`bmkp-sort-comparer' (which see).
+
+PRED should return `(t)', `(nil)', or nil.
+
+Optional arg FINAL-PRED is the final predicate to use if PRED cannot
+decide (returns nil).  If FINAL-PRED is nil, then `bmkp-alpha-p', the
+plain-predicate equivalent of `bmkp-alpha-cp' is used as the final
+predicate."
+  `(lambda (b1 b2) (let ((res  (funcall ',pred b1 b2)))
+                     (if res (car res) (funcall ',(or final-pred  'bmkp-alpha-p) b1 b2)))))
+
 ;;;###autoload (autoload 'bmkp-define-cycle-command "bookmark+")
 (defmacro bmkp-define-cycle-command (type &optional otherp)
   "Define a cycling command for bookmarks of type TYPE.
@@ -265,14 +282,12 @@ See `bmkp-next-%s-bookmark'." type type))
     (defun ,(intern (format "bmkp-next-%s-bookmark%s-repeat"
                             type
                             (if otherp "-other-window" "")))
-        (arg)
+        ()
       ,(if otherp
            (format "Same as `bmkp-next-%s-bookmark-repeat', but use other window." type)
-           (format "Jump to the Nth-next %s bookmark.
-This is a repeatable version of `bmkp-next-%s-bookmark'.
-N defaults to 1, meaning the next one.
-Plain `C-u' means start over at the first one (and no repeat)." type type))
-      (interactive "P")
+           (format "Jump to the next %s bookmark.
+This is a repeatable version of `bmkp-next-%s-bookmark'." type type))
+      (interactive)
       (require 'repeat)
       (bmkp-repeat-command
        ',(intern (format "bmkp-next-%s-bookmark%s" type (if otherp "-other-window" "")))))
@@ -281,12 +296,12 @@ Plain `C-u' means start over at the first one (and no repeat)." type type))
     (defun ,(intern (format "bmkp-previous-%s-bookmark%s-repeat"
                             type
                             (if otherp "-other-window" "")))
-        (arg)
+        ()
       ,(if otherp
            (format "Same as `bmkp-previous-%s-bookmark-repeat', but use other window." type)
-           (format "Jump to the Nth-previous %s bookmark.
+           (format "Jump to the previous %s bookmark.
 See `bmkp-next-%s-bookmark-repeat'." type type))
-      (interactive "P")
+      (interactive)
       (require 'repeat)
       (bmkp-repeat-command
        ',(intern (format "bmkp-previous-%s-bookmark%s" type (if otherp "-other-window" "")))))))
@@ -495,9 +510,43 @@ The alist is used in commands such as `bmkp-jump-to-type'."
   "Create and eval defvars for Bookmark+ history variables.
 The variables are the cdrs of `bmkp-types-alist'.  They are used in
 commands such as `bmkp-jump-to-type'."
-  (dolist (entry  (bmkp-types-alist))
-    `(defvar,(cdr entry) ()
-       ,(format "History for %s bookmarks." (car entry)))))
+  (let ((dfvars  ()))
+    (dolist (entry  (bmkp-types-alist))
+      (push `(defvar ,(cdr entry) () ,(format "History for %s bookmarks." (car entry)))
+            dfvars))
+    `(progn ,@dfvars)))
+
+;; This macro is not used in the Bookmark+ code.  It's available for users who want to define
+;; simple bookmark types that are based only on a handler.
+;;
+;;;###autoload (autoload 'bmkp-define-type-from-hander "bookmark+")
+(defmacro bmkp-define-type-from-hander (type handler)
+  "Define a TYPE of bookmarks based only on a HANDLER function.
+TYPE is a short string or symbol.
+
+Define predicate `bmkp-TYPE-bookmark-p', which returns non-nil if its
+bookmark argument has HANDLER.
+
+Define filter function `bmkp-TYPE-alist-only', which returns only the
+TYPE bookmarks from the current bookmark list.
+
+Define command `bmkp-bmenu-show-only-TYPE-bookmarks', which shows only
+the TYPE bookmarks, in the bookmark-list display."
+  (let  ((predicate-doc   (format "Return non-nil if BOOKMARK is a %s bookmark." type))
+         (predicate-symb  (intern (format "bmkp-%s-bookmark-p" type)))
+         (predicate       `(eq (bookmark-get-handler bmk) ',handler))
+         (alist-only-doc  (format "`bookmark-alist', filtered to retain only %s bookmarks." type))
+         (alist-only-fn   (intern (format "bmkp-%s-alist-only" type)))
+         (show-only-doc   (format "Display (only) the %s bookmarks." type)))
+    `(progn (defun ,predicate-symb (bookmark)
+              ,predicate-doc
+              ,predicate)
+            (defun ,alist-only-fn ()
+              ,alist-only-doc
+              (bookmark-maybe-load-default-file)
+              (bmkp-remove-if-not (lambda (bmk) ,predicate) bookmark-alist))
+            (bmkp-define-show-only-command ,type ,show-only-doc ,alist-only-fn)
+            (bmkp-define-history-variables))))
 
 ;; This is compatible with Emacs 20 and later.
 ;;;###autoload (autoload 'bmkp-menu-bar-make-toggle "bookmark+")
@@ -550,6 +599,24 @@ If BOOKMARK has no location then use nil as `default-directory'."
                                (if (file-directory-p loc) loc (file-name-directory loc)))))
     ,@body))
 
+;; These are needed because Emacs 29 removed `lexical-let[*]'.
+;;
+(defmacro bmkp-lexlet (&rest all)
+  "`lexical-let', if available and not `lexical-binding'; else `let'."
+  (if (and (fboundp 'lexical-let)              ; Emacs < 29
+           (or (not (boundp 'lexical-binding)) ; Emacs <  24.something
+               (not lexical-binding)))         ; Emacs >= 24.something
+      `(lexical-let ,@all)
+    `(let ,@all)))                      ; Emacs 29+
+
+(defmacro bmkp-lexlet* (&rest all)
+  "`lexical-let*', if available and not `lexical-binding'; else `let*'."
+  (if (and (fboundp 'lexical-let*)             ; Emacs < 29
+           (or (not (boundp 'lexical-binding)) ; Emacs <  24.something
+               (not lexical-binding)))         ; Emacs >= 24.something
+      `(lexical-let* ,@all)
+    `(let* ,@all)))
+
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 (provide 'bookmark+-mac)
index 690d4edbf20c4ac0624c9695d2b6dbc3b3d0ff5c..f7f3424ad605308a368ed32eed4113c9faf3d04e 100644 (file)
@@ -1,16 +1,16 @@
-;;; bookmark+.el --- Bookmark+: extensions to standard library `bookmark.el'.
+;;; bookmark+.el --- Bookmark+: extensions to standard library `bookmark.el'.   -*- lexical-binding:t -*-
 ;;
 ;; Filename: bookmark+.el
 ;; Description: Bookmark+: extensions to standard library `bookmark.el'.
 ;; Author: Drew Adams, Thierry Volpiatto
 ;; Maintainer: Drew Adams (concat "drew.adams" "@" "oracle" ".com")
-;; Copyright (C) 2000-2022, Drew Adams, all rights reserved.
+;; Copyright (C) 2000-2024, Drew Adams, all rights reserved.
 ;; Copyright (C) 2009, Thierry Volpiatto, all rights reserved.
 ;; Created: Fri Sep 15 07:58:41 2000
-;; Version: 2021.09.19
-;; Last-Updated: Fri Jan 14 12:52:46 2022 (-0800)
+;; Version: 2024.10.15
+;; Last-Updated: Tue Oct 15 14:23:30 2024 (-0700)
 ;;           By: dradams
-;;     Update #: 15072
+;;     Update #: 15086
 ;; URL: https://www.emacswiki.org/emacs/download/bookmark%2b.el
 ;; Doc URL: https://www.emacswiki.org/emacs/BookmarkPlus
 ;; Keywords: bookmarks, bookmark+, projects, placeholders, annotations, search, info, url, eww, w3m, gnus
 ;;
 ;; Features that might be required by this library:
 ;;
-;;   `apropos', `apropos+', `avoid', `backquote', `bookmark',
-;;   `bookmark+', `bookmark+-1', `bookmark+-bmu', `bookmark+-key',
-;;   `bookmark+-lit', `button', `bytecomp', `cconv', `cl', `cl-lib',
-;;   `cmds-menu', `col-highlight', `crosshairs', `fit-frame',
-;;   `font-lock', `font-lock+', `frame-fns', `gv', `help+',
-;;   `help-fns', `help-fns+', `help-macro', `help-macro+',
-;;   `help-mode', `hl-line', `hl-line+', `info', `info+', `kmacro',
-;;   `macroexp', `menu-bar', `menu-bar+', `misc-cmds', `misc-fns',
-;;   `naked', `pp', `pp+', `radix-tree', `rect', `replace',
-;;   `second-sel', `strings', `syntax', `text-mode', `thingatpt',
-;;   `thingatpt+', `vline', `w32browser-dlgopen', `wid-edit',
+;;   `apropos', `apropos+', `auth-source', `avoid', `backquote',
+;;   `bookmark', `bookmark+', `bookmark+-1', `bookmark+-bmu',
+;;   `bookmark+-key', `bookmark+-lit', `button', `bytecomp', `cconv',
+;;   `cl-generic', `cl-lib', `cl-macs', `cmds-menu', `col-highlight',
+;;   `crosshairs', `eieio', `eieio-core', `eieio-loaddefs',
+;;   `epg-config', `fit-frame', `font-lock', `font-lock+',
+;;   `frame-fns', `gv', `help+', `help-fns', `help-fns+',
+;;   `help-macro', `help-macro+', `help-mode', `hl-line', `hl-line+',
+;;   `info', `info+', `kmacro', `macroexp', `menu-bar', `menu-bar+',
+;;   `misc-cmds', `misc-fns', `naked', `package', `password-cache',
+;;   `pp', `pp+', `radix-tree', `rect', `replace', `second-sel',
+;;   `seq', `strings', `syntax', `tabulated-list', `text-mode',
+;;   `thingatpt', `thingatpt+', `url-handlers', `url-parse',
+;;   `url-vars', `vline', `w32browser-dlgopen', `wid-edit',
 ;;   `wid-edit+'.
 ;;
 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 (require 'bookmark)                     ; Vanilla Emacs.
 
 ;;;###autoload (autoload 'bmkp-version-number "bookmark+")
-(defconst bmkp-version-number "2018.10.17")
+(defconst bmkp-version-number "2023.10.26")
 
 ;;;###autoload (autoload 'bmkp-version "bookmark+")
 (defun bmkp-version ()