|
|
1.1 root 1: ;;
2: ;; copyright (C) 1987, 1988 Franz Inc, Berkeley, Ca.
3: ;;
4: ;; The software, data and information contained herein are the property
5: ;; of Franz, Inc.
6: ;;
7: ;; This file (or any derivation of it) may be distributed without
8: ;; further permission from Franz Inc. as long as:
9: ;;
10: ;; * it is not part of a product for sale,
11: ;; * no charge is made for the distribution, other than a tape
12: ;; fee, and
13: ;; * all copyright notices and this notice are preserved.
14: ;;
15: ;; If you have any comments or questions on this interface, please feel
16: ;; free to contact Franz Inc. at
17: ;; Franz Inc.
18: ;; Attn: Kevin Layer
19: ;; 1995 University Ave
20: ;; Suite 275
21: ;; Berkeley, CA 94704
22: ;; (415) 548-3600
23: ;; or
24: ;; emacs-info%[email protected]
25: ;; ucbvax!franz!emacs-info
26:
27: ;; $Header: clman.el,v 1.4 89/02/15 23:19:01 layer Exp $
28:
29: (defconst clman:doc-directory
30: (let ((p load-path)
31: (string "fi/manual/")
32: (done nil) res)
33: (while (and (not done) p)
34: (if (file-exists-p (setq res (concat (car p) "/" string)))
35: (setq done t)
36: (setq res nil))
37: (setq p (cdr p)))
38: res))
39:
40: (defconst clman:package-info
41: (list
42: (list "xcw-pilot"
43: (concat clman:doc-directory "winman/pages/x-specific/new-pilot/"))
44: (list "xcw" (concat clman:doc-directory "winman/pages/x-specific/"))
45: (list "cw" (concat clman:doc-directory "winman/pages/"))
46: (list "math" (concat clman:doc-directory "mathpack/pages/"))
47: (list "lisp" (concat clman:doc-directory "refman/pages/"))))
48:
49: (if (not (boundp 'clman::oblist)) (load "fi/clman-oblist.el"))
50:
51: (defvar clman:mode-map nil)
52:
53: (defvar clman:displaying-function 'clman:find-file
54: "This function will be funcalled with two arguments, the .doc file to be
55: displayed, and the buffer which is the value of clman:displaying-buffer.
56: If you wish, you can set this variable to your own displaying function.")
57:
58: (defvar clman:displaying-buffer "*CLMan*"
59: "Either nil or a string naming the buffer that the system will use for
60: displaying documentation pages. If nil, then the system will not try to
61: reuse the same buffer.")
62:
63: (defvar clman::window-configuration nil)
64:
65: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
66: ;;;; Interactive Functions
67: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
68:
69: (defun fi:clman (&optional symbol)
70: (interactive)
71: (setq clman::window-configuration (current-window-configuration))
72: (let* ((temp-info clman:package-info)(package nil)
73: (doc-page nil)(syn nil)
74: (done nil))
75: (setq sym (or symbol (clman::get-sym-to-lookup)))
76: (while (not done)
77: (setq package (car temp-info))
78: (if (not package)
79: (progn (setq done t)
80: (message "Couldn't find the doc page for %s " sym))
81: (progn
82: (setq doc-page
83: (concat (car (cdr package))
84: (clman::file-nameify sym))))
85: (if (file-exists-p doc-page)
86: (progn
87: (setq done t)
88: (clman::display-file doc-page clman:displaying-buffer))
89: (setq temp-info (cdr temp-info)))))))
90:
91: (defun fi:clman-apropos ()
92: (interactive)
93: (let* ((oblist-buffer-name "*clman-oblist*")
94: (oblist-buffer (get-buffer-create oblist-buffer-name))
95: (string (read-string "clman apropos: ")))
96: (set-buffer oblist-buffer)
97: (let ((done nil) (lis clman::oblist))
98: (while (not done)
99: (insert-string (car (car lis)))
100: (newline 1)
101: (setq lis (cdr lis))
102: (if (null lis) (setq done t))))
103: (beginning-of-buffer)
104: (with-output-to-temp-buffer "*clman-apropos*"
105: (while (re-search-forward string nil t)
106: (beginning-of-line)
107: (princ (buffer-substring (point) (progn (end-of-line) (point))))
108: (terpri)
109: (forward-line 1)))
110: (fi:clman-mode)
111:
112: ;;why was the following here?
113: ;;(beginning-of-buffer)
114: ;;(replace-string "\"" "")
115: ;;(beginning-of-buffer)
116: ;;(replace-string "(" "")
117: ;;(beginning-of-buffer)
118: ;;(replace-string ")" "")
119: ;;(beginning-of-buffer)
120: ;;(while (search-forward "if assoc" nil t)
121: ;; (beginning-of-line)
122: ;; (kill-line 1))
123: ;;(beginning-of-buffer)
124: ))
125:
126: (defun fi:clman-mode ()
127: "Major mode for getting around
128: Like Text Mode but with these additional comands:\n\\{clman:mode-map}\n"
129: (interactive)
130: (set-syntax-table text-mode-syntax-table)
131: (use-local-map clman:mode-map)
132: (setq local-abbrev-table text-mode-abbrev-table)
133: (setq major-mode 'fi:clman-mode)
134: (setq mode-name "CLMAN")
135: (run-hooks 'text-mode-hook))
136:
137: (defun clman:search-forward-see-alsos ()
138: (interactive)
139: (if (search-forward "SEE ALSO" nil t)
140: (beginning-of-line)
141: (if (search-backward "SEE ALSO" nil t)
142: (beginning-of-line))))
143:
144: (defun clman:flush-doc ()
145: (interactive)
146: (kill-buffer (current-buffer))
147: (set-window-configuration clman::window-configuration))
148:
149: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
150: ;;;; Internal stuff
151: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
152:
153: (defun clman::get-sym-to-lookup ()
154: (interactive)
155: (let* ((str nil)(sym nil)(ans nil))
156: ;; make sure we have a symbol table
157: ;; get a symbol to look up, if the user did not provide one
158: (setq str (clman::backward-copy-sexp-as-kill))
159: (setq sym (if (or (string= str "")
160: (string= (substring str 0 1) "(")
161: (string= (substring str 0 1) "."))
162: nil (read-from-string str)))
163: (if (listp (car sym))(setq str nil))
164:
165: (setq ans (completing-read
166: (concat "Symbol (" str "): ") clman::oblist))
167: (if (string= ans "")(setq ans str))
168: (setq ans (clman::strip-leading-package-name ans))
169: ans))
170:
171: (defun clman::strip-leading-package-name (str)
172: (interactive)
173: (let ((pos (string-match ":" str)))
174: (if (and pos (not (= pos 0)))
175: (substring str (+ 1 pos) (length str))
176: str)))
177:
178: (defun clman::retrieve-doc-page (str table doc-dir)
179: "Retrieve the documentation page for the string argument, which is
180: the name of a symbol that we want to look up. If the symbol is
181: not found, you will be prompted for an alternate package. If you just
182: hit return, this function returns nil."
183: (let ((name
184: (clman::man-page-lookup str table doc-dir)))
185: ;; name is the full pathname of the doc page we want
186: (bury-buffer)
187: (if name name nil)))
188:
189: (defun clman::display-file (name buf)
190: "Display name, which is an clman .doc file according to a displaying style.
191: The displaying style is the value of the global var clman:displaying-function.
192: The two built in displaying functions are 'clman:view-file, which uses 'view,
193: and clman:find-file, which inserts the .doc file into the buffer named
194: by the value of the variable clman:displaying-buffer"
195: ;; If buf is non-nil then we want to reuse the displaying buffer,
196: ;; so have to erase it first
197: (if buf
198: (if (get-buffer buf)
199: (save-excursion
200: (switch-to-buffer buf)
201: (erase-buffer))))
202: (funcall clman:displaying-function name buf)
203: (fi:clman-mode))
204:
205: (defun clman:view-file (name buf)
206: "A built-in function that you may use for the value of
207: clman:displaying-function. This function uses the function 'view-file."
208: (view-file name))
209:
210: (defun clman:find-file (name buf)
211: "A built-in function that you may use for the value of
212: clman:displaying-function. This function uses the function 'insert-file to
213: insert the file that is named by the first argument into the buffer named
214: by the second argument."
215: (if (not (string= buf (buffer-name(current-buffer))))
216: (switch-to-buffer-other-window buf))
217: (insert-file name))
218:
219: (defun clman::man-page-lookup (str table doc-dir)
220: "Lookup a string in the filename/symbol table. The system used the
221: buffer which is named by the third element in clman-current-package-info.
222: Return the full pathname of the file the symbol is in. "
223: (interactive)
224: (switch-to-buffer table)
225: (let ((buf (current-buffer))
226: (new-str (concat " " str " "))
227: (success nil))
228: (beginning-of-buffer)
229: (setq success (search-forward new-str (point-max) t))
230: (if (not success)
231: nil
232: (beginning-of-line)
233: (setq begin (point))
234: (search-forward " ")
235: (backward-char)
236: (concat doc-dir "/" (buffer-substring begin (point))))))
237:
238: (defun clman::backward-copy-sexp-as-kill ()
239: "Low level function."
240: (backward-sexp)
241: (let* ((begin (point)) end sym)
242: (forward-sexp)
243: (clman::remove-chars-from-string '(?\ ?\n)
244: (buffer-substring begin (point)))))
245:
246: (defun clman::escape-funny-chars (sym)
247: ;; the shell requires that certain chars be preceded by \
248: ;; and that entire command be surrounded by ' '
249: (let ((temp sym)
250: (star "*")
251: (circumflex "^")
252: (dollar "$")
253: (result "")
254: (leftbrack "\[")
255: (rightbrack "\]")
256: (quote "'")
257: (backquote "`")
258: (counter 1))
259: (while (not (string= temp ""))
260: (setq ch (substring temp 0 1))
261: (if (or (string= ch star)
262: (string= ch circumflex)
263: (string= ch dollar)
264: (string= ch leftbrack)
265: (string= ch rightbrack)
266: (string= ch quote)
267: (string= ch backquote))
268: (setq result (concat result "\\" ch))
269: (setq result (concat result ch)))
270: (setq temp (substring temp 1)))
271: (setq result (concat "\"" result "\""))))
272:
273: (defun clman::sub-chars-in-string (char-assoc-list string)
274: "Substitute character pairs of CHAR-ASSOC-LIST in STRING."
275: (let (pair)
276: (mapconcat '(lambda (char)
277: (if (setq pair (assq char char-assoc-list))
278: (char-to-string (cdr pair))
279: (char-to-string char)))
280: string
281: nil)))
282:
283: (defun clman::remove-chars-from-string (char-list string)
284: "Remove characters in CHAR-LIST from string STRING and return the result."
285: (mapconcat '(lambda (char)
286: (if (memq char char-list)
287: nil
288: (char-to-string char)))
289: string
290: nil))
291:
292: (defun clman::file-nameify (str)
293: (let ((result
294: (clman::sub-chars-in-string '((?* . ?S)(?~ . ?T)
295: (?< . ?L)(?> . ?G)
296: (?/ . ?D)(?& . ?A) (?: . ?C)
297: (?= . ?E)(?\\ . ?B)
298: (?$ . ?d)(?% . ?p)
299: (?\? . ?Q) (?\( . ?o)
300: (?\) . ?c)(?| . ?V)
301: (?^ . ?K)(?\[ . ?b)
302: (?\' . ?q)(?\" . ?Z)
303: (?\# . ?h)(?\` . ?b)
304: (?\; . ?s)(?- . ?H)
305: (?, . ?k)(?+ . ?a)(?\. . ?e)(?\ . ?B)
306: )
307: str)))
308: ;; (setq result (clman::remove-chars-from-string
309: ;; '(?\ ) result))
310: (concat result ".doc")))
311:
312: (if clman:mode-map
313: nil
314: (setq clman:mode-map (make-sparse-keymap))
315: (define-key clman:mode-map "\C-C\C-C" 'clman:flush-doc)
316: (define-key clman:mode-map "a" 'fi:clman-apropos)
317: (define-key clman:mode-map "m" 'fi:clman)
318: (define-key clman:mode-map "s" 'clman:search-forward-see-alsos))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.