Mercurial > hg > xemacs-beta
comparison lisp/hyperbole/hmous-info.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 ;;!emacs | |
2 ;; | |
3 ;; FILE: hmous-info.el | |
4 ;; SUMMARY: Walks through Info networks using one key. | |
5 ;; USAGE: GNU Emacs Lisp Library | |
6 ;; KEYWORDS: docs, help, hypermedia, mouse | |
7 ;; | |
8 ;; AUTHOR: Bob Weiner | |
9 ;; ORIG-DATE: 04-Apr-89 | |
10 ;; LAST-MOD: 1-Nov-95 at 20:33:46 by Bob Weiner | |
11 ;; | |
12 ;; This file is for use with Hyperbole. | |
13 ;; | |
14 ;; Copyright (C) 1989, 1990, 1991 Free Software Foundation, Inc. | |
15 ;; Available for use and distribution under the same terms as GNU Emacs. | |
16 ;; | |
17 ;; | |
18 ;; DESCRIPTION: | |
19 ;; | |
20 ;; This code is machine independent. | |
21 ;; | |
22 ;; To install: See hui-mouse.el | |
23 ;; | |
24 ;; DESCRIP-END. | |
25 | |
26 ;;;###autoload | |
27 (defun smart-info () | |
28 "Walks through Info documentation networks using one key or mouse key. | |
29 | |
30 If key is pressed within: | |
31 (1) the first line of an Info Menu Entry or Cross Reference, the desired node | |
32 is found; | |
33 (2) the Up, Next, or Previous entries of a Node Header (first line), | |
34 the desired node is found; | |
35 (3) the File entry of a Node Header (first line), | |
36 the 'Top' node within that file is found; | |
37 (4) at the end of the current node, the Next node is found (this will | |
38 descend subtrees if the function 'Info-global-next' is bound); | |
39 (5) anywhere else (e.g. at the end of a line), the current node entry is | |
40 scrolled up one windowful. | |
41 | |
42 Returns t if key is pressed within an Info Node Header, Cross Reference, | |
43 or a Menu; otherwise returns nil." | |
44 | |
45 (interactive) | |
46 (cond | |
47 ;; | |
48 ;; If at end of node, go to next node | |
49 ;; | |
50 ((last-line-p) | |
51 (if (fboundp 'Info-global-next) (Info-global-next) | |
52 (Info-next))) | |
53 ((Info-handle-in-node-hdr)) | |
54 ((Info-handle-in-note)) | |
55 ((Info-handle-in-menu)) | |
56 ((pos-visible-in-window-p (point-max)) | |
57 (if (fboundp 'Info-global-next) (Info-global-next) | |
58 (Info-next))) | |
59 ;; | |
60 ;; If nothing else scroll forward a windowful. | |
61 ;; | |
62 ((smart-scroll-up)))) | |
63 | |
64 ;;;###autoload | |
65 (defun smart-info-assist () | |
66 "Walks through Info documentation networks using one assist-key or mouse assist-key. | |
67 | |
68 If assist-key is pressed within: | |
69 (1) the first line of an Info Menu Entry or Cross Reference, the desired node | |
70 is found; | |
71 (2) the Up, Next, or Previous entries of a Node Header (first line), | |
72 the last node in the history list is found; | |
73 (3) the File entry of a Node Header (first line), | |
74 the 'DIR' root-level node is found; | |
75 (4) at the end of the current node, the Previous node is found (this will | |
76 return from subtrees if the function 'Info-global-prev is bound); | |
77 (5) anywhere else (e.g. at the end of a line), the current node entry is | |
78 scrolled down one windowful. | |
79 | |
80 Returns t if assist-key is pressed within an Info Node Header, Cross Reference, | |
81 or a Menu; otherwise returns nil." | |
82 | |
83 (interactive) | |
84 (cond | |
85 ;; | |
86 ;; If at end or beginning of node, go to previous node | |
87 ;; | |
88 ((last-line-p) | |
89 (if (fboundp 'Info-global-prev) (Info-global-prev) | |
90 (Info-prev))) | |
91 ((Info-handle-in-node-hdr-assist)) | |
92 ((Info-handle-in-note)) | |
93 ((Info-handle-in-menu)) | |
94 ((pos-visible-in-window-p (point-min)) | |
95 (if (fboundp 'Info-global-prev) (Info-global-prev) | |
96 (Info-prev))) | |
97 ;; | |
98 ;; If anywhere else, scroll backward a windowful. | |
99 ;; | |
100 ((smart-scroll-down)))) | |
101 | |
102 (defun Info-handle-in-node-hdr () | |
103 "If within an Info node header, move to <FILE>Top, <Up>, <Previous>, or | |
104 <Next> node, depending on which label point is on, and return t. | |
105 Otherwise, return nil." | |
106 ;; | |
107 ;; Test if on 1st line of node, i.e. node header | |
108 ;; | |
109 (if (not (first-line-p)) | |
110 nil | |
111 (let ((nodename "Top") (filep nil)) | |
112 (save-excursion | |
113 (if (and | |
114 (re-search-forward "[:, \t\n]" nil t) | |
115 (re-search-backward | |
116 "\\(File\\|Node\\|Up\\|Prev\\|Previous\\|Next\\):[ \t]" nil t)) | |
117 (progn (setq filep (string-equal | |
118 "file" | |
119 (downcase (buffer-substring | |
120 (match-beginning 1) | |
121 (match-end 1))))) | |
122 (if (re-search-forward (concat ":[ \n]\\([^,\t\n" | |
123 (if filep " ") | |
124 "]*\\)") nil t) | |
125 (setq nodename (buffer-substring | |
126 (match-beginning 1) | |
127 (match-end 1))))) | |
128 (error "Node header not found."))) | |
129 (setq nodename | |
130 (cond ((= (aref nodename 0) ?\() nodename) | |
131 (filep (concat "(" nodename ")" "Top")) | |
132 (buffer-file-name (concat "(" buffer-file-name ")" nodename)) | |
133 (t nodename))) | |
134 (if hyperb:lemacs-p | |
135 (Info-goto-node nodename nil t) | |
136 (Info-goto-node nodename)) | |
137 t))) | |
138 | |
139 (defun Info-handle-in-node-hdr-assist () | |
140 "If within an Info node header when the 'smart-info-assist' command is | |
141 executed, when within the <FILE> header go to the DIR top-level node. When | |
142 within any other header (<Up>, <Previous>, or <Next>) go to last node from | |
143 history list. Return t if in Info node header. Otherwise return nil." | |
144 ;; | |
145 ;; Test if on 1st line of node, i.e. node header | |
146 ;; | |
147 (if (not (first-line-p)) | |
148 nil | |
149 (save-excursion | |
150 (if (and | |
151 (re-search-forward "[:, \t\n]" nil t) | |
152 (re-search-backward | |
153 "\\(File\\|Node\\|Up\\|Prev\\|Previous\\|Next\\):[ \t]" nil t) ) | |
154 ;; If in <FILE> hdr | |
155 (progn (if (string-equal | |
156 "file" | |
157 (downcase (buffer-substring | |
158 (match-beginning 1) | |
159 (match-end 1)))) | |
160 (Info-directory) | |
161 (Info-last)) | |
162 t) | |
163 (error "Node header not found.") | |
164 nil)))) | |
165 | |
166 ;;;###autoload | |
167 (defun Info-handle-in-note () | |
168 "Follows an Info cross-reference. | |
169 If point is within the first line of an Info note (cross-reference), follows | |
170 cross-reference and returns t; otherwise returns nil." | |
171 (let ((note-name) (opoint (point))) | |
172 (save-excursion | |
173 (skip-chars-forward "^:") | |
174 (if (and (re-search-backward | |
175 "\*\\(Ref\\|Note\\|See\\)\\([ \t\n]+\\|$\\)" nil t) | |
176 (looking-at "\*\\(Ref\\|Note\\|See\\)[ \t\n]+\\([^:]*\\):") | |
177 (<= (match-beginning 0) opoint) | |
178 (> (match-end 0) opoint)) | |
179 ;; Remove newline and extra spaces from 'note-name' | |
180 (setq note-name (hypb:replace-match-string | |
181 "[ \n\t]+" | |
182 (buffer-substring | |
183 (match-beginning 2) (match-end 2)) | |
184 " " t)))) | |
185 (if note-name | |
186 (progn (Info-follow-reference note-name) t)))) | |
187 | |
188 (defun Info-handle-in-menu () | |
189 "Displays node referred to by an Info Menu Entry. | |
190 If point is within an Info menu entry, goes to node referenced by | |
191 entry and returns t; otherwise returns nil." | |
192 ;; | |
193 ;; Test if there is a menu in this node | |
194 ;; | |
195 (let ((in-menu nil) (curr-point (point))) | |
196 (save-excursion | |
197 (goto-char (point-min)) | |
198 (setq in-menu | |
199 (and (search-forward "\n* menu:" nil t) | |
200 (< (point) curr-point)))) | |
201 (if (not in-menu) | |
202 nil | |
203 (let ((node)) | |
204 (save-excursion | |
205 (forward-char) ; Pass '*' char if point is in front of | |
206 (if (search-backward "\n*" nil t) | |
207 (progn (forward-char 2) | |
208 (setq node (Info-extract-menu-node-name))))) | |
209 (if (null node) | |
210 nil | |
211 (if hyperb:lemacs-p | |
212 (Info-goto-node node nil t) | |
213 (Info-goto-node node)) | |
214 t))))) | |
215 | |
216 (provide 'hmous-info) |