all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: "Juanma Barranquero" <lekktu@gmail.com>
To: rms@gnu.org
Cc: emacs-devel@gnu.org
Subject: Re: unload-feature questions and thoughts
Date: Thu, 18 Oct 2007 01:39:44 +0200	[thread overview]
Message-ID: <f7ccd24b0710171639u7f2255d7hf875067e1b458462@mail.gmail.com> (raw)
In-Reply-To: <E1Ii13b-0002Ez-7t@fencepost.gnu.org>

On 10/17/07, Richard Stallman <rms@gnu.org> wrote:

> I guess your idea is a good one.  Would you like to implement it?

The implementation is trivial (see the attached patch), other than
updating the docstring of `unload-feature', which I'm unable to do.

             Juanma


2007-10-17  Juanma Barranquero  <lekktu@gmail.com>

	* loadhist.el (unload-function-features-list):
	Rename from `unload-hook-features-list'.
	(unload-hook-features-list): Add as obsolete alias.
	(unload-feature): Use `unload-function-features-list'
	and new FEATURE-unload-function.

Index: lisp/loadhist.el
===================================================================
RCS file: /sources/emacs/emacs/lisp/loadhist.el,v
retrieving revision 1.50
diff -c -b -r1.50 loadhist.el
*** lisp/loadhist.el	17 Oct 2007 23:03:55 -0000	1.50
--- lisp/loadhist.el	17 Oct 2007 23:16:28 -0000
***************
*** 137,147 ****
  `-hook' or `-hooks', from which `unload-feature' tries to remove
  pertinent symbols.")

! (defvar unload-hook-features-list nil
    "List of features of the package being unloaded.

! This is meant to be used by FEATURE-unload-hook hooks, see the
  documentation of `unload-feature' for details.")

  ;;;###autoload
  (defun unload-feature (feature &optional force)
--- 137,149 ----
  `-hook' or `-hooks', from which `unload-feature' tries to remove
  pertinent symbols.")

! (defvar unload-function-features-list nil
    "List of features of the package being unloaded.

! This is meant to be used by FEATURE-unload-function, see the
  documentation of `unload-feature' for details.")
+ (define-obsolete-variable-alias 'unload-hook-features-list
+     'unload-function-features-list "23.1")

  ;;;###autoload
  (defun unload-feature (feature &optional force)
***************
*** 172,190 ****
        (when dependents
  	(error "Loaded libraries %s depend on %s"
  	       (prin1-to-string dependents) file))))
!   (let* ((unload-hook-features-list (feature-symbols feature))
!          (file (pop unload-hook-features-list))
  	 ;; If non-nil, this is a symbol for which we should
  	 ;; restore a previous autoload if possible.
  	 restore-autoload
!          (unload-hook (intern-soft (concat (symbol-name feature)
!                                            "-unload-hook"))))
      ;; Try to avoid losing badly when hooks installed in critical
      ;; places go away.  (Some packages install things on
      ;; `kill-buffer-hook', `activate-menubar-hook' and the like.)
      ;; First off, provide a clean way for package FOO to arrange
      ;; this by adding hooks on the variable `FOO-unload-hook'.
!     (if unload-hook
          (run-hooks unload-hook)
        ;; Otherwise, do our best.  Look through the obarray for symbols
        ;; which seem to be hook variables or special hook functions and
--- 174,198 ----
        (when dependents
  	(error "Loaded libraries %s depend on %s"
  	       (prin1-to-string dependents) file))))
!   (let* ((unload-function-features-list (feature-symbols feature))
!          (file (pop unload-function-features-list))
  	 ;; If non-nil, this is a symbol for which we should
  	 ;; restore a previous autoload if possible.
  	 restore-autoload
! 	 (name (symbol-name feature))
!          (unload-hook (intern-soft (concat name "-unload-hook")))
! 	 (unload-func (intern-soft (concat name "-unload-function"))))
!     ;; If FEATURE-unload-function is defined and returns non-nil,
!     ;; don't try to do anything more; otherwise proceed normally.
!     (unless (and (bound-and-true-p unload-func)
! 		 (funcall unload-func))
        ;; Try to avoid losing badly when hooks installed in critical
        ;; places go away.  (Some packages install things on
        ;; `kill-buffer-hook', `activate-menubar-hook' and the like.)
+       (if unload-hook
  	  ;; First off, provide a clean way for package FOO to arrange
  	  ;; this by adding hooks on the variable `FOO-unload-hook'.
! 	  ;; This is obsolete; FEATURE-unload-function should be used now.
  	  (run-hooks unload-hook)
  	;; Otherwise, do our best.  Look through the obarray for symbols
  	;; which seem to be hook variables or special hook functions and
***************
*** 199,220 ****
  		    (or (and (consp (symbol-value x)) ; Random hooks.
  			     (string-match "-hooks?\\'" (symbol-name x)))
  			(memq x unload-feature-special-hooks)))	; Known abnormal hooks etc.
! 	   (dolist (y unload-hook-features-list)
  	     (when (and (eq (car-safe y) 'defun)
  			(not (get (cdr y) 'autoload)))
  	       (remove-hook x (cdr y)))))))
        ;; Remove any feature-symbols from auto-mode-alist as well.
!       (dolist (y unload-hook-features-list)
  	(when (and (eq (car-safe y) 'defun)
  		   (not (get (cdr y) 'autoload)))
  	  (setq auto-mode-alist
  		(rassq-delete-all (cdr y) auto-mode-alist)))))
      (when (fboundp 'elp-restore-function) ; remove ELP stuff first
!       (dolist (elt unload-hook-features-list)
  	(when (symbolp elt)
  	  (elp-restore-function elt))))

!     (dolist (x unload-hook-features-list)
        (if (consp x)
  	  (case (car x)
  	   ;; Remove any feature names that this file provided.
--- 207,228 ----
  		      (or (and (consp (symbol-value x)) ; Random hooks.
  			       (string-match "-hooks?\\'" (symbol-name x)))
  			  (memq x unload-feature-special-hooks)))	; Known abnormal hooks etc.
! 	     (dolist (y unload-function-features-list)
  	       (when (and (eq (car-safe y) 'defun)
  			  (not (get (cdr y) 'autoload)))
  		 (remove-hook x (cdr y)))))))
  	;; Remove any feature-symbols from auto-mode-alist as well.
! 	(dolist (y unload-function-features-list)
  	  (when (and (eq (car-safe y) 'defun)
  		     (not (get (cdr y) 'autoload)))
  	    (setq auto-mode-alist
  		  (rassq-delete-all (cdr y) auto-mode-alist)))))
        (when (fboundp 'elp-restore-function) ; remove ELP stuff first
! 	(dolist (elt unload-function-features-list)
  	  (when (symbolp elt)
  	    (elp-restore-function elt))))

!       (dolist (x unload-function-features-list)
  	(if (consp x)
  	    (case (car x)
  	      ;; Remove any feature names that this file provided.
***************
*** 247,253 ****
  	(unless (local-variable-if-set-p x)
  	  (makunbound x))))
      ;; Delete the load-history element for this file.
!     (setq load-history (delq (assoc file load-history) load-history)))
    ;; Don't return load-history, it is not useful.
    nil)

--- 255,261 ----
  	  (unless (local-variable-if-set-p x)
  	    (makunbound x))))
        ;; Delete the load-history element for this file.
!       (setq load-history (delq (assoc file load-history) load-history))))
    ;; Don't return load-history, it is not useful.
    nil)

  reply	other threads:[~2007-10-17 23:39 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-02-04 18:03 unload-feature questions and thoughts Juanma Barranquero
2007-02-04 18:32 ` David Kastrup
2007-02-04 19:07   ` Juanma Barranquero
2007-02-04 19:14     ` David Kastrup
2007-02-05  0:10       ` Juanma Barranquero
2007-02-05  7:21         ` David Kastrup
2007-02-05  9:21           ` Juanma Barranquero
2007-02-05  9:32             ` David Kastrup
2007-02-05 11:08               ` Juanma Barranquero
2007-02-05 11:16                 ` David Kastrup
2007-02-05 11:40                   ` Juanma Barranquero
2007-02-06  0:16                 ` Richard Stallman
2007-10-10 11:04                 ` Juanma Barranquero
2007-10-10 14:52                   ` Davis Herring
2007-10-10 16:08                     ` Juanma Barranquero
2007-10-10 17:03                       ` Davis Herring
2007-10-10 17:07                         ` Juanma Barranquero
2007-10-10 17:56                           ` Davis Herring
2007-10-11  5:20                             ` Richard Stallman
2007-10-11  6:39                             ` David Kastrup
2007-10-11 15:16                               ` Juanma Barranquero
2007-10-12 15:59                                 ` Richard Stallman
2007-10-12 17:01                                   ` Juanma Barranquero
2007-10-13  6:41                                     ` Richard Stallman
2007-10-13 10:03                                       ` Juanma Barranquero
2007-10-14 16:28                                         ` Richard Stallman
2007-10-14 22:34                                           ` Juanma Barranquero
2007-10-15 16:03                                             ` Richard Stallman
2007-10-15 16:22                                               ` Juanma Barranquero
2007-10-16  4:10                                                 ` Richard Stallman
2007-10-16  8:15                                                   ` Juanma Barranquero
2007-10-17  5:02                                                     ` Richard Stallman
2007-10-17 23:39                                                       ` Juanma Barranquero [this message]
2007-10-23 19:27                                           ` Davis Herring
2007-10-24  8:32                                             ` Richard Stallman
2007-10-11 16:41                               ` Davis Herring
2007-10-12  2:46                               ` Richard Stallman
2007-10-25 21:24                                 ` David Kastrup
2007-10-28 13:51                                   ` Richard Stallman
2007-10-10 21:03                   ` Richard Stallman
2007-10-10 21:42                     ` Juanma Barranquero
2007-02-05 19:10 ` Richard Stallman
2007-02-05 23:27   ` Juanma Barranquero
2007-02-06 17:09     ` Richard Stallman

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=f7ccd24b0710171639u7f2255d7hf875067e1b458462@mail.gmail.com \
    --to=lekktu@gmail.com \
    --cc=emacs-devel@gnu.org \
    --cc=rms@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this external index

	https://git.savannah.gnu.org/cgit/emacs.git
	https://git.savannah.gnu.org/cgit/emacs/org-mode.git

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.