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