- (if (or (and (boundp x) ; Random hooks.
- (consp (symbol-value x))
- (string-match "-hooks?\\'" (symbol-name x)))
- (and (fboundp x) ; Known abnormal hooks etc.
- (memq x loadhist-hook-functions)))
- (mapcar (lambda (y) (remove-hook x y))
- (cdr flist))))))
- (mapcar
- (lambda (x)
- (cond ((stringp x) nil)
- ((consp x)
- ;; Remove any feature names that this file provided.
- (if (eq (car x) 'provide)
- (setq features (delq (cdr x) features))))
- ((boundp x) (makunbound x))
- ((fboundp x)
- (fmakunbound x)
- (let ((aload (get x 'autoload)))
- (if aload (fset x (cons 'autoload aload)))))))
- (cdr flist))
+ (when (and (boundp x)
+ (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)
+ (cond
+ ;; Remove any feature names that this file provided.
+ ((eq (car x) 'provide)
+ (setq features (delq (cdr x) features)))
+ ((eq (car x) 'defun)
+ (let ((fun (cdr x)))
+ (when (fboundp fun)
+ (when (fboundp 'ad-unadvise)
+ (ad-unadvise fun))
+ (fmakunbound fun)
+ (let ((aload (get fun 'autoload)))
+ (when aload
+ (fset fun (cons 'autoload aload))))))))
+ ;; Kill local values as much as possible.
+ (dolist (buf (buffer-list))
+ (with-current-buffer buf
+ (kill-local-variable x)))
+ ;; Get rid of the default binding if we can.
+ (unless (local-variable-if-set-p x)
+ (makunbound x))))