Commit a8add29d authored by Stefan Monnier's avatar Stefan Monnier
Browse files

(make-autoload): Simplify docstring.

Make use of symbol-property doc-string-elt.
Use memq rather than a sequence of eq.
(doc-string-elt): Fix the wrong or missing previously unused values.
(autoload-print-form): New function extracted from
generate-file-autoloads to allow recursion when handling progn
so that defvar's and defun's docstrings are properly printed.
(generate-file-autoloads): Use it.
parent d5b037c5
2000-06-05 Stefan Monnier <monnier@cs.yale.edu> 2000-06-05 Stefan Monnier <monnier@cs.yale.edu>
* emacs-lisp/autoload.el (make-autoload): Simplify docstring.
Make use of symbol-property doc-string-elt.
Use memq rather than a sequence of eq.
(doc-string-elt): Fix the wrong or missing previously unused values.
(autoload-print-form): New function extracted from
generate-file-autoloads to allow recursion when handling progn
so that defvar's and defun's docstrings are properly printed.
(generate-file-autoloads): Use it.
* emacs-lisp/easy-mmode.el (easy-mmode-define-global-mode): Autoload. * emacs-lisp/easy-mmode.el (easy-mmode-define-global-mode): Autoload.
Use find-file-hooks in the minor-mode function. Use find-file-hooks in the minor-mode function.
Be careful not to loop indefinitely in the post-command-hook function. Be careful not to loop indefinitely in the post-command-hook function.
......
...@@ -62,35 +62,21 @@ that text will be copied verbatim to `generated-autoload-file'.") ...@@ -62,35 +62,21 @@ that text will be copied verbatim to `generated-autoload-file'.")
(defun make-autoload (form file) (defun make-autoload (form file)
"Turn FORM into an autoload or defvar for source file FILE. "Turn FORM into an autoload or defvar for source file FILE.
Returns nil if FORM is not a `defun', `define-skeleton', Returns nil if FORM is not a function or variable or macro definition."
`define-derived-mode', `define-generic-mode', `defmacro', `defcustom',
`define-minor-mode' or `easy-mmode-define-minor-mode'."
(let ((car (car-safe form))) (let ((car (car-safe form)))
(if (memq car '(defun define-skeleton defmacro define-derived-mode (if (memq car '(defun define-skeleton defmacro define-derived-mode
define-generic-mode easy-mmode-define-minor-mode define-generic-mode easy-mmode-define-minor-mode
define-minor-mode defun*)) define-minor-mode defun*))
(let ((macrop (eq car 'defmacro)) (let ((macrop (eq car 'defmacro))
name doc) (name (nth 1 form))
(setq form (cdr form) (body (nthcdr (get car 'doc-string-elt) form))
name (car form) (doc (if (stringp (car body)) (pop body))))
;; Ignore the arguments.
form (cdr (cond
((memq car '(define-skeleton define-minor-mode
easy-mmode-define-minor-mode)) form)
((eq car 'define-derived-mode) (cdr (cdr form)))
((eq car 'define-generic-mode)
(cdr (cdr (cdr (cdr (cdr form))))))
(t (cdr form))))
doc (car form))
(if (stringp doc)
(setq form (cdr form))
(setq doc nil))
;; `define-generic-mode' quotes the name, so take care of that ;; `define-generic-mode' quotes the name, so take care of that
(list 'autoload (if (listp name) name (list 'quote name)) file doc (list 'autoload (if (listp name) name (list 'quote name)) file doc
(or (eq car 'define-skeleton) (eq car 'define-derived-mode) (or (and (memq car '(define-skeleton define-derived-mode
(eq car 'define-generic-mode) define-generic-mode
(eq car 'easy-mmode-define-minor-mode) easy-mmode-define-minor-mode
(eq car 'define-minor-mode) define-minor-mode)) t)
(eq (car-safe (car form)) 'interactive)) (eq (car-safe (car form)) 'interactive))
(if macrop (list 'quote 'macro) nil))) (if macrop (list 'quote 'macro) nil)))
;; Convert defcustom to a simpler (and less space-consuming) defvar, ;; Convert defcustom to a simpler (and less space-consuming) defvar,
...@@ -130,16 +116,17 @@ Returns nil if FORM is not a `defun', `define-skeleton', ...@@ -130,16 +116,17 @@ Returns nil if FORM is not a `defun', `define-skeleton',
(put 'autoload 'doc-string-elt 3) (put 'autoload 'doc-string-elt 3)
(put 'defun 'doc-string-elt 3) (put 'defun 'doc-string-elt 3)
(put 'defun* 'doc-string-elt 3)
(put 'defvar 'doc-string-elt 3) (put 'defvar 'doc-string-elt 3)
(put 'defcustom 'doc-string-elt 3) (put 'defcustom 'doc-string-elt 3)
(put 'defconst 'doc-string-elt 3) (put 'defconst 'doc-string-elt 3)
(put 'defmacro 'doc-string-elt 3) (put 'defmacro 'doc-string-elt 3)
(put 'defsubst 'doc-string-elt 3) (put 'defsubst 'doc-string-elt 3)
(put 'define-skeleton 'doc-string-elt 3) (put 'define-skeleton 'doc-string-elt 2)
(put 'define-derived-mode 'doc-string-elt 3) (put 'define-derived-mode 'doc-string-elt 4)
(put 'easy-mmode-define-minor-mode 'doc-string-elt 3) (put 'easy-mmode-define-minor-mode 'doc-string-elt 2)
(put 'define-minor-mode 'doc-string-elt 3) (put 'define-minor-mode 'doc-string-elt 2)
(put 'define-generic-mode 'doc-string-elt 3) (put 'define-generic-mode 'doc-string-elt 7)
(defun autoload-trim-file-name (file) (defun autoload-trim-file-name (file)
...@@ -173,6 +160,52 @@ markers before we call `read'." ...@@ -173,6 +160,52 @@ markers before we call `read'."
(goto-char (point-min)) (goto-char (point-min))
(read (current-buffer)))))) (read (current-buffer))))))
;; !! Requires OUTBUF to be bound !!
(defun autoload-print-form (form)
"Print FORM such that make-docfile will find the docstrings."
(cond
;; If the form is a sequence, recurse.
((eq (car form) 'progn) (mapcar 'autoload-print-form (cdr form)))
;; Symbols at the toplevel are meaningless.
((symbolp form) nil)
(t
(let ((doc-string-elt (get (car-safe form) 'doc-string-elt)))
(if (and doc-string-elt (stringp (nth doc-string-elt form)))
;; We need to hack the printing because the
;; doc-string must be printed specially for
;; make-docfile (sigh).
(let* ((p (nthcdr (1- doc-string-elt) form))
(elt (cdr p)))
(setcdr p nil)
(princ "\n(" outbuf)
(let ((print-escape-newlines t)
(print-escape-nonascii t))
(mapcar (lambda (elt)
(prin1 elt outbuf)
(princ " " outbuf))
form))
(princ "\"\\\n" outbuf)
(let ((begin (with-current-buffer outbuf (point))))
(princ (substring (prin1-to-string (car elt)) 1)
outbuf)
;; Insert a backslash before each ( that
;; appears at the beginning of a line in
;; the doc string.
(with-current-buffer outbuf
(save-excursion
(while (search-backward "\n(" begin t)
(forward-char 1)
(insert "\\"))))
(if (null (cdr elt))
(princ ")" outbuf)
(princ " " outbuf)
(princ (substring (prin1-to-string (cdr elt)) 1)
outbuf))
(terpri outbuf)))
(let ((print-escape-newlines t)
(print-escape-nonascii t))
(print form outbuf)))))))
(defun generate-file-autoloads (file) (defun generate-file-autoloads (file)
"Insert at point a loaddefs autoload section for 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
...@@ -237,68 +270,15 @@ are used." ...@@ -237,68 +270,15 @@ are used."
(if (eolp) (if (eolp)
;; Read the next form and make an autoload. ;; Read the next form and make an autoload.
(let* ((form (prog1 (read (current-buffer)) (let* ((form (prog1 (read (current-buffer))
(or (bolp) (forward-line 1)))) (or (bolp) (forward-line 1))))
(autoload-1 (make-autoload form load-name)) (autoload (make-autoload form load-name)))
(autoload (if (eq (car autoload-1) 'progn)
(cadr autoload-1)
autoload-1))
(doc-string-elt (get (car-safe form)
'doc-string-elt)))
(if autoload (if autoload
(setq autoloads-done (cons (nth 1 form) (setq autoloads-done (cons (nth 1 form)
autoloads-done)) autoloads-done))
(setq autoload form)) (setq autoload form))
(if (and doc-string-elt (autoload-print-form autoload))
(stringp (nth doc-string-elt autoload)))
;; We need to hack the printing because the ;; Copy the rest of the line to the output.
;; doc-string must be printed specially for
;; make-docfile (sigh).
(let* ((p (nthcdr (1- doc-string-elt)
autoload))
(elt (cdr p)))
(setcdr p nil)
(princ "\n(" outbuf)
(let ((print-escape-newlines t)
(print-escape-nonascii t))
(mapcar (function (lambda (elt)
(prin1 elt outbuf)
(princ " " outbuf)))
autoload))
(princ "\"\\\n" outbuf)
(let ((begin (save-excursion
(set-buffer outbuf)
(point))))
(princ (substring
(prin1-to-string (car elt)) 1)
outbuf)
;; Insert a backslash before each ( that
;; appears at the beginning of a line in
;; the doc string.
(save-excursion
(set-buffer outbuf)
(save-excursion
(while (search-backward "\n(" begin t)
(forward-char 1)
(insert "\\"))))
(if (null (cdr elt))
(princ ")" outbuf)
(princ " " outbuf)
(princ (substring
(prin1-to-string (cdr elt))
1)
outbuf))
(terpri outbuf)))
(let ((print-escape-newlines t)
(print-escape-nonascii t))
(print autoload outbuf)))
(if (eq (car autoload-1) 'progn)
;; Print the rest of the form
(let ((print-escape-newlines t)
(print-escape-nonascii t))
(mapcar (function (lambda (elt)
(print elt outbuf)))
(cddr autoload-1)))))
;; Copy the rest of the line to the output.
(princ (buffer-substring (princ (buffer-substring
(progn (progn
;; Back up over whitespace, to preserve it. ;; Back up over whitespace, to preserve it.
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment