diff options
Diffstat (limited to 'lisp')
-rw-r--r-- | lisp/subr.el | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/lisp/subr.el b/lisp/subr.el index 9e880bc880e..4c05111f516 100644 --- a/lisp/subr.el +++ b/lisp/subr.el @@ -1918,11 +1918,15 @@ Only affects hooks run in the current buffer." ;; PUBLIC: find if the current mode derives from another. (defun provided-mode-derived-p (mode &rest modes) - "Non-nil if MODE is derived from one of MODES. + "Non-nil if MODE is derived from one of MODES or their aliases. Uses the `derived-mode-parent' property of the symbol to trace backwards. If you just want to check `major-mode', use `derived-mode-p'." - (while (and (not (memq mode modes)) - (setq mode (get mode 'derived-mode-parent)))) + (while + (and + (not (memq mode modes)) + (let* ((parent (get mode 'derived-mode-parent)) + (parentfn (symbol-function parent))) + (setq mode (if (and parentfn (symbolp parentfn)) parentfn parent))))) mode) (defun derived-mode-p (&rest modes) |