Mercurial > emacs
diff lisp/emacs-lisp/autoload.el @ 90428:a8190f7e546e
Merge from emacs--devo--0
Patches applied:
* emacs--devo--0 (patch 285-296)
- Update from CVS
- Merge from gnus--rel--5.10
- Update from CVS: admin/FOR-RELEASE: Update refcard section.
* gnus--rel--5.10 (patch 102-104)
- Update from CVS
Revision: emacs@sv.gnu.org/emacs--unicode--0--patch-64
author | Miles Bader <miles@gnu.org> |
---|---|
date | Wed, 07 Jun 2006 18:05:10 +0000 |
parents | 5754737d1e04 29150c5d541b |
children | 8a8e69664178 |
line wrap: on
line diff
--- a/lisp/emacs-lisp/autoload.el Wed Jun 07 11:41:58 2006 +0000 +++ b/lisp/emacs-lisp/autoload.el Wed Jun 07 18:05:10 2006 +0000 @@ -273,12 +273,30 @@ (or (eolp) (insert "\n" generate-autoload-section-continuation)))))) +(defun autoload-find-file (file) + "Fetch file and put it in a temp buffer. Return the buffer." + ;; It is faster to avoid visiting the file. + (with-current-buffer (get-buffer-create " *autoload-file*") + (kill-all-local-variables) + (erase-buffer) + (setq buffer-undo-list t + buffer-read-only nil) + (emacs-lisp-mode) + (insert-file-contents file nil) + (let ((enable-local-variables :safe)) + (hack-local-variables)) + (current-buffer))) + +(defvar no-update-autoloads nil + "File local variable to prevent scanning this file for autoload cookies.") + (defun generate-file-autoloads (file) "Insert at point a loaddefs autoload section for FILE. -autoloads are generated for defuns and defmacros in FILE +Autoloads are generated for defuns and defmacros in FILE marked by `generate-autoload-cookie' (which see). If FILE is being visited in a buffer, the contents of the buffer -are used." +are used. +Return non-nil in the case where no autoloads were added at point." (interactive "fGenerate autoloads for file: ") (let ((outbuf (current-buffer)) (autoloads-done '()) @@ -291,7 +309,7 @@ (float-output-format nil) (done-any nil) (visited (get-file-buffer file)) - output-end) + output-start) ;; If the autoload section we create here uses an absolute ;; file name for FILE in its header, and then Emacs is installed @@ -309,76 +327,70 @@ (string= dir-truename (substring source-truename 0 len))) (setq file (substring source-truename len)))) - (message "Generating autoloads for %s..." file) - (save-excursion - (unwind-protect - (progn - (if visited - (set-buffer visited) - ;; It is faster to avoid visiting the file. - (set-buffer (get-buffer-create " *generate-autoload-file*")) - (kill-all-local-variables) - (erase-buffer) - (setq buffer-undo-list t - buffer-read-only nil) - (emacs-lisp-mode) - (insert-file-contents file nil)) - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (while (not (eobp)) - (skip-chars-forward " \t\n\f") - (cond - ((looking-at (regexp-quote generate-autoload-cookie)) - (search-forward generate-autoload-cookie) - (skip-chars-forward " \t") - (setq done-any t) - (if (eolp) - ;; Read the next form and make an autoload. - (let* ((form (prog1 (read (current-buffer)) - (or (bolp) (forward-line 1)))) - (autoload (make-autoload form load-name))) - (if autoload - (setq autoloads-done (cons (nth 1 form) - autoloads-done)) - (setq autoload form)) - (let ((autoload-print-form-outbuf outbuf)) - (autoload-print-form autoload))) + (with-current-buffer (or visited + ;; It is faster to avoid visiting the file. + (autoload-find-file file)) + ;; Obey the no-update-autoloads file local variable. + (unless no-update-autoloads + (message "Generating autoloads for %s..." file) + (setq output-start (with-current-buffer outbuf (point))) + (save-excursion + (save-restriction + (widen) + (goto-char (point-min)) + (while (not (eobp)) + (skip-chars-forward " \t\n\f") + (cond + ((looking-at (regexp-quote generate-autoload-cookie)) + (search-forward generate-autoload-cookie) + (skip-chars-forward " \t") + (setq done-any t) + (if (eolp) + ;; Read the next form and make an autoload. + (let* ((form (prog1 (read (current-buffer)) + (or (bolp) (forward-line 1)))) + (autoload (make-autoload form load-name))) + (if autoload + (push (nth 1 form) autoloads-done) + (setq autoload form)) + (let ((autoload-print-form-outbuf outbuf)) + (autoload-print-form autoload))) - ;; Copy the rest of the line to the output. - (princ (buffer-substring - (progn - ;; Back up over whitespace, to preserve it. - (skip-chars-backward " \f\t") - (if (= (char-after (1+ (point))) ? ) - ;; Eat one space. - (forward-char 1)) - (point)) - (progn (forward-line 1) (point))) - outbuf))) - ((looking-at ";") - ;; Don't read the comment. - (forward-line 1)) - (t - (forward-sexp 1) - (forward-line 1))))))) - (or visited - ;; We created this buffer, so we should kill it. - (kill-buffer (current-buffer))) - (set-buffer outbuf) - (setq output-end (point-marker)))) - (if done-any - (progn - ;; Insert the section-header line - ;; which lists the file name and which functions are in it, etc. - (autoload-insert-section-header outbuf autoloads-done load-name file - (nth 5 (file-attributes file))) - (insert ";;; Generated autoloads from " - (autoload-trim-file-name file) "\n") - (goto-char output-end) - (insert generate-autoload-section-trailer))) - (message "Generating autoloads for %s...done" file))) + ;; Copy the rest of the line to the output. + (princ (buffer-substring + (progn + ;; Back up over whitespace, to preserve it. + (skip-chars-backward " \f\t") + (if (= (char-after (1+ (point))) ? ) + ;; Eat one space. + (forward-char 1)) + (point)) + (progn (forward-line 1) (point))) + outbuf))) + ((looking-at ";") + ;; Don't read the comment. + (forward-line 1)) + (t + (forward-sexp 1) + (forward-line 1)))))) + + (when done-any + (with-current-buffer outbuf + (save-excursion + ;; Insert the section-header line which lists the file name + ;; and which functions are in it, etc. + (goto-char output-start) + (autoload-insert-section-header + outbuf autoloads-done load-name file + (nth 5 (file-attributes file))) + (insert ";;; Generated autoloads from " + (autoload-trim-file-name file) "\n")) + (insert generate-autoload-section-trailer))) + (message "Generating autoloads for %s...done" file)) + (or visited + ;; We created this buffer, so we should kill it. + (kill-buffer (current-buffer)))) + (not done-any))) ;;;###autoload (defun update-file-autoloads (file &optional save-after) @@ -457,37 +469,7 @@ (goto-char (point-max)) (search-backward "\f" nil t))) (or (eq found 'up-to-date) - (and (eq found 'new) - ;; Check that FILE has any cookies before generating a - ;; new section for it. - (save-excursion - (if existing-buffer - (set-buffer existing-buffer) - ;; It is faster to avoid visiting the file. - (set-buffer (get-buffer-create " *autoload-file*")) - (kill-all-local-variables) - (erase-buffer) - (setq buffer-undo-list t - buffer-read-only nil) - (emacs-lisp-mode) - (insert-file-contents file nil)) - (save-excursion - (save-restriction - (widen) - (goto-char (point-min)) - (prog1 - (if (re-search-forward - (concat "^" (regexp-quote - generate-autoload-cookie)) - nil t) - nil - (if (interactive-p) - (message "%s has no autoloads" file)) - (setq no-autoloads t) - t) - (or existing-buffer - (kill-buffer (current-buffer)))))))) - (generate-file-autoloads file)))) + (setq no-autoloads (generate-file-autoloads file))))) (and save-after (buffer-modified-p) (save-buffer))