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)
next prev parent 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.