|
|
1.1 ! root 1: ;; Read in and display parts of Unix manual. ! 2: ;; Copyright (C) 1985, 1986 Free Software Foundation, Inc. ! 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: (defun manual-entry (topic &optional section) ! 22: "Display the Unix manual entry for TOPIC. ! 23: TOPIC is either the title of the entry, or has the form TITLE(SECTION) ! 24: where SECTION is the desired section of the manual, as in `tty(4)'." ! 25: (interactive "sManual entry (topic): ") ! 26: (if (and (null section) ! 27: (string-match "\\`[ \t]*\\([^( \t]+\\)[ \t]*(\\(.+\\))[ \t]*\\'" topic)) ! 28: (setq section (substring topic (match-beginning 2) ! 29: (match-end 2)) ! 30: topic (substring topic (match-beginning 1) ! 31: (match-end 1)))) ! 32: (with-output-to-temp-buffer "*Manual Entry*" ! 33: (buffer-flush-undo standard-output) ! 34: (save-excursion ! 35: (set-buffer standard-output) ! 36: (message "Looking for formatted entry for %s%s..." ! 37: topic (if section (concat "(" section ")") "")) ! 38: (let ((dirlist manual-formatted-dirlist) ! 39: (case-fold-search nil) ! 40: name) ! 41: (if (and section (or (file-exists-p ! 42: (setq name (concat manual-formatted-dir-prefix ! 43: (substring section 0 1) ! 44: "/" ! 45: topic "." section))) ! 46: (file-exists-p ! 47: (setq name (concat manual-formatted-dir-prefix ! 48: section ! 49: "/" ! 50: topic "." section))))) ! 51: (insert-man-file name) ! 52: (while dirlist ! 53: (let* ((dir (car dirlist)) ! 54: (name1 (concat dir "/" topic "." ! 55: (or section ! 56: (substring ! 57: dir ! 58: (1+ (or (string-match "\\.[^./]*$" dir) ! 59: -2)))))) ! 60: completions) ! 61: (if (file-exists-p name1) ! 62: (insert-man-file name1) ! 63: (condition-case () ! 64: (progn ! 65: (setq completions (file-name-all-completions ! 66: (concat topic "." (or section "")) ! 67: dir)) ! 68: (while completions ! 69: (insert-man-file (concat dir "/" (car completions))) ! 70: (setq completions (cdr completions)))) ! 71: (file-error nil))) ! 72: (goto-char (point-max))) ! 73: (setq dirlist (cdr dirlist))))) ! 74: ! 75: (if (= (buffer-size) 0) ! 76: (progn ! 77: (message "No formatted entry, invoking man %s%s..." ! 78: (if section (concat section " ") "") topic) ! 79: (if section ! 80: (call-process manual-program nil t nil section topic) ! 81: (call-process manual-program nil t nil topic)) ! 82: (if (< (buffer-size) 80) ! 83: (progn ! 84: (goto-char (point-min)) ! 85: (end-of-line) ! 86: (error (buffer-substring 1 (point))))))) ! 87: ! 88: (message "Cleaning manual entry for %s..." topic) ! 89: (nuke-nroff-bs) ! 90: (set-buffer-modified-p nil) ! 91: (message "")))) ! 92: ! 93: ;; Hint: BS stands form more things than "back space" ! 94: (defun nuke-nroff-bs () ! 95: (interactive "*") ! 96: ;; Nuke underlining and overstriking (only by the same letter) ! 97: (goto-char (point-min)) ! 98: (while (search-forward "\b" nil t) ! 99: (let* ((preceding (char-after (- (point) 2))) ! 100: (following (following-char))) ! 101: (cond ((= preceding following) ! 102: ;; x\bx ! 103: (delete-char -2)) ! 104: ((= preceding ?\_) ! 105: ;; _\b ! 106: (delete-char -2)) ! 107: ((= following ?\_) ! 108: ;; \b_ ! 109: (delete-region (1- (point)) (1+ (point))))))) ! 110: ! 111: ;; Nuke headers: "MORE(1) UNIX Programmer's Manual MORE(1)" ! 112: (goto-char (point-min)) ! 113: (while (re-search-forward "^ *\\([A-Za-z][-_A-Za-z0-9]*([0-9A-Z]+)\\).*\\1$" nil t) ! 114: (replace-match "")) ! 115: ! 116: ;; Nuke footers: "Printed 12/3/85 27 April 1981 1" ! 117: ;; Sun appear to be on drugz: ! 118: ;; "Sun Release 3.0B Last change: 1 February 1985 1" ! 119: ;; HP are even worse! ! 120: ;; " Hewlett-Packard -1- (printed 12/31/99)" FMHWA12ID!! ! 121: ;; System V (well WICATs anyway): ! 122: ;; "Page 1 (printed 7/24/85)" ! 123: ;; Who is administering PCP to these corporate bozos? ! 124: (goto-char (point-min)) ! 125: (while (re-search-forward ! 126: (cond ((eq system-type 'hpux) ! 127: "^[ \t]*Hewlett-Packard\\(\\| Company\\)[ \t]*- [0-9]* -.*$") ! 128: ((eq system-type 'usg-unix-v) ! 129: "^ *Page [0-9]*.*(printed [0-9/]*)$") ! 130: (t ! 131: "^\\(Printed\\|Sun Release\\) [0-9].*[0-9]$")) ! 132: nil t) ! 133: (replace-match "")) ! 134: ! 135: ;; Crunch blank lines ! 136: (goto-char (point-min)) ! 137: (while (re-search-forward "\n\n\n\n*" nil t) ! 138: (replace-match "\n\n")) ! 139: ! 140: ;; Nuke blanks lines at start. ! 141: (goto-char (point-min)) ! 142: (skip-chars-forward "\n") ! 143: (delete-region (point-min) (point))) ! 144: ! 145: ! 146: (defun insert-man-file (name) ! 147: ;; Insert manual file (unpacked as necessary) into buffer ! 148: (if (or (equal (substring name -2) ".Z") ! 149: (string-match "/cat[0-9][a-z]?\\.Z/" name)) ! 150: (call-process "zcat" name t nil) ! 151: (if (equal (substring name -2) ".z") ! 152: (call-process "pcat" nil t nil name) ! 153: (insert-file-contents name))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.