- (let* ((start (list "/usr/local/lib/info/"
- ;; This comes second so that, if it is the same
- ;; as configure-info-directory (which is usually true)
- ;; and Emacs has been installed (also usually true)
- ;; then the list will end with two copies of this;
- ;; which means that the last dir file Info-insert-dir
- ;; finds will be the one in this directory.
- "/usr/local/info/"))
- ;; Typically on a GNU system, installed info files are found
- ;; in /usr/info, but the default prefix is /usr/local.
- ;; (Standalone info has a long list of alternative
- ;; directories to search; perhaps we should try to be more
- ;; consistent.)
- (usrdir "/usr/info")
- (sysdir (and (file-directory-p usrdir)
- (not (string= configure-info-directory usrdir))
- (list usrdir)))
- (configdir (file-name-as-directory configure-info-directory)))
- ;; configdir comes last so that we can identify it as such, but we
- ;; also we override sysdir, hence the two occurrences.
- (setq start (nconc start (list configdir) sysdir (list configdir)))
- start)
+ (let* ((config-dir
+ (file-name-as-directory configure-info-directory))
+ (config
+ (list config-dir))
+ (unpruned-prefixes
+ ;; Directory trees that may not exist at installation time, and
+ ;; so shouldn't be pruned based on existance.
+ '("/usr/local/"))
+ (prefixes
+ ;; Directory trees in which to look for info subdirectories
+ (prune-directory-list '("/usr/local/" "/usr/" "/opt/" "/")
+ unpruned-prefixes))
+ (suffixes
+ ;; Subdirectories in each directory tree that may contain info
+ ;; directories.
+ '("" "share/" "gnu/" "gnu/lib/" "gnu/lib/emacs/"
+ "emacs/" "lib/" "lib/emacs/"))
+ (standard-info-dirs
+ (apply #'nconc
+ (mapcar (lambda (pfx)
+ (let ((dirs
+ (mapcar (lambda (sfx)
+ (concat pfx sfx "info/"))
+ suffixes)))
+ (if (member pfx unpruned-prefixes)
+ dirs
+ (prune-directory-list dirs config))))
+ prefixes))))
+ ;; If $(prefix)/info is not one of the standard info directories,
+ ;; they are probably installing an experimental version of Emacs,
+ ;; so make sure that experimental version's Info files override
+ ;; the ones in standard directories.
+ (if (member config-dir standard-info-dirs)
+ (nconc standard-info-dirs config)
+ (cons config-dir standard-info-dirs)))