Function: save-completions-to-file
save-completions-to-file is an interactive and byte-compiled function
defined in completion.el.gz.
Signature
(save-completions-to-file &optional FILENAME)
Documentation
Save completions in init file FILENAME.
If file name is not specified, use save-completions-file-name.
Key Bindings
Source Code
;; Defined in /usr/src/emacs/lisp/completion.el.gz
(defun save-completions-to-file (&optional filename)
"Save completions in init file FILENAME.
If file name is not specified, use `save-completions-file-name'."
(interactive)
(setq filename (expand-file-name (or filename save-completions-file-name)))
(if (file-writable-p filename)
(progn
(if (not cmpl-initialized-p)
(completion-initialize)) ;; make sure everything's loaded
(message "Saving completions to file %s" filename)
(let* ((delete-old-versions t)
(kept-old-versions 0)
(kept-new-versions completions-file-versions-kept)
last-use-time
(this-use-time (cmpl-hours-since-origin))
(total-in-db 0)
(total-perm 0)
(total-saved 0)
(backup-filename (completion-backup-filename filename)))
(with-current-buffer (get-buffer-create " *completion-save-buffer*")
(setq buffer-file-name filename)
(if (not (verify-visited-file-modtime (current-buffer)))
(progn
;; file has changed on disk. Bring us up-to-date
(message "Completion file has changed. Merging. . .")
(load-completions-from-file filename t)
(message "Merging finished. Saving completions to file %s" filename)))
;; prepare the buffer to be modified
(clear-visited-file-modtime)
(erase-buffer)
;; (/ 1 0)
(insert (format saved-cmpl-file-header completion-version))
(dolist (completion (list-all-completions))
(setq total-in-db (1+ total-in-db))
(setq last-use-time (completion-last-use-time completion))
;; Update num uses and maybe write completion to a file
(cond ((or;; Write to file if
;; permanent
(and (eq last-use-time t)
(setq total-perm (1+ total-perm)))
;; or if
(if (> (completion-num-uses completion) 0)
;; it's been used
(setq last-use-time this-use-time)
;; or it was saved before and
(and last-use-time
;; save-completions-retention-time is nil
(or (not save-completions-retention-time)
;; or time since last use is < ...retention-time*
(< (- this-use-time last-use-time)
save-completions-retention-time)))))
;; write to file
(setq total-saved (1+ total-saved))
(insert (prin1-to-string (cons (completion-string completion)
last-use-time)) "\n"))))
;; write the buffer
(condition-case nil
(let ((file-exists-p (file-exists-p filename)))
(if file-exists-p
(progn
;; If file exists . . .
;; Save a backup(so GNU doesn't screw us when we're out of disk)
;; (GNU leaves a 0 length file if it gets a disk full error!)
;; If backup doesn't exit, Rename current to backup
;; {If backup exists the primary file is probably messed up}
(or (file-exists-p backup-filename)
(rename-file filename backup-filename))
;; Copy the backup back to the current name
;; (so versioning works)
(copy-file backup-filename filename t)))
;; Save it
(save-buffer)
(if file-exists-p
;; If successful, remove backup
(delete-file backup-filename)))
(error
(set-buffer-modified-p nil)
(message "Couldn't save completion file `%s'" filename)))
;; Reset accepted-p flag
(setq cmpl-completions-accepted-p nil) )))))