diff options
| author | Roland McGrath | 1994-02-07 22:19:05 +0000 |
|---|---|---|
| committer | Roland McGrath | 1994-02-07 22:19:05 +0000 |
| commit | 72c19d97c1f5802878c9cfdc049407141101d6e2 (patch) | |
| tree | bbe04952e3c82e3f0d1bb02694aed13b7cfa3c0f | |
| parent | 014b16787148ace18e077925a49ec3045e549843 (diff) | |
| download | emacs-72c19d97c1f5802878c9cfdc049407141101d6e2.tar.gz emacs-72c19d97c1f5802878c9cfdc049407141101d6e2.zip | |
(autoload-trim-file-name): New function.
(generate-file-autoloads): Bind print-readably to t for Lucid.
Use autoload-trim-file-name on FILE when inserting the name.
Scan written text and fix up ^L to \f and ( at bol to \(.
(update-file-autoloads): When we find a later file's section, set FOUND to
'new. If FOUND is 'new after loop, check file for autoload cookies and
don't call generate-file-autoloads if none.
(update-directory-autoloads): Get absolute file names from directory-files.
(batch-update-autoloads): Rewrite from jwz to process later files in a
directory after one file errs.
| -rw-r--r-- | lisp/emacs-lisp/autoload.el | 189 |
1 files changed, 124 insertions, 65 deletions
diff --git a/lisp/emacs-lisp/autoload.el b/lisp/emacs-lisp/autoload.el index cce626f9a99..0a8ebb6524d 100644 --- a/lisp/emacs-lisp/autoload.el +++ b/lisp/emacs-lisp/autoload.el | |||
| @@ -95,6 +95,14 @@ the section of autoloads for a file.") | |||
| 95 | (put 'defconst 'doc-string-elt 3) | 95 | (put 'defconst 'doc-string-elt 3) |
| 96 | (put 'defmacro 'doc-string-elt 3) | 96 | (put 'defmacro 'doc-string-elt 3) |
| 97 | 97 | ||
| 98 | (defun autoload-trim-file-name (file) | ||
| 99 | ;; Returns a relative pathname of FILE including the last directory. | ||
| 100 | (setq file (expand-file-name file)) | ||
| 101 | (file-relative-name file | ||
| 102 | (file-name-directory | ||
| 103 | (directory-file-name | ||
| 104 | (file-name-directory file))))) | ||
| 105 | |||
| 98 | (defun generate-file-autoloads (file) | 106 | (defun generate-file-autoloads (file) |
| 99 | "Insert at point a loaddefs autoload section for FILE. | 107 | "Insert at point a loaddefs autoload section for FILE. |
| 100 | autoloads are generated for defuns and defmacros in FILE | 108 | autoloads are generated for defuns and defmacros in FILE |
| @@ -109,6 +117,7 @@ are used." | |||
| 109 | (substring name 0 (match-beginning 0)) | 117 | (substring name 0 (match-beginning 0)) |
| 110 | name))) | 118 | name))) |
| 111 | (print-length nil) | 119 | (print-length nil) |
| 120 | (print-readably t) ; This does something in Lucid Emacs. | ||
| 112 | (float-output-format nil) | 121 | (float-output-format nil) |
| 113 | (done-any nil) | 122 | (done-any nil) |
| 114 | (visited (get-file-buffer file)) | 123 | (visited (get-file-buffer file)) |
| @@ -146,55 +155,76 @@ are used." | |||
| 146 | (search-forward generate-autoload-cookie) | 155 | (search-forward generate-autoload-cookie) |
| 147 | (skip-chars-forward " \t") | 156 | (skip-chars-forward " \t") |
| 148 | (setq done-any t) | 157 | (setq done-any t) |
| 149 | (if (eolp) | 158 | (let ((begin (save-excursion (set-buffer outbuf) |
| 150 | ;; Read the next form and make an autoload. | 159 | (point)))) |
| 151 | (let* ((form (prog1 (read (current-buffer)) | 160 | (if (eolp) |
| 152 | (forward-line 1))) | 161 | ;; Read the next form and make an autoload. |
| 153 | (autoload (make-autoload form load-name)) | 162 | (let* ((form (prog1 (read (current-buffer)) |
| 154 | (doc-string-elt (get (car-safe form) | 163 | (forward-line 1))) |
| 155 | 'doc-string-elt))) | 164 | (autoload (make-autoload form load-name)) |
| 156 | (if autoload | 165 | (doc-string-elt (get (car-safe form) |
| 157 | (setq autoloads-done (cons (nth 1 form) | 166 | 'doc-string-elt))) |
| 158 | autoloads-done)) | 167 | (if autoload |
| 159 | (setq autoload form)) | 168 | (setq autoloads-done (cons (nth 1 form) |
| 160 | (if (and doc-string-elt | 169 | autoloads-done)) |
| 161 | (stringp (nth doc-string-elt autoload))) | 170 | (setq autoload form)) |
| 162 | ;; We need to hack the printing because the | 171 | (if (and doc-string-elt |
| 163 | ;; doc-string must be printed specially for | 172 | (stringp (nth doc-string-elt autoload))) |
| 164 | ;; make-docfile (sigh). | 173 | ;; We need to hack the printing because the |
| 165 | (let* ((p (nthcdr (1- doc-string-elt) | 174 | ;; doc-string must be printed specially for |
| 166 | autoload)) | 175 | ;; make-docfile (sigh). |
| 167 | (elt (cdr p))) | 176 | (let* ((p (nthcdr (1- doc-string-elt) |
| 168 | (setcdr p nil) | 177 | autoload)) |
| 169 | (princ "\n(" outbuf) | 178 | (elt (cdr p))) |
| 170 | (let ((print-escape-newlines t)) | 179 | (setcdr p nil) |
| 171 | (mapcar (function (lambda (elt) | 180 | (princ "\n(" outbuf) |
| 172 | (prin1 elt outbuf) | 181 | (let ((print-escape-newlines t)) |
| 173 | (princ " " outbuf))) | 182 | (mapcar (function (lambda (elt) |
| 174 | autoload)) | 183 | (prin1 elt outbuf) |
| 175 | (princ "\"\\\n" outbuf) | 184 | (princ " " outbuf))) |
| 176 | (princ (substring | 185 | autoload)) |
| 177 | (prin1-to-string (car elt)) 1) | 186 | (princ "\"\\\n" outbuf) |
| 178 | outbuf) | 187 | (let ((begin (save-excursion |
| 179 | (if (null (cdr elt)) | 188 | (set-buffer outbuf) |
| 180 | (princ ")" outbuf) | 189 | (point)))) |
| 181 | (princ " " outbuf) | ||
| 182 | (princ (substring | 190 | (princ (substring |
| 183 | (prin1-to-string (cdr elt)) | 191 | (prin1-to-string (car elt)) 1) |
| 184 | 1) | 192 | outbuf) |
| 185 | outbuf)) | 193 | ;; Insert a backslash before each ( that |
| 186 | (terpri outbuf)) | 194 | ;; appears at the beginning of a line in |
| 187 | (print autoload outbuf))) | 195 | ;; the doc string. |
| 188 | ;; Copy the rest of the line to the output. | 196 | (save-excursion |
| 189 | (let ((begin (point))) | 197 | (set-buffer outbuf) |
| 190 | (forward-line 1) | 198 | (save-excursion |
| 191 | (princ (buffer-substring begin (point)) outbuf)))) | 199 | (while (search-backward "\n(" begin t) |
| 192 | ((looking-at ";") | 200 | (forward-char 1) |
| 193 | ;; Don't read the comment. | 201 | (insert "\\")))) |
| 194 | (forward-line 1)) | 202 | (if (null (cdr elt)) |
| 195 | (t | 203 | (princ ")" outbuf) |
| 196 | (forward-sexp 1) | 204 | (princ " " outbuf) |
| 197 | (forward-line 1))))))) | 205 | (princ (substring |
| 206 | (prin1-to-string (cdr elt)) | ||
| 207 | 1) | ||
| 208 | outbuf)) | ||
| 209 | (terpri outbuf)) | ||
| 210 | (print autoload outbuf))) | ||
| 211 | ;; Copy the rest of the line to the output. | ||
| 212 | (let ((begin (point))) | ||
| 213 | (forward-line 1) | ||
| 214 | (princ (buffer-substring begin (point)) outbuf))) | ||
| 215 | (save-excursion | ||
| 216 | (set-buffer outbuf) | ||
| 217 | ;; Replace literal ^Ls with \f in what we just wrote. | ||
| 218 | (save-excursion | ||
| 219 | (while (search-backward "\f" begin t) | ||
| 220 | (delete-char 1) | ||
| 221 | (insert "\\f")))))) | ||
| 222 | ((looking-at ";") | ||
| 223 | ;; Don't read the comment. | ||
| 224 | (forward-line 1)) | ||
| 225 | (t | ||
| 226 | (forward-sexp 1) | ||
| 227 | (forward-line 1))))))) | ||
| 198 | (or visited | 228 | (or visited |
| 199 | ;; We created this buffer, so we should kill it. | 229 | ;; We created this buffer, so we should kill it. |
| 200 | (kill-buffer (current-buffer))) | 230 | (kill-buffer (current-buffer))) |
| @@ -203,11 +233,13 @@ are used." | |||
| 203 | (if done-any | 233 | (if done-any |
| 204 | (progn | 234 | (progn |
| 205 | (insert generate-autoload-section-header) | 235 | (insert generate-autoload-section-header) |
| 206 | (prin1 (list 'autoloads autoloads-done load-name file | 236 | (prin1 (list 'autoloads autoloads-done load-name |
| 237 | (autoload-trim-file-name file) | ||
| 207 | (nth 5 (file-attributes file))) | 238 | (nth 5 (file-attributes file))) |
| 208 | outbuf) | 239 | outbuf) |
| 209 | (terpri outbuf) | 240 | (terpri outbuf) |
| 210 | (insert ";;; Generated autoloads from " file "\n") | 241 | (insert ";;; Generated autoloads from " |
| 242 | (autoload-trim-file-name file) "\n") | ||
| 211 | (goto-char output-end) | 243 | (goto-char output-end) |
| 212 | (insert generate-autoload-section-trailer))) | 244 | (insert generate-autoload-section-trailer))) |
| 213 | (message "Generating autoloads for %s...done" file))) | 245 | (message "Generating autoloads for %s...done" file))) |
| @@ -269,8 +301,23 @@ autoloads go somewhere else.") | |||
| 269 | ;; there must be no section for LOAD-NAME. We will | 301 | ;; there must be no section for LOAD-NAME. We will |
| 270 | ;; insert one before the section here. | 302 | ;; insert one before the section here. |
| 271 | (goto-char (match-beginning 0)) | 303 | (goto-char (match-beginning 0)) |
| 272 | (setq found t))))) | 304 | (setq found 'new))))) |
| 273 | (if (eq found t) | 305 | (or (eq found 'up-to-date) |
| 306 | (and (eq found 'new) | ||
| 307 | ;; Check that FILE has any cookies before generating a | ||
| 308 | ;; new section for it. | ||
| 309 | (save-excursion | ||
| 310 | (set-buffer (find-file-noselect file)) | ||
| 311 | (save-excursion | ||
| 312 | (widen) | ||
| 313 | (goto-char (point-min)) | ||
| 314 | (if (search-forward (concat "\n" | ||
| 315 | generate-autoload-cookie) | ||
| 316 | nil t) | ||
| 317 | nil | ||
| 318 | (if (interactive-p) | ||
| 319 | (message file " has no autoloads")) | ||
| 320 | t)))) | ||
| 274 | (generate-file-autoloads file)) | 321 | (generate-file-autoloads file)) |
| 275 | (setq done t))) | 322 | (setq done t))) |
| 276 | (if (interactive-p) (save-buffer)) | 323 | (if (interactive-p) (save-buffer)) |
| @@ -316,7 +363,7 @@ file \"%s\") doesn't exist. Remove its autoload section? " | |||
| 316 | "Run \\[update-file-autoloads] on each .el file in DIR." | 363 | "Run \\[update-file-autoloads] on each .el file in DIR." |
| 317 | (interactive "DUpdate autoloads for directory: ") | 364 | (interactive "DUpdate autoloads for directory: ") |
| 318 | (mapcar 'update-file-autoloads | 365 | (mapcar 'update-file-autoloads |
| 319 | (directory-files dir nil "\\.el$")) | 366 | (directory-files dir t "\\.el$")) |
| 320 | (if (interactive-p) | 367 | (if (interactive-p) |
| 321 | (save-excursion | 368 | (save-excursion |
| 322 | (set-buffer (find-file-noselect generated-autoload-file)) | 369 | (set-buffer (find-file-noselect generated-autoload-file)) |
| @@ -332,18 +379,30 @@ For example, invoke \"emacs -batch -f batch-update-autoloads *.el\"" | |||
| 332 | (if (not noninteractive) | 379 | (if (not noninteractive) |
| 333 | (error "batch-update-autoloads is to be used only with -batch")) | 380 | (error "batch-update-autoloads is to be used only with -batch")) |
| 334 | (let ((lost nil) | 381 | (let ((lost nil) |
| 335 | (args command-line-args-left)) | 382 | (args command-line-args-left) |
| 336 | (while args | 383 | (enable-local-eval nil)) ;Don't query in batch mode. |
| 337 | (catch 'file | 384 | (message "Updating autoloads in %s..." generated-autoload-file) |
| 338 | (condition-case lossage | 385 | (let ((frob (function |
| 339 | (if (file-directory-p (expand-file-name (car args))) | 386 | (lambda (file) |
| 340 | (update-directory-autoloads (car args)) | 387 | (condition-case lossage |
| 341 | (update-file-autoloads (car args))) | 388 | (update-file-autoloads file) |
| 342 | (error (progn (message ">>Error processing %s: %s" | 389 | (error |
| 343 | (car args) lossage) | 390 | (princ ">>Error processing ") |
| 344 | (setq lost t) | 391 | (princ file) |
| 345 | (throw 'file nil))))) | 392 | (princ ": ") |
| 346 | (setq args (cdr args))) | 393 | (if (fboundp 'display-error) |
| 394 | (display-error lossage nil) | ||
| 395 | (prin1 lossage)) | ||
| 396 | (princ "\n") | ||
| 397 | (setq lost t))))))) | ||
| 398 | (while args | ||
| 399 | (if (file-directory-p (expand-file-name (car args))) | ||
| 400 | (let ((rest (directory-files (car args) t "\\.el$"))) | ||
| 401 | (while rest | ||
| 402 | (funcall frob (car rest)) | ||
| 403 | (setq rest (cdr rest)))) | ||
| 404 | (funcall frob (car args))) | ||
| 405 | (setq args (cdr args))) | ||
| 347 | (save-some-buffers t) | 406 | (save-some-buffers t) |
| 348 | (message "Done") | 407 | (message "Done") |
| 349 | (kill-emacs (if lost 1 0)))) | 408 | (kill-emacs (if lost 1 0)))) |