diff -u /home/gg/bug/info-look-parent/info-look.el.orig /home/gg/bug/info-look-parent/info-look.el --- /home/gg/bug/info-look-parent/info-look.el.orig 2012-09-09 07:58:12.000000000 +1000 +++ /home/gg/bug/info-look-parent/info-look.el 2013-02-16 10:47:30.000000000 +1100 @@ -298,6 +298,21 @@ (when (string-match (caar file-name-alist) file-name) (setq info-lookup-mode (cdar file-name-alist))) (setq file-name-alist (cdr file-name-alist))))) + + ;; If major-mode has no setups in info-lookup-alist, under any topic, then + ;; search up through derived-mode-parent to find a parent mode which does + ;; have some setups. This means that a `define-derived-mode' with no + ;; setups of its own will select its parent mode for lookups, if one of + ;; its parents has some setups. Good for example on `makefile-gmake-mode' + ;; and similar derivatives of `makefile-mode'. + ;; + (let ((mode major-mode)) ;; look for `mode' with some setups + (while (and mode (not info-lookup-mode)) + (dolist (topic-cell info-lookup-alist) ;; usually only two topics here + (if (info-lookup->mode-value (car topic-cell) mode) + (setq info-lookup-mode mode))) + (setq mode (get mode 'derived-mode-parent)))) + (or info-lookup-mode (setq info-lookup-mode major-mode))) (defun info-lookup-change-mode (topic) Diff finished. Sat Feb 16 10:48:55 2013