+;; Read in and display parts of Unix manual.
+;; Copyright (C) 1985 Richard M. Stallman.
+
+;; This file is part of GNU Emacs.
+
+;; GNU Emacs is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY. No author or distributor
+;; accepts responsibility to anyone for the consequences of using it
+;; or for whether it serves any particular purpose or works at all,
+;; unless he says so in writing. Refer to the GNU Emacs General Public
+;; License for full details.
+
+;; Everyone is granted permission to copy, modify and redistribute
+;; GNU Emacs, but only under the conditions described in the
+;; GNU Emacs General Public License. A copy of this license is
+;; supposed to have been given to you along with GNU Emacs so you
+;; can know your rights and responsibilities. It should be in a
+;; file named COPYING. Among other things, the copyright notice
+;; and this notice must be preserved on all copies.
+
+
+(defun manual-entry (topic &optional section)
+ "Display the Unix manual entry for TOPIC."
+ (interactive "sManual entry (topic): ")
+ (if (and (null section)
+ (string-match "\\`[ \t]*\\([^( \t]+\\)[ \t]*(\\(.+\\))[ \t]*\\'" topic))
+ (setq section (substring topic (match-beginning 2)
+ (match-end 2))
+ topic (substring topic (match-beginning 1)
+ (match-end 1))))
+ (with-output-to-temp-buffer "*Manual Entry*"
+ (buffer-flush-undo standard-output)
+ (save-excursion
+ (set-buffer standard-output)
+ (message "Looking for formatted entry for %s%s..."
+ topic (if section (concat "(" section ")") ""))
+ (let ((dirlist '("/usr/man/cat1"
+ "/usr/man/cat2" "/usr/man/cat3" "/usr/man/cat4"
+ "/usr/man/cat5" "/usr/man/cat6" "/usr/man/cat7"
+ "/usr/man/cat8" "/usr/man/catl" "/usr/man/catn"))
+ name)
+ (if (and section (file-exists-p
+ (setq name (concat "/usr/man/cat" (aref section 0)
+ "/"
+ topic "." section))))
+ (insert-file-contents name)
+ (while dirlist
+ (let* ((dir (car dirlist))
+ (name1 (concat dir "/"
+ topic "." (or section (substring dir -1))))
+ completions)
+ (if (file-exists-p name1)
+ (insert-file-contents name1)
+ (condition-case ()
+ (progn
+ (setq completions (file-name-all-completions topic dir))
+ (while completions
+ (insert-file-contents (concat dir "/" (car completions)))
+ (setq completions (cdr completions))))
+ (file-error nil)))
+ (goto-char (point-max)))
+ (setq dirlist (cdr dirlist)))))
+
+ (if (= (buffer-size) 0)
+ (progn
+ (message "No formatted entry, invoking man %s%s..."
+ (if section (concat section " ") "") topic)
+ (if section
+ (call-process "/usr/ucb/man" nil t nil section topic)
+ (call-process "/usr/ucb/man" nil t nil topic))
+ (if (< (buffer-size) 80)
+ (progn
+ (goto-char (point-min))
+ (end-of-line)
+ (error (buffer-substring 1 (point)))))))
+
+ (let ((case-fold-search nil))
+ (message "Cleaning manual entry for %s..." topic)
+
+ ;; Nuke underlining
+ (goto-char (point-min))
+ (while (search-forward "_\b" nil t)
+ (replace-match ""))
+
+ ;; Nuke headers: "MORE(1) UNIX Programmer's Manual MORE(1)"
+ (goto-char (point-min))
+ (while (re-search-forward "^[A-Za-z][A-Za-z]*([0-9]*).*)$" nil t)
+ (replace-match ""))
+
+ ;; Nuke footers: "Printed 12/3/85 27 April 1981 1"
+ (goto-char (point-min))
+ (while (re-search-forward "^Printed [0-9].*[0-9]$" nil t)
+ (replace-match ""))
+
+ ;; Crunch blank lines
+ (goto-char (point-min))
+ (while (re-search-forward "\n\n\n\n*" nil t)
+ (replace-match "\n\n"))
+
+ ;; Nuke blanks lines at start.
+ (goto-char (point-min))
+ (skip-chars-forward "\n")
+ (delete-region (point-min) (point))
+
+ (set-buffer-modified-p nil)
+ (message "")))))
+