annotate lisp/packages/jwz-man.el @ 8:4b173ad71786 r19-15b5

Import from CVS: tag r19-15b5
author cvs
date Mon, 13 Aug 2007 08:47:35 +0200
parents b82b59fe008d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1 ;;; man.el --- browse UNIX manual pages
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
2 ;; Keywords: help
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
3
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
4 ;; Copyright (C) 1985, 1993, 1994, 1996 Free Software Foundation, Inc.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
5 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
6 ;; This file is part of XEmacs.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
7
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
8 ;; XEmacs is free software; you can redistribute it and/or modify it
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
9 ;; under the terms of the GNU General Public License as published by
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
10 ;; the Free Software Foundation; either version 2, or (at your option)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
11 ;; any later version.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
12
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
13 ;; XEmacs is distributed in the hope that it will be useful, but
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
14 ;; WITHOUT ANY WARRANTY; without even the implied warranty of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
15 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
16 ;; General Public License for more details.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
17
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
18 ;; You should have received a copy of the GNU General Public License
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
19 ;; along with XEmacs; see the file COPYING. If not, write to the Free
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
20 ;; Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
21
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
22 ;; This file defines "manual-entry", and the remaining definitions all
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
23 ;; begin with "Manual-". This makes the autocompletion on "M-x man" work.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
24 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
25 ;; Eviscerated 26-Jun-96 by Jamie Zawinski <jwz@netscape.com>.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
26 ;; All that stuff about looking at $MANPATH and building up lists of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
27 ;; directories was bullshit. Now we just invoke "man" and format the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
28 ;; output, end of story.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
29 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
30 ;; [ older changelog entries removed, since they're all about code that
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
31 ;; I've deleted. ]
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
32
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
33 (defvar Manual-program "man" "\
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
34 *Name of the program to invoke in order to format the source man pages.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
35
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
36 (defvar Manual-buffer-view-mode t "\
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
37 *Whether manual buffers should be placed in view-mode.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
38 nil means leave the buffer in fundamental-mode in another window.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
39 t means use `view-buffer' to display the man page in the current window.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
40 Any other value means use `view-buffer-other-window'.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
41
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
42 (defvar Manual-mode-hook nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
43 "Function or functions run on entry to Manual-mode.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
44
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
45 (defvar Manual-page-history nil "\
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
46 A list of names of previously visited man page buffers.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
47
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
48
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
49 ;; New variables.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
50
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
51 (make-face 'man-italic)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
52 (or (face-differs-from-default-p 'man-italic)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
53 (copy-face 'italic 'man-italic))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
54 ;; XEmacs (from Darrell Kindred): underlining is annoying due to
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
55 ;; large blank spaces in this face.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
56 ;; (or (face-differs-from-default-p 'man-italic)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
57 ;; (set-face-underline-p 'man-italic t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
58
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
59 (make-face 'man-bold)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
60 (or (face-differs-from-default-p 'man-bold)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
61 (copy-face 'bold 'man-bold))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
62 (or (face-differs-from-default-p 'man-bold)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
63 (copy-face 'man-italic 'man-bold))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
64
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
65 (make-face 'man-heading)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
66 (or (face-differs-from-default-p 'man-heading)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
67 (copy-face 'man-bold 'man-heading))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
68
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
69 (make-face 'man-xref)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
70 (or (face-differs-from-default-p 'man-xref)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
71 (set-face-underline-p 'man-xref t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
72
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
73 (defvar Manual-mode-map
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
74 (let ((m (make-sparse-keymap)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
75 (set-keymap-name m 'Manual-mode-map)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
76 (define-key m "l" 'Manual-last-page)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
77 (define-key m 'button2 'Manual-follow-xref)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
78 (define-key m 'button3 'Manual-popup-menu)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
79 m))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
80
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
81 ;;;###autoload
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
82 (defun manual-entry (topic &optional arg silent)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
83 "Display the Unix manual entry (or entries) for TOPIC."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
84 (interactive
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
85 (list (let* ((fmh "-A-Za-z0-9_.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
86 (default (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
87 (buffer-substring
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
88 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
89 (re-search-backward "\\sw" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
90 (skip-chars-backward fmh) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
91 (progn (skip-chars-forward fmh) (point)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
92 (thing (read-string
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
93 (if (equal default "") "Manual entry: "
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
94 (concat "Manual entry: (default " default ") ")))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
95 (if (equal thing "") default thing))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
96 (prefix-numeric-value current-prefix-arg)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
97 ;;(interactive "sManual entry (topic): \np")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
98 (or arg (setq arg 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
99 (let (section apropos-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
100 (let ((case-fold-search nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
101 (if (and (null section)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
102 (string-match "\\`[ \t]*\\([^( \t]+\\)[ \t]*(\\(.+\\))[ \t]*\\'"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
103 topic))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
104 (setq section (substring topic (match-beginning 2)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
105 (match-end 2))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
106 topic (substring topic (match-beginning 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
107 (match-end 1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
108 (if (string-match "\\`[ \t]*-k[ \t]+\\([^ \t]+\\)\\'" topic)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
109 (setq section "-k"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
110 topic (substring topic (match-beginning 1))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
111
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
112 ;; jwz: turn section "3x11" and "3n" into "3".
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
113 (if (and section (string-match "\\`\\([0-9]+\\)[^0-9]" section))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
114 (setq section (substring section 0 (match-end 1))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
115 (if (equal section "-k")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
116 (setq apropos-mode t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
117
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
118 (let ((bufname (cond (apropos-mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
119 (concat "*man apropos " topic "*"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
120 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
121 (concat "*man " topic
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
122 (if section (concat "." section) "")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
123 "*"))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
124 (temp-buffer-show-function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
125 (cond ((eq 't Manual-buffer-view-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
126 'view-buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
127 ((eq 'nil Manual-buffer-view-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
128 temp-buffer-show-function)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
129 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
130 'view-buffer-other-window))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
131
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
132 (cond ((get-buffer bufname)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
133 ;; reselect an old man page buffer if it exists already.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
134 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
135 (set-buffer (get-buffer bufname))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
136 (Manual-mode))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
137 (if temp-buffer-show-function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
138 (funcall temp-buffer-show-function (get-buffer bufname))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
139 (display-buffer bufname)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
140 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
141 (with-output-to-temp-buffer bufname
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
142 (buffer-disable-undo standard-output)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
143 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
144 (set-buffer standard-output)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
145 (setq buffer-read-only nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
146 (erase-buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
147
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
148 (let ((args (list topic))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
149 args-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
150 (if section
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
151 (setq args
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
152 (if (eq system-type 'usg-unix-v)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
153 (cons "-s" (cons section args))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
154 (cons section args))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
155 (setq args-string
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
156 (mapconcat 'identity (cons Manual-program args) " "))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
157 (if (string-match "\\`\\([^ \t/]*/\\)+" args-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
158 (setq args-string
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
159 (substring args-string (match-end 0))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
160
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
161 (message "%s (running...)" args-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
162 (apply 'call-process Manual-program nil t nil args)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
163
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
164 (if (< (buffer-size) 200)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
165 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
166 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
167 (error (buffer-substring (point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
168 (progn (end-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
169 (point))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
170
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
171 (message "%s (cleaning...)" args-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
172 (Manual-nuke-nroff-bs apropos-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
173 (message "%s (done.)" args-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
174 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
175
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
176 (set-buffer-modified-p nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
177 (Manual-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
178 ))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
179 (setq Manual-page-history
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
180 (cons (buffer-name)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
181 (delete (buffer-name) Manual-page-history)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
182 (message nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
183 t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
184
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
185 (defun Manual-mode ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
186 (kill-all-local-variables)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
187 (setq buffer-read-only t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
188 (use-local-map Manual-mode-map)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
189 (setq major-mode 'Manual-mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
190 mode-name "Manual")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
191 ;; man pages with long lines are buggy!
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
192 ;; This looks slightly better if they only
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
193 ;; overran by a couple of chars.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
194 (setq truncate-lines t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
195 ;; turn off horizontal scrollbars in this buffer
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
196 (set-specifier scrollbar-height (cons (current-buffer) 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
197 (run-hooks 'Manual-mode-hook))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
198
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
199 (defun Manual-last-page ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
200 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
201 (while (or (not (get-buffer (car (or Manual-page-history
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
202 (error "No more history.")))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
203 (eq (get-buffer (car Manual-page-history)) (current-buffer)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
204 (setq Manual-page-history (cdr Manual-page-history)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
205 (switch-to-buffer (car Manual-page-history)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
206
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
207
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
208 (defmacro Manual-delete-char (n)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
209 ;; in v19, delete-char is compiled as a function call, but delete-region
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
210 ;; is byte-coded, so it's much faster. (We were spending 40% of our time
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
211 ;; in delete-char alone.)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
212 (list 'delete-region '(point) (list '+ '(point) n)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
213
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
214 ;; Hint: BS stands form more things than "back space"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
215 (defun Manual-nuke-nroff-bs (&optional apropos-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
216 (interactive "*")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
217 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
218 ;; turn underlining into italics
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
219 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
220 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
221 (while (search-forward "_\b" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
222 ;; searching for underscore-backspace and then comparing the following
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
223 ;; chars until the sequence ends turns out to be much faster than searching
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
224 ;; for a regexp which matches the whole sequence.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
225 (let ((s (match-beginning 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
226 (goto-char s)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
227 (while (and (= (following-char) ?_)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
228 (= (char-after (1+ (point))) ?\b))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
229 (Manual-delete-char 2)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
230 (forward-char 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
231 (set-extent-face (make-extent s (point)) 'man-italic)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
232 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
233 ;; turn overstriking into bold
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
234 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
235 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
236 (while (re-search-forward "\\([^\n]\\)\\(\b\\1\\)" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
237 ;; Surprisingly, searching for the above regexp is faster than searching
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
238 ;; for a backspace and then comparing the preceding and following chars,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
239 ;; I presume because there are many false matches, meaning more funcalls
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
240 ;; to re-search-forward.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
241 (let ((s (match-beginning 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
242 (goto-char s)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
243 ;; Some systems (SGI) overstrike multiple times, eg, "M\bM\bM\bM".
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
244 (while (looking-at "\\([^\n]\\)\\(\b\\1\\)+")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
245 (delete-region (+ (point) 1) (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
246 (forward-char 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
247 (set-extent-face (make-extent s (point)) 'man-bold)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
248 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
249 ;; hack bullets: o^H+ --> +
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
250 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
251 (while (search-forward "\b" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
252 (Manual-delete-char -2))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
253
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
254 (if (> (buffer-size) 100) ; minor kludge
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
255 (Manual-nuke-nroff-bs-footers))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
256 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
257 ;; turn subsection header lines into bold
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
258 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
259 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
260 (if apropos-mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
261 (while (re-search-forward "[a-zA-Z0-9] ([0-9]" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
262 (forward-char -2)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
263 (delete-backward-char 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
264
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
265 ;; (while (re-search-forward "^[^ \t\n]" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
266 ;; (set-extent-face (make-extent (match-beginning 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
267 ;; (progn (end-of-line) (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
268 ;; 'man-heading))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
269
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
270 ;; boldface the first line
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
271 (if (looking-at "[^ \t\n].*$")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
272 (set-extent-face (make-extent (match-beginning 0) (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
273 'man-bold))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
274
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
275 ;; boldface subsequent title lines
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
276 ;; Regexp to match section headers changed to match a non-indented
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
277 ;; line preceded by a blank line and followed by an indented line.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
278 ;; This seems to work ok for manual pages but gives better results
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
279 ;; with other nroff'd files
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
280 (while (re-search-forward "\n\n\\([^ \t\n].*\\)\n[ \t]+[^ \t\n]" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
281 (goto-char (match-end 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
282 (set-extent-face (make-extent (match-beginning 1) (match-end 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
283 'man-heading)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
284 (forward-line 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
285 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
286
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
287 ;; Zap ESC7, ESC8, and ESC9
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
288 ;; This is for Sun man pages like "man 1 csh"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
289 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
290 (while (re-search-forward "\e[789]" nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
291 (replace-match ""))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
292
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
293 ;; Nuke blanks lines at start.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
294 ;; (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
295 ;; (skip-chars-forward "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
296 ;; (delete-region (point-min) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
297
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
298 (Manual-mouseify-xrefs)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
299 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
300
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
301 (fset 'nuke-nroff-bs 'Manual-nuke-nroff-bs) ; use old name
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
302
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
303
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
304 (defun Manual-nuke-nroff-bs-footers ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
305 ;; Nuke headers and footers.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
306 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
307 ;; nroff assumes pages are 66 lines high. We assume that, and that the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
308 ;; first and last line on each page is expendible. There is no way to
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
309 ;; tell the difference between a page break in the middle of a paragraph
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
310 ;; and a page break between paragraphs (the amount of extra whitespace
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
311 ;; that nroff inserts is the same in both cases) so this might strip out
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
312 ;; a blank line were one should remain. I think that's better than
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
313 ;; leaving in a blank line where there shouldn't be one. (Need I say
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
314 ;; it: FMH.)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
315 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
316 ;; Note that if nroff spits out error messages, pages will be more than
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
317 ;; 66 lines high, and we'll lose badly. That's ok because standard
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
318 ;; nroff doesn't do any diagnostics, and the "gnroff" wrapper for groff
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
319 ;; turns off error messages for compatibility. (At least, it's supposed
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
320 ;; to.)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
321 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
322 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
323 ;; first lose the status output
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
324 (let ((case-fold-search t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
325 (if (and (not (looking-at "[^\n]*warning"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
326 (looking-at "Reformatting.*\n"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
327 (delete-region (match-beginning 0) (match-end 0))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
328
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
329 ;; kludge around a groff bug where it won't keep quiet about some
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
330 ;; warnings even with -Wall or -Ww.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
331 (cond ((looking-at "grotty:")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
332 (while (looking-at "grotty:")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
333 (delete-region (point) (progn (forward-line 1) (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
334 (if (looking-at " *done\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
335 (delete-region (point) (match-end 0)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
336
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
337 (let ((pages '())
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
338 p)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
339 ;; collect the page boundary markers before we start deleting, to make
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
340 ;; it easier to strip things out without changing the page sizes.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
341 (while (not (eobp))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
342 (forward-line 66)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
343 (setq pages (cons (point-marker) pages)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
344 (setq pages (nreverse pages))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
345 (while pages
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
346 (goto-char (car pages))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
347 (set-marker (car pages) nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
348 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
349 ;; The lines are: 3 blank; footer; 6 blank; header; 3 blank.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
350 ;; We're in between the previous footer and the following header,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
351 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
352 ;; First lose 3 blank lines, the header, and then 3 more.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
353 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
354 (setq p (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
355 (skip-chars-forward "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
356 (delete-region p (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
357 (and (looking-at "[^\n]+\n\n?\n?\n?")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
358 (delete-region (match-beginning 0) (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
359 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
360 ;; Next lose the footer, and the 3 blank lines after, and before it.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
361 ;; But don't lose the last footer of the manual entry; that contains
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
362 ;; the "last change" date, so it's not completely uninteresting.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
363 ;; (Actually lose all blank lines before it; sh(1) needs this.)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
364 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
365 (skip-chars-backward "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
366 (beginning-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
367 (if (null (cdr pages))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
368 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
369 (and (looking-at "[^\n]+\n\n?\n?\n?")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
370 (delete-region (match-beginning 0) (match-end 0))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
371 (setq p (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
372 (skip-chars-backward "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
373 (if (> (- p (point)) 4)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
374 (delete-region (+ 2 (point)) p)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
375 (delete-region (1+ (point)) p))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
376 ; (and (looking-at "\n\n?\n?")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
377 ; (delete-region (match-beginning 0) (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
378
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
379 (setq pages (cdr pages)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
380 ;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
381 ;; Now nuke the extra blank lines at the beginning and end.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
382 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
383 (if (looking-at "\n+")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
384 (delete-region (match-beginning 0) (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
385 (forward-line 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
386 (if (looking-at "\n\n+")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
387 (delete-region (1+ (match-beginning 0)) (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
388 (goto-char (point-max))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
389 (skip-chars-backward "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
390 (delete-region (point) (point-max))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
391 (beginning-of-line)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
392 (forward-char -1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
393 (setq p (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
394 (skip-chars-backward "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
395 (if (= ?\n (following-char)) (forward-char 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
396 (if (> (point) (1+ p))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
397 (delete-region (point) p))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
398 ))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
399
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
400 (defun Manual-mouseify-xrefs ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
401 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
402 (forward-line 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
403 (let ((case-fold-search nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
404 s e name extent)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
405 ;; possibly it would be faster to rewrite this expression to search for
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
406 ;; a less common sequence first (like "([0-9]") and then back up to see
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
407 ;; if it's really a match. This function is 15% of the total time, 13%
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
408 ;; of which is this call to re-search-forward.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
409 (while (re-search-forward "[a-zA-Z_][-a-zA-Z0-9_.]*([0-9][a-zA-Z0-9]*)"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
410 nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
411 (setq s (match-beginning 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
412 e (match-end 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
413 name (buffer-substring s e))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
414 (goto-char s)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
415 (skip-chars-backward " \t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
416 (if (and (bolp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
417 (progn (backward-char 1) (= (preceding-char) ?-)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
418 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
419 (setq s (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
420 (skip-chars-backward "-a-zA-Z0-9_.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
421 (setq name (concat (buffer-substring (point) (1- s)) name))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
422 (setq s (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
423 ;; if there are upper case letters in the section, downcase them.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
424 (if (string-match "(.*[A-Z]+.*)$" name)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
425 (setq name (concat (substring name 0 (match-beginning 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
426 (downcase (substring name (match-beginning 0))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
427 ;; (setq already-fontified (extent-at s))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
428 (setq extent (make-extent s e))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
429 (set-extent-property extent 'man (list 'Manual-follow-xref name))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
430 (set-extent-property extent 'highlight t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
431 ;; (if (not already-fontified)...
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
432 (set-extent-face extent 'man-xref)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
433 (goto-char e))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
434
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
435 (defun Manual-follow-xref (&optional name-or-event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
436 "Invoke `manual-entry' on the cross-reference under the mouse.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
437 When invoked noninteractively, the arg may be an xref string to parse instead."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
438 (interactive "e")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
439 (if (eventp name-or-event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
440 (let* ((p (event-point name-or-event))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
441 (extent (and p (extent-at p
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
442 (event-buffer name-or-event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
443 'highlight)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
444 (data (and extent (extent-property extent 'man))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
445 (if (eq (car-safe data) 'Manual-follow-xref)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
446 (eval data)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
447 (error "no manual cross-reference there.")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
448 (or (manual-entry name-or-event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
449 ;; If that didn't work, maybe it's in a different section than the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
450 ;; man page writer expected. For example, man pages tend assume
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
451 ;; that all user programs are in section 1, but X tends to generate
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
452 ;; makefiles that put things in section "n" instead...
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
453 (and (string-match "[ \t]*([^)]+)\\'" name-or-event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
454 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
455 (message "No entries found for %s; checking other sections..."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
456 name-or-event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
457 (manual-entry
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
458 (substring name-or-event 0 (match-beginning 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
459 nil t))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
460
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
461 (defun Manual-popup-menu (&optional event)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
462 "Pops up a menu of cross-references in this manual page.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
463 If there is a cross-reference under the mouse button which invoked this
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
464 command, it will be the first item on the menu. Otherwise, they are
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
465 on the menu in the order in which they appear in the buffer."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
466 (interactive "e")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
467 (let ((buffer (current-buffer))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
468 (sep "---")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
469 (prefix "Show Manual Page for ")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
470 xref items)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
471 (cond (event
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
472 (setq buffer (event-buffer event))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
473 (let* ((p (event-point event))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
474 (extent (and p (extent-at p buffer 'highlight)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
475 (data (and extent (extent-property extent 'man))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
476 (if (eq (car-safe data) 'Manual-follow-xref)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
477 (setq xref (nth 1 data))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
478 (if xref (setq items (list sep xref)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
479 (map-extents #'(lambda (extent ignore)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
480 (let ((data (extent-property extent 'man)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
481 (if (and (eq (car-safe data) 'Manual-follow-xref)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
482 (not (member (nth 1 data) items)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
483 (setq items (cons (nth 1 data) items)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
484 nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
485 buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
486 (if (eq sep (car items)) (setq items (cdr items)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
487 (let ((popup-menu-titles nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
488 (popup-menu
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
489 (cons "Manual Entry"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
490 (mapcar #'(lambda (item)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
491 (if (eq item sep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
492 item
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
493 (vector (concat prefix item)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
494 (list 'Manual-follow-xref item) t)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
495 (nreverse items)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
496
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
497 (defun pager-cleanup-hook ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
498 "cleanup man page if called via $PAGER"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
499 (let ((buf-name (or buffer-file-name (buffer-name))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
500 (if (or (string-match "^/tmp/man[0-9]+" buf-name)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
501 (string-match ".*/man/\\(man\\|cat\\)[1-9a-z]/" buf-name))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
502 (let (buffer manpage)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
503 (require 'man)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
504 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
505 (setq buffer-read-only nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
506 (Manual-nuke-nroff-bs)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
507 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
508 (if (re-search-forward "[^ \t]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
509 (goto-char (- (point) 1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
510 (if (looking-at "\\([a-zA-Z0-9]+\\)[ \t]*(")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
511 (setq manpage (buffer-substring (match-beginning 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
512 (match-end 1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
513 (setq manpage "???"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
514 (setq buffer
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
515 (rename-buffer
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
516 (generate-new-buffer-name (concat "*man " manpage "*"))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
517 (setq buffer-file-name nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
518 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
519 (insert (format "%s\n" buf-name))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
520 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
521 (buffer-disable-undo buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
522 (set-buffer-modified-p nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
523 (Manual-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
524 ))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
525
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
526 (add-hook 'server-visit-hook 'pager-cleanup-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
527 (provide 'man)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
528
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
529 ;;; man.el ends here