[COMMIT 21.4] Move operator definitions to autoload-operators.el and use them

Vin Shelton acs at xemacs.org
Sat Dec 27 20:53:06 EST 2008


COMMIT 21.4

On Tue, Dec 23, 2008 at 11:52 PM, Vin Shelton <acs at xemacs.org> wrote:
> Here's what I cobbled together based on Mike's 21.5 patch.  Please
> review.
>
> Regards,
>  Vin
>
> lisp/ChangeLog addition:
>
> 2008-12-23  Vin Shelton  <acs at xemacs.org>
>
>        * autoload.el: Move operator definitions to autoload-operators.el
>        in the xemacs-base package.
>
>
> 21.4 source patch:
> Diff command:   cvs -q diff -u
> Files affected: lisp/autoload.el
>
> Index: lisp/autoload.el
> ===================================================================
> RCS file: /pack/xemacscvs/XEmacs/xemacs/lisp/autoload.el,v
> retrieving revision 1.5.2.2
> diff -a -u -u -r1.5.2.2 autoload.el
> --- lisp/autoload.el    2002/08/20 11:34:34     1.5.2.2
> +++ lisp/autoload.el    2008/12/24 04:33:04
> @@ -39,33 +39,100 @@
>
>  ;;; Code:
>
> +;; Need to load easy-mmode because we expand macro calls to easy-mmode
> +;; macros in make-autoloads below.
> +(require 'easy-mmode)
> +
> +; Add operator definitions to autoload-operators.el in the xemacs-base
> +; package.
> +(eval-when-compile (load "cl-macs"))
> +(ignore-errors (require 'autoload-operators))
> +
> +; As autoload-operators is new, provide stopgap measure for a while.
> +(if (not (boundp 'autoload-make-autoload-operators))
> +    (progn
> +      (defvar autoload-make-autoload-operators
> +       '(defun define-skeleton defmacro define-derived-mode define-generic-mode
> +         easy-mmode-define-minor-mode easy-mmode-define-global-mode
> +         define-minor-mode defun* defmacro*)
> +       "`defun'-like operators that use `autoload' to load the library.")
> +
> +      (defvar autoload-make-autoload-complex-operators
> +       '(easy-mmode-define-minor-mode easy-mmode-define-global-mode
> +         define-minor-mode)
> +       "`defun'-like operators to macroexpand before using `autoload'.")
> +
> +      (put 'autoload 'doc-string-elt 3)
> +      (put 'defun    'doc-string-elt 3)
> +      (put 'defun*   'doc-string-elt 3)
> +      (put 'defvar   'doc-string-elt 3)
> +      (put 'defcustom '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 'define-skeleton 'doc-string-elt 2)
> +      (put 'define-derived-mode 'doc-string-elt 4)
> +      (put 'easy-mmode-define-minor-mode 'doc-string-elt 2)
> +      (put 'define-minor-mode 'doc-string-elt 2)
> +      (put 'define-generic-mode 'doc-string-elt 7)
> +      ;; defin-global-mode has no explicit docstring.
> +      (put 'easy-mmode-define-global-mode 'doc-string-elt 1000)))
> +
>  (defun make-autoload (form file)
> -  "Turn a definition generator FORM into an autoload for source file FILE.
> -Returns nil if FORM is not a defun, define-skeleton, define-derived-mode,
> -or defmacro."
> -  (let ((car (car-safe form)))
> -    (if (memq car '(defun define-skeleton defmacro define-derived-mode))
> -       (let ((macrop (eq car 'defmacro))
> -             name doc)
> -         (setq form (cdr form)
> -               name (car form)
> -               ;; Ignore the arguments.
> -               form (cdr (cond ((eq car 'define-skeleton)
> -                                form)
> -                               ((eq car 'define-derived-mode)
> -                                (cddr form))
> -                               (t
> -                                (cdr form))))
> -               doc (car form))
> -         (if (stringp doc)
> -             (setq form (cdr form))
> -           (setq doc nil))
> -         (list 'autoload (list 'quote name) file doc
> -               (or (eq car 'define-skeleton)
> -                   (eq car 'define-derived-mode)
> -                   (eq (car-safe (car form)) 'interactive))
> -               (if macrop (list 'quote 'macro) nil)))
> -      nil)))
> +  "Turn FORM into an autoload or defvar for source file FILE.
> +Returns nil if FORM is not a special autoload form (i.e. a function definition
> +or macro definition or a defcustom)."
> +  (let ((car (car-safe form)) expand)
> +    (cond
> +     ;; For complex cases, try again on the macro-expansion.
> +     ((and (memq car autoload-make-autoload-complex-operators)
> +          (setq expand (let ((load-file-name file)) (macroexpand form)))
> +          (eq (car expand) 'progn)
> +          (memq :autoload-end expand))
> +      (let ((end (memq :autoload-end expand)))
> +       ;; Cut-off anything after the :autoload-end marker.
> +       (setcdr end nil)
> +       (cons 'progn
> +             (mapcar (lambda (form) (make-autoload form file))
> +                     (cdr expand)))))
> +
> +     ;; For special function-like operators, use the `autoload' function.
> +     ((memq car autoload-make-autoload-operators)
> +      (let* ((macrop (memq car '(defmacro defmacro*)))
> +            (name (nth 1 form))
> +            (body (nthcdr (get car 'doc-string-elt) form))
> +            (doc (if (stringp (car body)) (pop body))))
> +       ;; `define-generic-mode' quotes the name, so take care of that
> +       (list 'autoload (if (listp name) name (list 'quote name)) file doc
> +             (or (and (memq car '(define-skeleton define-derived-mode
> +                                   define-generic-mode
> +                                   easy-mmode-define-global-mode
> +                                   easy-mmode-define-minor-mode
> +                                   define-minor-mode)) t)
> +                 (eq (car-safe (car body)) 'interactive))
> +             (if macrop (list 'quote 'macro) nil))))
> +
> +     ;; Convert defcustom to a simpler (and less space-consuming) defvar,
> +     ;; but add some extra stuff if it uses :require.
> +     ((eq car 'defcustom)
> +      (let ((varname (car-safe (cdr-safe form)))
> +           (init (car-safe (cdr-safe (cdr-safe form))))
> +           (doc (car-safe (cdr-safe (cdr-safe (cdr-safe form)))))
> +           (rest (cdr-safe (cdr-safe (cdr-safe (cdr-safe form))))))
> +       (if (not (plist-get rest :require))
> +           `(defvar ,varname ,init ,doc)
> +         `(progn
> +            (defvar ,varname ,init ,doc)
> +            (custom-add-to-group ,(plist-get rest :group)
> +                                 ',varname 'custom-variable)
> +            (custom-add-load ',varname
> +                             ,(plist-get rest :require))))))
> +     ;; Coding systems. #### Would be nice to handle the docstring here too.
> +     ((memq car '(make-coding-system make-8-bit-coding-system))
> +      `(autoload-coding-system ,(nth 1 form) '(load ,file)))
> +     ;; nil here indicates that this is not a special autoload form.
> +     (t nil))))
>
>  (defvar generate-autoload-cookie ";;;###autoload"
>   "Magic comment indicating the following form should be autoloaded.
> @@ -91,32 +158,6 @@
>   "String which indicates the end of the section of autoloads for a file.")
>
>  (defvar autoload-package-name nil)
> -
> -;;; Forms which have doc-strings which should be printed specially.
> -;;; A doc-string-elt property of ELT says that (nth ELT FORM) is
> -;;; the doc-string in FORM.
> -;;;
> -;;; There used to be the following note here:
> -;;; ;;; Note: defconst and defvar should NOT be marked in this way.
> -;;; ;;; We don't want to produce defconsts and defvars that
> -;;; ;;; make-docfile can grok, because then it would grok them twice,
> -;;; ;;; once in foo.el (where they are given with ;;;###autoload) and
> -;;; ;;; once in loaddefs.el.
> -;;;
> -;;; Counter-note: Yes, they should be marked in this way.
> -;;; make-docfile only processes those files that are loaded into the
> -;;; dumped Emacs, and those files should never have anything
> -;;; autoloaded here.  The above-feared problem only occurs with files
> -;;; which have autoloaded entries *and* are processed by make-docfile;
> -;;; there should be no such files.
> -
> -(put 'autoload 'doc-string-elt 3)
> -(put 'defun    'doc-string-elt 3)
> -(put 'defvar   'doc-string-elt 3)
> -(put 'defconst 'doc-string-elt 3)
> -(put 'defmacro 'doc-string-elt 3)
> -(put 'define-skeleton 'doc-string-elt 3)
> -(put 'define-derived-mode 'doc-string-elt 4)
>
>  (defun autoload-trim-file-name (file)
>   "Returns a relative pathname of FILE including the last directory."
>
> _______________________________________________
> XEmacs-Patches mailing list
> XEmacs-Patches at xemacs.org
> http://calypso.tux.org/cgi-bin/mailman/listinfo/xemacs-patches
>




More information about the XEmacs-Patches mailing list