|
|
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 free software; you can redistribute it and/or modify ! 7: ;; it under the terms of the GNU General Public License as published by ! 8: ;; the Free Software Foundation; either version 1, or (at your option) ! 9: ;; any later version. ! 10: ! 11: ;; GNU Emacs is distributed in the hope that it will be useful, ! 12: ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ! 13: ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ! 14: ;; GNU General Public License for more details. ! 15: ! 16: ;; You should have received a copy of the GNU General Public License ! 17: ;; along with GNU Emacs; see the file COPYING. If not, write to ! 18: ;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ! 19: ! 20: (defun manual-entry (topic &optional section) ! 21: "Display the Unix manual entry for TOPIC. ! 22: TOPIC is either the title of the entry, or has the form TITLE(SECTION) ! 23: where SECTION is the desired section of the manual, as in `tty(4)'." ! 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 manual-formatted-dirlist) ! 38: (case-fold-search nil) ! 39: name) ! 40: (if (and section (or (file-exists-p ! 41: (setq name (concat manual-formatted-dir-prefix ! 42: (substring section 0 1) ! 43: "/" ! 44: topic "." section))) ! 45: (file-exists-p ! 46: (setq name (concat manual-formatted-dir-prefix ! 47: section ! 48: "/" ! 49: topic "." section))))) ! 50: (insert-man-file name) ! 51: (while dirlist ! 52: (let* ((dir (car dirlist)) ! 53: (name1 (concat dir "/" topic "." ! 54: (or section ! 55: (substring ! 56: dir ! 57: (1+ (or (string-match "\\.[^./]*$" dir) ! 58: -2)))))) ! 59: completions) ! 60: (if (file-exists-p name1) ! 61: (insert-man-file name1) ! 62: (condition-case () ! 63: (progn ! 64: (setq completions (file-name-all-completions ! 65: (concat topic "." (or section "")) ! 66: dir)) ! 67: (while completions ! 68: (insert-man-file (concat dir "/" (car completions))) ! 69: (setq completions (cdr completions)))) ! 70: (file-error nil))) ! 71: (goto-char (point-max))) ! 72: (setq dirlist (cdr dirlist))))) ! 73: ! 74: (if (= (buffer-size) 0) ! 75: (progn ! 76: (message "No formatted entry, invoking man %s%s..." ! 77: (if section (concat section " ") "") topic) ! 78: (if section ! 79: (call-process manual-program nil t nil section topic) ! 80: (call-process manual-program nil t nil topic)) ! 81: (if (< (buffer-size) 80) ! 82: (progn ! 83: (goto-char (point-min)) ! 84: (end-of-line) ! 85: (error (buffer-substring 1 (point))))))) ! 86: ! 87: (message "Cleaning manual entry for %s..." topic) ! 88: (nuke-nroff-bs) ! 89: (set-buffer-modified-p nil) ! 90: (message "")))) ! 91: ! 92: ;; Hint: BS stands form more things than "back space" ! 93: (defun nuke-nroff-bs () ! 94: (interactive "*") ! 95: ;; Nuke underlining and overstriking (only by the same letter) ! 96: (goto-char (point-min)) ! 97: (while (search-forward "\b" nil t) ! 98: (let* ((preceding (char-after (- (point) 2))) ! 99: (following (following-char))) ! 100: (cond ((= preceding following) ! 101: ;; x\bx ! 102: (delete-char -2)) ! 103: ((= preceding ?\_) ! 104: ;; _\b ! 105: (delete-char -2)) ! 106: ((= following ?\_) ! 107: ;; \b_ ! 108: (delete-region (1- (point)) (1+ (point))))))) ! 109: ! 110: ;; Nuke headers: "MORE(1) UNIX Programmer's Manual MORE(1)" ! 111: (goto-char (point-min)) ! 112: (while (re-search-forward "^ *\\([A-Za-z][-_A-Za-z0-9]*([0-9A-Z]+)\\).*\\1$" nil t) ! 113: (replace-match "")) ! 114: ! 115: ;; Nuke footers: "Printed 12/3/85 27 April 1981 1" ! 116: ;; Sun appear to be on drugz: ! 117: ;; "Sun Release 3.0B Last change: 1 February 1985 1" ! 118: ;; HP are even worse! ! 119: ;; " Hewlett-Packard -1- (printed 12/31/99)" FMHWA12ID!! ! 120: ;; System V (well WICATs anyway): ! 121: ;; "Page 1 (printed 7/24/85)" ! 122: ;; Who is administering PCP to these corporate bozos? ! 123: (goto-char (point-min)) ! 124: (while (re-search-forward ! 125: (cond ((eq system-type 'hpux) ! 126: "^[ \t]*Hewlett-Packard\\(\\| Company\\)[ \t]*- [0-9]* -.*$") ! 127: ((eq system-type 'usg-unix-v) ! 128: "^ *Page [0-9]*.*(printed [0-9/]*)$") ! 129: (t ! 130: "^\\(Printed\\|Sun Release\\) [0-9].*[0-9]$")) ! 131: nil t) ! 132: (replace-match "")) ! 133: ! 134: ;; Crunch blank lines ! 135: (goto-char (point-min)) ! 136: (while (re-search-forward "\n\n\n\n*" nil t) ! 137: (replace-match "\n\n")) ! 138: ! 139: ;; Nuke blanks lines at start. ! 140: (goto-char (point-min)) ! 141: (skip-chars-forward "\n") ! 142: (delete-region (point-min) (point))) ! 143: ! 144: ! 145: (defun insert-man-file (name) ! 146: ;; Insert manual file (unpacked as necessary) into buffer ! 147: (if (or (equal (substring name -2) ".Z") ! 148: (string-match "/cat[0-9][a-z]?\\.Z/" name)) ! 149: (call-process "zcat" name t nil) ! 150: (if (equal (substring name -2) ".z") ! 151: (call-process "pcat" nil t nil name) ! 152: (insert-file-contents name))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.