|
|
1.1 root 1: ;; Read in and display parts of Unix manual.
2: ;; Copyright (C) 1985 Richard M. Stallman.
3:
4: ;; This file is part of GNU Emacs.
5:
6: ;; GNU Emacs is distributed in the hope that it will be useful,
7: ;; but WITHOUT ANY WARRANTY. No author or distributor
8: ;; accepts responsibility to anyone for the consequences of using it
9: ;; or for whether it serves any particular purpose or works at all,
10: ;; unless he says so in writing. Refer to the GNU Emacs General Public
11: ;; License for full details.
12:
13: ;; Everyone is granted permission to copy, modify and redistribute
14: ;; GNU Emacs, but only under the conditions described in the
15: ;; GNU Emacs General Public License. A copy of this license is
16: ;; supposed to have been given to you along with GNU Emacs so you
17: ;; can know your rights and responsibilities. It should be in a
18: ;; file named COPYING. Among other things, the copyright notice
19: ;; and this notice must be preserved on all copies.
20:
21:
22: (defun manual-entry (topic &optional section)
23: "Display the Unix manual entry for TOPIC."
24: (interactive "sManual entry (topic): ")
25: (if (and (null section)
26: (string-match "\\`[ \t]*\\([^( \t]+\\)[ \t]*(\\(.+\\))[ \t]*\\'" topic))
27: (setq section (substring topic (match-beginning 2)
28: (match-end 2))
29: topic (substring topic (match-beginning 1)
30: (match-end 1))))
31: (with-output-to-temp-buffer "*Manual Entry*"
32: (buffer-flush-undo standard-output)
33: (save-excursion
34: (set-buffer standard-output)
35: (message "Looking for formatted entry for %s%s..."
36: topic (if section (concat "(" section ")") ""))
37: (let ((dirlist '("/usr/man/cat1"
38: "/usr/man/cat2" "/usr/man/cat3" "/usr/man/cat4"
39: "/usr/man/cat5" "/usr/man/cat6" "/usr/man/cat7"
40: "/usr/man/cat8" "/usr/man/catl" "/usr/man/catn"))
41: name)
42: (if (and section (file-exists-p
43: (setq name (concat "/usr/man/cat" (aref section 0)
44: "/"
45: topic "." section))))
46: (insert-file-contents name)
47: (while dirlist
48: (let* ((dir (car dirlist))
49: (name1 (concat dir "/"
50: topic "." (or section (substring dir -1))))
51: completions)
52: (if (file-exists-p name1)
53: (insert-file-contents name1)
54: (condition-case ()
55: (progn
56: (setq completions (file-name-all-completions topic dir))
57: (while completions
58: (insert-file-contents (concat dir "/" (car completions)))
59: (setq completions (cdr completions))))
60: (file-error nil)))
61: (goto-char (point-max)))
62: (setq dirlist (cdr dirlist)))))
63:
64: (if (= (buffer-size) 0)
65: (progn
66: (message "No formatted entry, invoking man %s%s..."
67: (if section (concat section " ") "") topic)
68: (if section
69: (call-process "/usr/ucb/man" nil t nil section topic)
70: (call-process "/usr/ucb/man" nil t nil topic))
71: (if (< (buffer-size) 80)
72: (progn
73: (goto-char (point-min))
74: (end-of-line)
75: (error (buffer-substring 1 (point)))))))
76:
77: (let ((case-fold-search nil))
78: (message "Cleaning manual entry for %s..." topic)
79:
80: ;; Nuke underlining
81: (goto-char (point-min))
82: (while (search-forward "_\b" nil t)
83: (replace-match ""))
84:
85: ;; Nuke headers: "MORE(1) UNIX Programmer's Manual MORE(1)"
86: (goto-char (point-min))
87: (while (re-search-forward "^[A-Za-z][A-Za-z]*([0-9]*).*)$" nil t)
88: (replace-match ""))
89:
90: ;; Nuke footers: "Printed 12/3/85 27 April 1981 1"
91: (goto-char (point-min))
92: (while (re-search-forward "^Printed [0-9].*[0-9]$" nil t)
93: (replace-match ""))
94:
95: ;; Crunch blank lines
96: (goto-char (point-min))
97: (while (re-search-forward "\n\n\n\n*" nil t)
98: (replace-match "\n\n"))
99:
100: ;; Nuke blanks lines at start.
101: (goto-char (point-min))
102: (skip-chars-forward "\n")
103: (delete-region (point-min) (point))
104:
105: (set-buffer-modified-p nil)
106: (message "")))))
107:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.