# HG changeset patch # User David Kastrup # Date 1175354534 0 # Node ID 4a7ae61207d24af57f64cc981b4ee52ac6e8142d # Parent 53f6b50e0fb3957354a6e0257a672f5a4998c42b * woman.el (woman-Cyg-to-Win): Don't convert cons cells corresponding to MANPATH_MAP entries. (woman-man.conf-path, woman-parse-man.conf): Doc fix. (woman-parse-man.conf): Use more discriminating man.conf name. (woman-parse-man.conf): Parse MANPATH_MAP entries. (woman-manpath): Doc fix and type fix. (woman-cached-data): Check for MANPATH_MAP entries. (woman-expand-directory-path): Treat MANPATH_MAP entries. * woman.texi (Topic, Interface Options): Explain changes semantics of woman-manpath in order to consider MANPATH_MAP entries. diff -r 53f6b50e0fb3 -r 4a7ae61207d2 lisp/ChangeLog --- a/lisp/ChangeLog Sat Mar 31 14:43:01 2007 +0000 +++ b/lisp/ChangeLog Sat Mar 31 15:22:14 2007 +0000 @@ -1,3 +1,14 @@ +2007-03-31 David Kastrup + + * woman.el (woman-Cyg-to-Win): Don't convert cons cells + corresponding to MANPATH_MAP entries. + (woman-man.conf-path, woman-parse-man.conf): Doc fix. + (woman-parse-man.conf): Use more discriminating man.conf name. + (woman-parse-man.conf): Parse MANPATH_MAP entries. + (woman-manpath): Doc fix and type fix. + (woman-cached-data): Check for MANPATH_MAP entries. + (woman-expand-directory-path): Treat MANPATH_MAP entries. + 2007-03-31 Stuart Herring * emacs-lisp/sregex.el (sregexq): Doc fix. diff -r 53f6b50e0fb3 -r 4a7ae61207d2 lisp/woman.el --- a/lisp/woman.el Sat Mar 31 14:43:01 2007 +0000 +++ b/lisp/woman.el Sat Mar 31 15:22:14 2007 +0000 @@ -486,24 +486,28 @@ (defun woman-Cyg-to-Win (file) "Convert an absolute filename FILE from Cygwin to Windows form." - ;; Code taken from w32-symlinks.el - (if (eq (aref file 0) ?/) - ;; Try to use Cygwin mount table via `cygpath.exe'. - (condition-case nil - (with-temp-buffer - ;; cygpath -m file - (call-process "cygpath" nil t nil "-m" file) - (buffer-substring 1 (buffer-size))) - (error - ;; Assume no `cygpath' program available. - ;; Hack /cygdrive/x/ or /x/ or (obsolete) //x/ to x:/ - (when (string-match "\\`\\(/cygdrive\\|/\\)?/./" file) - (if (match-string 1) ; /cygdrive/x/ or //x/ -> /x/ - (setq file (substring file (match-end 1)))) - (aset file 0 (aref file 1)) ; /x/ -> xx/ - (aset file 1 ?:)) ; xx/ -> x:/ - file)) - file)) + ;; MANPATH_MAP conses are not converted since they presumably map + ;; Cygwin to Cygwin form. + (if (consp file) + file + ;; Code taken from w32-symlinks.el + (if (eq (aref file 0) ?/) + ;; Try to use Cygwin mount table via `cygpath.exe'. + (condition-case nil + (with-temp-buffer + ;; cygpath -m file + (call-process "cygpath" nil t nil "-m" file) + (buffer-substring 1 (buffer-size))) + (error + ;; Assume no `cygpath' program available. + ;; Hack /cygdrive/x/ or /x/ or (obsolete) //x/ to x:/ + (when (string-match "\\`\\(/cygdrive\\|/\\)?/./" file) + (if (match-string 1) ; /cygdrive/x/ or //x/ -> /x/ + (setq file (substring file (match-end 1)))) + (aset file 0 (aref file 1)) ; /x/ -> xx/ + (aset file 1 ?:)) ; xx/ -> x:/ + file)) + file))) ;;; User options: @@ -547,11 +551,12 @@ (mapcar 'woman-Cyg-to-Win path) path)) "*List of dirs to search and/or files to try for man config file. -A trailing separator (`/' for UNIX etc.) on directories is optional, -and the filename is used if a directory specified is the first to -contain the strings \"man\" and \".conf\" (in that order). -If MANPATH is not set but a config file is found then it is parsed -instead to provide a default value for `woman-manpath'." +A trailing separator (`/' for UNIX etc.) on directories is +optional, and the filename is used if a directory specified is +the first to start with \"man\" and has an extension starting +with \".conf\". If MANPATH is not set but a config file is found +then it is parsed instead to provide a default value for +`woman-manpath'." :type '(repeat string) :group 'woman-interface) @@ -564,7 +569,9 @@ or MANDATORY_MANPATH /usr/man or - OPTIONAL_MANPATH /usr/man" + OPTIONAL_MANPATH /usr/man +or + MANPATH_MAP /opt/bin /opt/man" ;; Functionality suggested by Charles Curley. (let ((path woman-man.conf-path) file manpath) @@ -576,7 +583,7 @@ (or (not (file-directory-p file)) (and (setq file - (directory-files file t "man.*\\.conf" t)) + (directory-files file t "\\`man.*\\.conf[a-z]*\\'" t)) (file-readable-p (setq file (car file))))) ;; Parse the file -- if no MANPATH data ignore it: (with-temp-buffer @@ -584,8 +591,13 @@ (while (re-search-forward ;; `\(?: ... \)' is a "shy group" "\ -^[ \t]*\\(?:MANDATORY_\\|OPTIONAL_\\)?MANPATH[ \t]+\\(\\S-+\\)" nil t) - (setq manpath (cons (match-string 1) manpath))) +^[ \t]*\\(?:\\(?:MANDATORY_\\|OPTIONAL_\\)?MANPATH[ \t]+\\(\\S-+\\)\\|\ +MANPATH_MAP[ \t]+\\(\\S-+\\)[ \t]+\\(\\S-+\\)\\)" nil t) + (add-to-list 'manpath + (if (match-beginning 1) + (match-string 1) + (cons (match-string 2) + (match-string 3))))) manpath)) )) (setq path (cdr path))) @@ -600,6 +612,11 @@ selected by the value of `woman-manpath-man-regexp'. Non-directory and unreadable files are ignored. +Elements can also be a cons cell indicating a mapping from PATH +to manual trees: if such an element's car is equal to a path +element of the environment variable PATH, the cdr of the cons +cell is included in the directory tree search. + If not set then the environment variable MANPATH is used. If no such environment variable is found, the default list is determined by consulting the man configuration file if found, which is determined by @@ -618,7 +635,7 @@ The MANPATH environment variable may be set using DOS semi-colon- separated or UN*X/Cygwin colon-separated syntax (but not mixed)." - :type '(repeat string) + :type '(repeat (choice string (cons string string))) :group 'woman-interface) (defcustom woman-manpath-man-regexp "[Mm][Aa][Nn]" @@ -1159,7 +1176,14 @@ Called both to generate and to check the cache!" ;; Must use substituted paths because values of env vars may change! (list woman-cache-level - (mapcar 'substitute-in-file-name woman-manpath) + (let (lst path) + (dolist (dir woman-manpath (nreverse lst)) + (when (consp dir) + (unless path + (setq path + (split-string (getenv "PATH") path-separator t))) + (setq dir (and (member (car dir) path) (cdr dir)))) + (when dir (add-to-list 'lst (substitute-in-file-name dir))))) (mapcar 'substitute-in-file-name woman-path))) (defun woman-read-directory-cache () @@ -1320,10 +1344,15 @@ ;; Allow each path to be a single string or a list of strings: (if (not (listp woman-manpath)) (setq woman-manpath (list woman-manpath))) (if (not (listp woman-path)) (setq woman-path (list woman-path))) - (let (dir head dirs) + (let (dir head dirs path) (while woman-manpath (setq dir (car woman-manpath) woman-manpath (cdr woman-manpath)) + (when (consp dir) + (unless path + (setq path (split-string (getenv "PATH") path-separator t))) + (setq dir (and (member (car dir) path) + (cdr dir)))) (if (and dir (woman-file-readable-p dir)) ;; NB: `parse-colon-path' creates null elements for ;; redundant (semi-)colons and trailing `/'s! diff -r 53f6b50e0fb3 -r 4a7ae61207d2 man/ChangeLog --- a/man/ChangeLog Sat Mar 31 14:43:01 2007 +0000 +++ b/man/ChangeLog Sat Mar 31 15:22:14 2007 +0000 @@ -1,3 +1,8 @@ +2007-03-31 David Kastrup + + * woman.texi (Topic, Interface Options): Explain changes semantics of + woman-manpath in order to consider MANPATH_MAP entries. + 2007-03-31 Eli Zaretskii * misc.texi (Printing): Postscript -> PostScript. diff -r 53f6b50e0fb3 -r 4a7ae61207d2 man/woman.texi --- a/man/woman.texi Sat Mar 31 14:43:01 2007 +0000 +++ b/man/woman.texi Sat Mar 31 15:22:14 2007 +0000 @@ -386,9 +386,9 @@ UNIX, then WoMan parses that. Otherwise, if WoMan can find a configuration file named (by default) @file{man.conf} (or something very similar), which seems to be the standard mechanism under GNU/Linux, then -it parses that. To be precise, ``something very similar'' means having -two name components separated by a dot and respectively containing -@samp{man} and beginning with @samp{conf}, e.g.@: @file{manual.configuration}. +it parses that. To be precise, ``something very similar'' means +starting with @samp{man} and ending with @samp{.conf} and possibly more +lowercase letters, e.g.@: @file{manual.configuration}. The search path and/or precise full path name for this file are set by the value of the customizable user option @code{woman-man.conf-path}. If all else fails, WoMan uses a plausible default man search path. @@ -407,7 +407,10 @@ @emph{directly}. Secondly, the last directory component of each element of @code{woman-path} is treated as a regular (Emacs) match expression rather than a fixed name, which allows collections of related -directories to be specified succinctly. +directories to be specified succinctly. Also, elements of +@code{woman-manpath} can be conses, indicating a mapping from +@samp{PATH} environment variable components to man directory +hierarchies. For topic completion to work, WoMan must build a list of all the manual files that it can access, which can be very slow, especially if a @@ -943,7 +946,9 @@ manual files. Each element should be the name of a directory that contains subdirectories of the form @file{man?}, or more precisely subdirectories selected by the value of @code{woman-manpath-man-regexp}. -Non-directory and unreadable files are ignored. +Non-directory and unreadable files are ignored. This can also contain +conses, with the car indicating a @code{PATH} variable component mapped +to the directory tree given in the cdr. @cindex @code{MANPATH}, environment variable If not set then the environment variable @code{MANPATH} is used. If no