X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/1edbbf8a47461567f8fabf28c17bf2a25e561474..6a70ef0d8173b57817bcc8a013eb86c8583e74fc:/lisp/woman.el diff --git a/lisp/woman.el b/lisp/woman.el index 1fa337e852..134721c0ad 100644 --- a/lisp/woman.el +++ b/lisp/woman.el @@ -7,7 +7,7 @@ ;; Keywords: help, man, UN*X, manual ;; Adapted-By: Eli Zaretskii ;; Version: see `woman-version' -;; URL: http://centaur.maths.qmw.ac.uk/Emacs/ +;; URL: http://centaur.maths.qmw.ac.uk/Emacs/WoMan/ ;; This file is part of GNU Emacs. @@ -417,6 +417,7 @@ ;; Paul A. Thompson ;; Arrigo Triulzi ;; Geoff Voelker +;; Eli Zaretskii (defvar woman-version "0.54 (beta)" "WoMan version information.") @@ -432,37 +433,35 @@ (require 'apropos)) (defun woman-mapcan (fn x) - "Return concatenated list of FN applied to successive CAR elements of X. + "Return concatenated list of FN applied to successive `car' elements of X. FN must return a list, cons or nil. Useful for splicing into a list." ;; Based on the Standard Lisp function MAPCAN but with args swapped! (and x (nconc (funcall fn (car x)) (woman-mapcan fn (cdr x))))) (defun woman-parse-colon-path (cd-path) "Explode a search path CD-PATH into a list of directory names. -If the platform is Microsoft Windows and no path contains `\\' then -assume a Cygwin-style colon-separated search path and convert any -leading drive specifier `//X/' to `X:', otherwise assume paths -separated by `path-separator'." - ;; Based on a suggestion by Jari Aalto. - (woman-mapcan ; splice into list... - (lambda (path) - ;; parse-colon-path returns nil for a null path component and - ;; an empty substring of MANPATH denotes the default list... - (if path (cons path nil) (woman-parse-man.conf))) - (if (and (memq system-type '(windows-nt ms-dos)) - (not (or (string-match ";" cd-path) - (string-match "\\\\" cd-path)))) - (let ((path-separator ":")) - (mapcar - (lambda (path) ; //a/b -> a:/b - (cond ((and path (string-match "\\`//./" path)) - (setq path (substring path 1)) ; //a/b -> /a/b - (aset path 0 (aref path 1)) ; /a/b -> aa/b - (aset path 1 ?:) ; aa/b -> a:/b - )) - path) - (parse-colon-path cd-path))) - (parse-colon-path cd-path)))) +Replace null components by calling `woman-parse-man.conf'. +Allow UN*X-style search paths on Microsoft platforms, i.e. allow path +elements to be separated by colons and convert Cygwin-style drive +specifiers `//x/' to `x:'." + ;; Based on suggestions by Jari Aalto and Eli Zaretskii. + (mapcar + (lambda (path) ; //a/b -> a:/b + (when (and path (string-match "\\`//./" path)) + (setq path (substring path 1)) ; //a/b -> /a/b + (aset path 0 (aref path 1)) ; /a/b -> aa/b + (aset path 1 ?:)) ; aa/b -> a:/b + path) + (woman-mapcan ; splice into list... + (lambda (path) + ;; parse-colon-path returns nil for a null path component and + ;; an empty substring of MANPATH denotes the default list... + (if path (list path) (woman-parse-man.conf))) + (if (and (memq system-type '(windows-nt ms-dos)) + (not (string-match ";" cd-path))) + (let ((path-separator ":")) + (parse-colon-path cd-path)) + (parse-colon-path cd-path))))) ;;; User options: @@ -501,7 +500,7 @@ Change only via `Customization' or the function `add-hook'." :group 'woman) (defcustom woman-man.conf-path - '("/etc" "/usr/local/lib") + '("/etc" "/etc/manpath.config" "/usr/local/lib") "*List of dirs to search and/or files to try for man config file. Default is '(\"/etc\" \"/usr/local/lib\") [for GNU/Linux, Cygwin resp.] A trailing separator (`/' for UNIX etc.) on directories is optional @@ -513,10 +512,16 @@ instead to provide a default value for `woman-manpath'." :group 'woman-interface) (defun woman-parse-man.conf () - "Parse man config file if found. (Used only if MANPATH is not set.) + "Parse if possible Linux-style configuration file for man command. +Used only if MANPATH is not set or contains null components. Look in `woman-man.conf-path' and return a value for `woman-manpath'. Concatenate data from all lines in the config file of the form -MANPATH /usr/man" + + MANPATH /usr/man + +or + + MANDATORY_MANPATH /usr/man" ;; Functionality suggested by Charles Curley. (let ((path woman-man.conf-path) file manpath) @@ -534,8 +539,8 @@ MANPATH /usr/man" (with-temp-buffer (insert-file-contents file) (while (re-search-forward - "^[ \t]*MANPATH[ \t]+\\(\\S-+\\)" nil t) - (setq manpath (cons (match-string 1) manpath))) + "^[ \t]*\\(MANDATORY_\\)?MANPATH[ \t]+\\(\\S-+\\)" nil t) + (setq manpath (cons (match-string 2) manpath))) manpath)) )) (setq path (cdr path))) @@ -546,7 +551,7 @@ MANPATH /usr/man" (or (and manpath (woman-parse-colon-path manpath)) (woman-parse-man.conf) - '("/usr/man" "/usr/local/man") + '("/usr/man" "/usr/share/man" "/usr/local/man") )) "*List of DIRECTORY TREES to search for UN*X manual files. Each element should be the name of a directory that contains @@ -752,9 +757,9 @@ Should begin with \\. and end with \\' and MUST NOT be optional." :set 'set-woman-file-regexp :group 'woman-interface) -(defcustom woman-use-own-frame - (or (and (fboundp 'display-graphic-p) (display-graphic-p)) - (memq window-system '(x w32))) +(defcustom woman-use-own-frame ; window-system + (or (and (fboundp 'display-graphic-p) (display-graphic-p)) ; Emacs 21 + (memq window-system '(x w32))) ; Emacs 20 "*If non-nil then use a dedicated frame for displaying WoMan windows. Only useful when run on a graphic display such as X or MS-Windows." :type 'boolean @@ -876,7 +881,7 @@ Default: foreground orange." ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Experimental font support, initially only for MS-Windows. (defconst woman-font-support - (eq window-system 'w32) ; Support X later! + (eq window-system 'w32) ; Support X later! "If non-nil then non-ASCII characters and symbol font supported.") (defun woman-select-symbol-fonts (fonts) @@ -1337,36 +1342,30 @@ The cdr of each alist element is the path-index / filename." ;; Uniquefy topics: (woman-topic-all-completions-merge files))) -(defsubst woman-list-n (n &rest args) - "Return a list of at most the first N of the arguments ARGS. -Treats N < 1 as if N = 1." - (if (< n (length args)) - (setcdr (nthcdr (1- n) args) nil)) - args) - (defun woman-topic-all-completions-1 (dir path-index) - "Return an alist of the man files in directory DIR with index PATH-INDEX. -The `cdr' of each alist element is the path-index / filename." - ;; *** NEED case-fold-search t HERE ??? - (let ((old (directory-files dir nil woman-file-regexp)) - new file) - ;; Convert list to alist of non-directory files: - (while old - (setq file (car old) - old (cdr old)) - (if (file-directory-p file) - () - (setq new (cons - (woman-list-n - woman-cache-level - (file-name-sans-extension - (if (string-match woman-file-compression-regexp file) - (file-name-sans-extension file) - file)) - path-index - file) - new)))) - new)) + "Return an alist of the man topics in directory DIR with index PATH-INDEX. +A topic is a filename sans type-related extensions. +Support 3 levels of caching: each element of the alist will be a list +of the first `woman-cache-level' elements from the following list: +\(topic path-index filename)." + ;; This function used to check that each file in the directory was + ;; not itself a directory, but this is very slow and should be + ;; unnecessary. So let us assume that `woman-file-regexp' will + ;; filter out any directories, which probably should not be there + ;; anyway, i.e. it is a user error! + (mapcar + (lambda (file) + (cons + (file-name-sans-extension + (if (string-match woman-file-compression-regexp file) + (file-name-sans-extension file) + file)) + (if (> woman-cache-level 1) + (cons + path-index + (if (> woman-cache-level 2) + (cons file nil)))))) + (directory-files dir nil woman-file-regexp))) (defun woman-topic-all-completions-merge (alist) "Merge the alist ALIST so that the keys are unique. @@ -1446,7 +1445,7 @@ Also make each path-info component into a list. (mapcar 'list files) )) - + ;;; dired support (defun woman-dired-define-key (key) @@ -1624,9 +1623,23 @@ Do not call directly!" (while (re-search-forward "^[ \t]*\n\\([ \t]*\n\\)+" nil t) (replace-match "\n" t t)) + ;; CJK characters are underlined by double-sized "__". + ;; (Code lifted from man.el, with trivial changes.) + (if (< (buffer-size) (position-bytes (point-max))) + ;; Multibyte characters exist. + (progn + (goto-char (point-min)) + (while (search-forward "__\b\b" nil t) + (backward-delete-char 4) + (woman-set-face (point) (1+ (point)) 'woman-italic-face)) + (goto-char (point-min)) + (while (search-forward "\b\b__" nil t) + (backward-delete-char 4) + (woman-set-face (1- (point)) (point) 'woman-italic-face)))) + ;; Interpret overprinting to indicate bold face: (goto-char (point-min)) - (while (re-search-forward "\\(.\\)\\(\\(\\1\\)+\\)" nil t) + (while (re-search-forward "\\(.\\)\\(\\(+\\1\\)+\\)" nil t) (woman-delete-match 2) (woman-set-face (1- (point)) (point) 'woman-bold-face)) @@ -4477,5 +4490,6 @@ logging the message." ;; Comment order and doc strings changed substantially. ;; MS-DOS support added (by Eli Zaretskii). ;; checkdoc run: no real errors. +;; woman topic interface speeded up. ;;; woman.el ends here