Function: bookmark-write-file
bookmark-write-file is a byte-compiled function defined in
bookmark.el.gz.
Signature
(bookmark-write-file FILE)
Documentation
Write bookmark-alist to FILE.
Source Code
;; Defined in /usr/src/emacs/lisp/bookmark.el.gz
(defun bookmark-write-file (file)
"Write `bookmark-alist' to FILE."
(let ((reporter (make-progress-reporter
(format "Saving bookmarks to file %s..." file))))
(with-current-buffer (get-buffer-create " *Bookmarks*")
(goto-char (point-min))
(delete-region (point-min) (point-max))
(let ((coding-system-for-write
(or coding-system-for-write
bookmark-file-coding-system 'utf-8-emacs))
(print-length nil)
(print-level nil)
;; See bug #12503 for why we bind `print-circle'. Users
;; can define their own bookmark types, which can result in
;; arbitrary Lisp objects being stored in bookmark records,
;; and some users create objects containing circularities.
(print-circle t))
(insert "(")
;; Rather than a single call to `pp' we make one per bookmark.
;; Apparently `pp' has a poor algorithmic complexity, so this
;; scales a lot better. bug#4485.
(let ((pp-default-function #'pp-28))
(dolist (i bookmark-alist) (pp i (current-buffer))))
(insert ")\n")
;; Make sure the specified encoding can safely encode the
;; bookmarks. If it cannot, suggest utf-8-emacs as default.
(with-coding-priority '(utf-8-emacs)
(setq coding-system-for-write
(select-safe-coding-system (point-min) (point-max)
(list t coding-system-for-write))))
(goto-char (point-min))
(bookmark-insert-file-format-version-stamp coding-system-for-write)
(let ((version-control
(cond
((null bookmark-version-control) nil)
((eq 'never bookmark-version-control) 'never)
((eq 'nospecial bookmark-version-control) version-control)
(t t))))
(condition-case nil
;; There was a stretch of time (about 15 years) when we
;; used `write-region' below instead of `write-file',
;; before going back to `write-file' again. So if you're
;; considering changing it to `write-region', please see
;; https://debbugs.gnu.org/cgi/bugreport.cgi?bug=12507.
;; That bug tells the story of how we first started using
;; `write-region' in 2005...
;;
;; commit a506054af7cd86a63fda996056c09310966f32ef
;; Author: Karl Fogel <kfogel@red-bean.com>
;; AuthorDate: Sat Nov 12 20:30:22 2005 +0000
;;
;; (bookmark-write-file): Don't visit the
;; destination file, just write the data to it
;; using write-region. This is similar to
;; 2005-05-29T08:36:26Z!rms@gnu.org of saveplace.el,
;; but with an additional change to avoid visiting
;; the file in the first place.
;;
;; ...and of how further inquiry led us to investigate (in
;; 2012 and then again in 2020) and eventually decide that
;; matching the saveplace.el change doesn't make sense for
;; bookmark.el. Therefore we reverted to `write-file',
;; which means numbered backups may now be created,
;; depending on `bookmark-version-control' as per above.
(write-file file)
(file-error (message "Can't write %s" file)))
(setq bookmark-file-coding-system coding-system-for-write)
(kill-buffer (current-buffer))
(progress-reporter-done reporter))))))