From 9ed7c8cbcedaa50750bc1811bda2824e235787e8 Mon Sep 17 00:00:00 2001 From: Chong Yidong Date: Wed, 4 May 2011 11:38:41 -0400 Subject: [PATCH] Make autoloading commands prompt for autoload file (Bug#7989) * emacs-lisp/autoload.el (generated-autoload-file): Set to nil. (autoload-find-generated-file): New function. (generate-file-autoloads): Bind generated-autoload-file to buffer-file-name. (update-file-autoloads, update-directory-autoloads): Use autoload-find-generated-file. If called interactively, prompt for output file. (batch-update-autoloads): Doc fix. --- lisp/ChangeLog | 11 ++++++ lisp/emacs-lisp/autoload.el | 77 +++++++++++++++++++++++-------------- 2 files changed, 59 insertions(+), 29 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index 4f6ebe88277..501b4e8babc 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,3 +1,14 @@ +2011-05-04 Chong Yidong + + * emacs-lisp/autoload.el (generated-autoload-file): Set to nil. + (autoload-find-generated-file): New function. + (generate-file-autoloads): Bind generated-autoload-file to + buffer-file-name. + (update-file-autoloads, update-directory-autoloads): Use + autoload-find-generated-file. If called interactively, prompt for + output file (Bug#7989). + (batch-update-autoloads): Doc fix. + 2011-05-04 Juanma Barranquero * term/w32-win.el (dynamic-library-alist): Add `gnutls'. diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el index dffbf3418ca..f8f8d9b00f2 100644 --- a/lisp/emacs-lisp/autoload.el +++ b/lisp/emacs-lisp/autoload.el @@ -34,8 +34,8 @@ (require 'help-fns) ;for help-add-fundoc-usage. (eval-when-compile (require 'cl)) -(defvar generated-autoload-file "loaddefs.el" - "File \\[update-file-autoloads] puts autoloads into. +(defvar generated-autoload-file nil + "File into which to write autoload definitions. A Lisp file can set this in its local variables section to make its autoloads go somewhere else. @@ -198,6 +198,15 @@ or macro definition or a defcustom)." ;; the doc-string in FORM. ;; Those properties are now set in lisp-mode.el. +(defun autoload-find-generated-file () + "Visit the autoload file for the current buffer, and return its buffer. +If a buffer is visiting the desired autoload file, return it." + (let ((enable-local-variables :safe)) + ;; We used to use `raw-text' to read this file, but this causes + ;; problems when the file contains non-ASCII characters. + (find-file-noselect + (autoload-ensure-default-file (autoload-generated-file))))) + (defun autoload-generated-file () (expand-file-name generated-autoload-file ;; File-local settings of generated-autoload-file should @@ -389,7 +398,8 @@ If FILE is being visited in a buffer, the contents of the buffer are used. Return non-nil in the case where no autoloads were added at point." (interactive "fGenerate autoloads for file: ") - (autoload-generate-file-autoloads file (current-buffer))) + (let ((generated-autoload-file buffer-file-name)) + (autoload-generate-file-autoloads file (current-buffer)))) (defvar print-readably) @@ -550,15 +560,22 @@ Return non-nil if and only if FILE adds no autoloads to OUTFILE (save-buffer))))) ;;;###autoload -(defun update-file-autoloads (file &optional save-after) - "Update the autoloads for FILE in `generated-autoload-file' -\(which FILE might bind in its local variables). -If SAVE-AFTER is non-nil (which is always, when called interactively), -save the buffer too. +(defun update-file-autoloads (file &optional save-after outfile) + "Update the autoloads for FILE. +If prefix arg SAVE-AFTER is non-nil, save the buffer too. + +If FILE binds `generated-autoload-file' as a file-local variable, +autoloads are written into that file. Otherwise, the autoloads +file is determined by OUTFILE. If called interactively, prompt +for OUTFILE; if called from Lisp with OUTFILE nil, use the +existing value of `generated-autoload-file'. Return FILE if there was no autoload cookie in it, else nil." - (interactive "fUpdate autoloads for file: \np") - (let* ((autoload-modified-buffers nil) + (interactive (list (read-file-name "Update autoloads for file: ") + current-prefix-arg + (read-file-name "Write autoload definitions to file: "))) + (let* ((generated-autoload-file (or outfile generated-autoload-file)) + (autoload-modified-buffers nil) (no-autoloads (autoload-generate-file-autoloads file))) (if autoload-modified-buffers (if save-after (autoload-save-buffers)) @@ -576,12 +593,7 @@ removes any prior now out-of-date autoload entries." (let* ((buf (current-buffer)) (existing-buffer (if buffer-file-name buf)) (found nil)) - (with-current-buffer - ;; We used to use `raw-text' to read this file, but this causes - ;; problems when the file contains non-ASCII characters. - (let ((enable-local-variables :safe)) - (find-file-noselect - (autoload-ensure-default-file (autoload-generated-file)))) + (with-current-buffer (autoload-find-generated-file) ;; This is to make generated-autoload-file have Unix EOLs, so ;; that it is portable to all platforms. (or (eq 0 (coding-system-eol-type buffer-file-coding-system)) @@ -640,15 +652,20 @@ removes any prior now out-of-date autoload entries." ;;;###autoload (defun update-directory-autoloads (&rest dirs) - "\ -Update loaddefs.el with all the current autoloads from DIRS, and no old ones. -This uses `update-file-autoloads' (which see) to do its work. -In an interactive call, you must give one argument, the name -of a single directory. In a call from Lisp, you can supply multiple + "Update autoload definitions for Lisp files in the directories DIRS. +In an interactive call, you must give one argument, the name of a +single directory. In a call from Lisp, you can supply multiple directories as separate arguments, but this usage is discouraged. The function does NOT recursively descend into subdirectories of the -directory or directories specified." +directory or directories specified. + +In an interactive call, prompt for a default output file for the +autoload definitions, and temporarily bind the variable +`generated-autoload-file' to this value. When called from Lisp, +use the existing value of `generated-autoload-file'. If any Lisp +file binds `generated-autoload-file' as a file-local variable, +write its autoloads into the specified file instead." (interactive "DUpdate autoloads from directory: ") (let* ((files-re (let ((tmp nil)) (dolist (suf (get-load-suffixes) @@ -664,14 +681,14 @@ directory or directories specified." ;; Files with no autoload cookies or whose autoloads go to other ;; files because of file-local autoload-generated-file settings. (no-autoloads nil) - (autoload-modified-buffers nil)) + (autoload-modified-buffers nil) + (generated-autoload-file + (if (called-interactively-p 'interactive) + (read-file-name "Write autoload definitions to file: ") + generated-autoload-file))) - (with-current-buffer - (let ((enable-local-variables :safe)) - (find-file-noselect - (autoload-ensure-default-file (autoload-generated-file)))) + (with-current-buffer (autoload-find-generated-file) (save-excursion - ;; Canonicalize file names and remove the autoload file itself. (setq files (delete (file-relative-name buffer-file-name) (mapcar 'file-relative-name files))) @@ -748,7 +765,9 @@ directory or directories specified." ;;;###autoload (defun batch-update-autoloads () "Update loaddefs.el autoloads in batch mode. -Calls `update-directory-autoloads' on the command line arguments." +Calls `update-directory-autoloads' on the command line arguments. +Definitions are written to `generated-autoload-file' (which +should be non-nil)." ;; For use during the Emacs build process only. (unless autoload-excludes (let* ((ldir (file-name-directory generated-autoload-file)) -- 2.39.2