Mercurial > hg > xemacs-beta
comparison lisp/oobr/br-compl.el @ 0:376386a54a3c r19-14
Import from CVS: tag r19-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 08:45:50 +0200 |
parents | |
children | 4103f0995bd7 |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:376386a54a3c |
---|---|
1 ;;!emacs | |
2 ;; | |
3 ;; FILE: br-compl.el | |
4 ;; SUMMARY: Most functions for performing completion on OO constructs. | |
5 ;; USAGE: GNU Emacs Lisp Library | |
6 ;; KEYWORDS: matching, oop, tools | |
7 ;; | |
8 ;; AUTHOR: Bob Weiner | |
9 ;; ORG: Motorola Inc. | |
10 ;; | |
11 ;; ORIG-DATE: 27-Mar-90 | |
12 ;; LAST-MOD: 4-May-95 at 17:08:48 by Bob Weiner | |
13 ;; | |
14 ;; Copyright (C) 1990-1995 Free Software Foundation, Inc. | |
15 ;; See the file BR-COPY for license information. | |
16 ;; | |
17 ;; This file is part of the OO-Browser. | |
18 ;; | |
19 ;; DESCRIPTION: | |
20 ;; DESCRIP-END. | |
21 | |
22 (global-set-key "\M-\C-i" 'br-complete-symbol) | |
23 | |
24 ;; ************************************************************************ | |
25 ;; Other required Elisp libraries | |
26 ;; ************************************************************************ | |
27 | |
28 ;; Requires a number of functions from "br-lib.el", part of the OO-Browser | |
29 ;; package. See the code for functions called but not defined within this | |
30 ;; file. | |
31 | |
32 ;; ************************************************************************ | |
33 ;; Public functions | |
34 ;; ************************************************************************ | |
35 | |
36 (defun br-buffer-menu () | |
37 "Display list of buffers for current browser language in the viewer window." | |
38 (interactive) | |
39 (or (br-in-view-window-p) | |
40 (setq *br-prev-listing-window* (selected-window))) | |
41 (let ((owind (selected-window)) | |
42 (ovbuf (save-window-excursion | |
43 (br-to-view-window) | |
44 (current-buffer)))) | |
45 (buffer-menu 'files-only) | |
46 (narrow-to-region (point) (point-max)) | |
47 (let ((buffer-read-only nil) | |
48 (buf-name)) | |
49 (while (setq buf-name (br-buffer-menu-buffer-name)) | |
50 (if (not (string-match br-src-file-regexp buf-name)) | |
51 (delete-region (point) (progn (forward-line 1) (point))) | |
52 (forward-line 1)))) | |
53 (goto-char (point-min)) | |
54 (widen) | |
55 (if (looking-at "^$") ;; No matching buffers | |
56 (progn | |
57 (switch-to-buffer ovbuf) | |
58 (select-window owind) | |
59 (beep) | |
60 (message | |
61 "(OO-Browser): No appropriate buffers available for selection.")) | |
62 (set-window-start nil 1) | |
63 (substitute-key-definition 'Buffer-menu-select 'br-buffer-menu-select | |
64 Buffer-menu-mode-map) | |
65 (message "(OO-Browser): Select a buffer for display.")))) | |
66 | |
67 (defun br-buffer-menu-buffer-name () | |
68 "Return name of buffer on curren buffer menu line or nil. | |
69 Leaves point at the beginning of the current line." | |
70 (if (= (point) (point-max)) | |
71 nil | |
72 (beginning-of-line) | |
73 (forward-char Buffer-menu-buffer-column) | |
74 (let ((start (point))) | |
75 ;; End of buffer name marked by tab or two spaces. | |
76 (if (not (re-search-forward "\t\\| ")) | |
77 nil | |
78 (skip-chars-backward " \t") | |
79 (prog1 | |
80 (buffer-substring start (point)) | |
81 (beginning-of-line)))))) | |
82 | |
83 (defun br-buffer-menu-select () | |
84 "Display buffer associated with the line that point is on." | |
85 (interactive) | |
86 (substitute-key-definition 'br-buffer-menu-select 'Buffer-menu-select | |
87 Buffer-menu-mode-map) | |
88 (let ((buff (Buffer-menu-buffer t)) | |
89 (menu (current-buffer))) | |
90 (if buff | |
91 (progn (switch-to-buffer buff) | |
92 (or (eq menu buff) | |
93 (bury-buffer menu))) | |
94 (beep)))) | |
95 | |
96 (defun br-complete-entry (&optional prompt) | |
97 "Interactively completes class or feature name and returns it or nil. | |
98 Optional PROMPT is initial prompt string for user." | |
99 (interactive) | |
100 (let ((default (and (br-in-browser) | |
101 (not (br-in-view-window-p)) | |
102 (br-find-class-name))) | |
103 (completion-ignore-case t) | |
104 completions | |
105 element-name) | |
106 (if (not (br-class-path default)) (setq default nil)) | |
107 ;; Prompt with possible completions of element-name. | |
108 (setq prompt (or prompt "Class/Element name:") | |
109 completions (append (br-class-completions) | |
110 (br-feature-completions)) | |
111 element-name | |
112 (if completions | |
113 (completing-read | |
114 (format "%s (default %s) " prompt (or default "<None>")) | |
115 completions nil 'must-match) | |
116 (read-string | |
117 (format "%s (default %s) " prompt (or default "<None>"))))) | |
118 (if (equal element-name "") (setq element-name default)) | |
119 element-name)) | |
120 | |
121 (defun br-complete-symbol () | |
122 "Complete symbol preceding point." | |
123 (interactive) | |
124 (cond ((and (fboundp 'br-lang-mode) | |
125 (eq major-mode (symbol-function 'br-lang-mode))) | |
126 (br-complete-type)) | |
127 (t | |
128 (lisp-complete-symbol)))) | |
129 | |
130 (defun br-complete-class-name (&optional must-match prompt) | |
131 "Interactively completes class name if possible, and returns class name. | |
132 Optional MUST-MATCH means class name must match a completion table entry. | |
133 Optional PROMPT is intial prompt string for user." | |
134 (interactive) | |
135 (let ((default (br-find-class-name)) | |
136 (completion-ignore-case t) | |
137 completions | |
138 class-name) | |
139 ;; Prompt with possible completions of class-name. | |
140 (setq prompt (or prompt "Class name:") | |
141 completions (br-class-completions) | |
142 class-name | |
143 (if completions | |
144 (completing-read | |
145 (format "%s (default %s) " prompt default) | |
146 completions nil must-match) | |
147 (read-string | |
148 (format "%s (default %s) " prompt default)))) | |
149 (if (equal class-name "") default class-name))) | |
150 | |
151 (defun br-lisp-mode-p () | |
152 (or (eq major-mode 'lisp-mode) | |
153 (eq major-mode 'emacs-lisp-mode) | |
154 (eq major-mode 'scheme-mode) | |
155 (eq major-mode 'lisp-interaction-mode))) | |
156 | |
157 (defun br-complete-type () | |
158 "Perform in-buffer completion of a type or element identifier before point. | |
159 That symbol is compared against current Environment entries and any needed | |
160 characters are inserted." | |
161 (interactive) | |
162 (let* ((completion-ignore-case nil) | |
163 (end (point)) | |
164 (beg (save-excursion | |
165 (if (br-lisp-mode-p) | |
166 nil | |
167 (skip-chars-backward "^()") | |
168 (if (eq (preceding-char) ?\() | |
169 (skip-chars-backward " \t\(") | |
170 (goto-char end)) | |
171 ) | |
172 (skip-chars-backward (concat br-identifier-chars ":")) | |
173 (point))) | |
174 (pattern (br-set-case (buffer-substring beg end))) | |
175 (type-p) | |
176 (completion-alist (if (string-match br-feature-signature-regexp | |
177 pattern) | |
178 (br-feature-completions) | |
179 (setq type-p t) | |
180 (br-class-completions))) | |
181 (completion (try-completion pattern completion-alist))) | |
182 (cond ((eq completion t)) | |
183 ((null completion) | |
184 (message "Can't find completion for '%s'" pattern) | |
185 (ding)) | |
186 ((not (string-equal pattern completion)) | |
187 (delete-region beg end) | |
188 (insert (if type-p | |
189 (br-set-case-type completion) | |
190 completion))) | |
191 (t | |
192 (message "Making completion list...") | |
193 (let ((list (sort (all-completions pattern completion-alist) | |
194 'string-lessp))) | |
195 (let (new) | |
196 (while list | |
197 (setq new (cons (car list) new) | |
198 list (cdr list))) | |
199 (setq list (nreverse new))) | |
200 (with-output-to-temp-buffer "*Completions*" | |
201 (display-completion-list list))) | |
202 (message "Making completion list...%s" "done"))))) | |
203 | |
204 ;; Derived from saveconf.el. | |
205 (defun br-window-list () | |
206 "Returns a list of Lisp window objects for all Emacs windows. | |
207 Do not count the minibuffer window even if it is active." | |
208 (let* ((first-window (next-window (previous-window (selected-window)))) | |
209 (windows (cons first-window nil)) | |
210 (current-cons windows) | |
211 (w (next-window first-window))) | |
212 (while (not (eq w first-window)) | |
213 (setq current-cons (setcdr current-cons (cons w nil))) | |
214 (setq w (next-window w))) | |
215 windows)) | |
216 | |
217 ;; ************************************************************************ | |
218 ;; Private functions | |
219 ;; ************************************************************************ | |
220 | |
221 (defun br-all-classes (&optional htable-type duplicates-flag) | |
222 "Return list of class names in Environment or optional HTABLE-TYPE. | |
223 HTABLE-TYPE may be \"sys\" or \"lib\" or an actual hash table. | |
224 List is not sorted unless optional DUPLICATES-FLAG is non-nil, which means cons | |
225 the the sorted list of duplicate classes onto the front of the unique class | |
226 names list." | |
227 (let ((classes | |
228 (apply 'append | |
229 (hash-map | |
230 (function (lambda (val-key-cons) | |
231 ;; Copy so that hash-table values are not | |
232 ;; disturbed. | |
233 (copy-sequence (car val-key-cons)))) | |
234 (cond ((and (stringp htable-type) | |
235 (not (string-equal htable-type ""))) | |
236 (br-get-htable (concat htable-type "-paths"))) | |
237 ((hashp htable-type) htable-type) | |
238 (t (br-get-paths-htable))))))) | |
239 (if duplicates-flag | |
240 (br-duplicate-and-unique-strings (sort classes 'string-lessp)) | |
241 classes))) | |
242 | |
243 (defun br-class-completions () | |
244 "Return alist of elements whose cars are all class names in lookup table." | |
245 (mapcar (function (lambda (elt) (cons elt nil))) | |
246 (br-class-list-filter (sort (br-all-classes) 'string-lessp)))) | |
247 | |
248 (defun br-find-class-name (&optional keep-indent) | |
249 "Return class name that point is within in a listing buffer, else nil. | |
250 Optional KEEP-INDENT non-nil means keep indentation preceding class name." | |
251 (if (= (point) (point-max)) (skip-chars-backward " \t\n")) | |
252 (save-excursion | |
253 (if (looking-at (concat "[ \t]*" br-feature-type-regexp "?[ \t]+")) | |
254 (goto-char (match-end 0))) | |
255 (let ((objc (string-equal br-lang-prefix "objc-")) | |
256 (class)) | |
257 (if objc | |
258 ;; Include [] characters for default classes, <> for Objective-C | |
259 ;; protocols and () for Objective-C class categories. | |
260 (skip-chars-backward (concat "\]\[()<>" br-identifier-chars)) | |
261 (skip-chars-backward (concat "\]\[" br-identifier-chars))) | |
262 (if (or (and objc | |
263 (or | |
264 ;; Objective-C protocol | |
265 (looking-at (concat "<" br-identifier ">")) | |
266 ;; Objective-C class(category) | |
267 (looking-at (concat br-identifier "(" br-identifier ")")) | |
268 ;; Objective-C class(category) | |
269 (if (looking-at | |
270 (concat "\\((" br-identifier ")\\)" br-identifier)) | |
271 (setq class (concat (buffer-substring (match-end 1) | |
272 (match-end 0)) | |
273 (buffer-substring | |
274 (match-beginning 1) | |
275 (match-end 1))))))) | |
276 (looking-at br-identifier) | |
277 ;; default class | |
278 (looking-at (concat "\\[" br-identifier "\\]"))) | |
279 (progn (if keep-indent (beginning-of-line)) | |
280 (br-set-case (or class | |
281 (buffer-substring (point) | |
282 (match-end 0))))))))) | |
283 | |
284 (provide 'br-compl) |