Mercurial > hg > xemacs-beta
annotate lisp/list-mode.el @ 5553:62edcc6a11ec
Add an assertion about argument order to #'apply-partially compiler macro
lisp/ChangeLog addition:
2011-08-24 Aidan Kehoe <kehoea@parhasard.net>
* cl-macs.el (apply-partially):
Add an assertion to this compiler macro, requiring that the order
of the placeholders corresponding to the arguments in the
constants vector of the constructed compiled function be the same
as the order of the arguments to #'apply-partially.
tests/ChangeLog addition:
2011-08-24 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
Add a test of apply partially that depends on the relative order
of its arguments.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Wed, 24 Aug 2011 11:06:41 +0100 |
parents | 89331fa1c819 |
children |
rev | line source |
---|---|
428 | 1 ;;; list-mode.el --- Major mode for buffers containing lists of items |
2 | |
3 ;; Copyright (C) 1992-4, 1997 Free Software Foundation, Inc. | |
442 | 4 ;; Copyright (C) 1996, 2000 Ben Wing. |
428 | 5 |
6 ;; Maintainer: XEmacs Development Team | |
7 ;; Keywords: extensions, dumped | |
8 | |
9 ;; This file is part of XEmacs. | |
10 | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
11 ;; XEmacs is free software: you can redistribute it and/or modify it |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
12 ;; under the terms of the GNU General Public License as published by the |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
13 ;; Free Software Foundation, either version 3 of the License, or (at your |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
14 ;; option) any later version. |
428 | 15 |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
16 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
17 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
18 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License |
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
19 ;; for more details. |
428 | 20 |
21 ;; You should have received a copy of the GNU General Public License | |
5402
308d34e9f07d
Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents:
4791
diff
changeset
|
22 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>. |
428 | 23 |
24 ;;; Synched up with: Not synched | |
25 | |
26 ;;; Commentary: | |
27 | |
28 ;; This file is dumped with XEmacs. | |
29 | |
30 ;; Cleanup, merging with FSF by Ben Wing, January 1996 | |
31 | |
32 ;;; Code: | |
33 | |
34 (defvar list-mode-extent nil) | |
35 (make-variable-buffer-local 'list-mode-extent) | |
36 | |
37 (defvar list-mode-map nil | |
38 "Local map for buffers containing lists of items.") | |
39 (or list-mode-map | |
40 (let ((map (setq list-mode-map (make-sparse-keymap 'list-mode-map)))) | |
41 (suppress-keymap map) | |
42 (define-key map 'button2up 'list-mode-item-mouse-selected) | |
43 (define-key map 'button2 'undefined) | |
44 (define-key map "\C-m" 'list-mode-item-keyboard-selected) | |
45 ;; | |
46 ;; The following calls to `substitute-key-definition' losed because | |
47 ;; they were based on an incorrect assumption that `forward-char' and | |
48 ;; `backward-char' are bound to keys in the global map. This might not | |
49 ;; be the case if a user binds motion keys to different functions, | |
50 ;; and was not actually the case since 20.5 beta 28 or around. | |
51 ;; | |
52 ;; (substitute-key-definition 'forward-char 'next-list-mode-item map | |
53 ;; global-map) | |
54 ;; (substitute-key-definition 'backward-char 'previous-list-mode-item map | |
55 ;; global-map) | |
56 ;; | |
57 ;; We bind standard keys to motion commands instead. | |
58 ;; | |
59 (dolist (key '(kp-right right (control ?f))) | |
60 (define-key map key 'next-list-mode-item)) | |
61 (dolist (key '(kp-left left (control ?b))) | |
62 (define-key map key 'previous-list-mode-item)))) | |
63 | |
442 | 64 ;; #### We make list-mode-hook, as well as completion-setup-hook and |
65 ;; minibuffer-setup-hook, permanent-local so that it's possible to create | |
66 ;; buffers in these modes and then set up some buffer-specific | |
67 ;; customizations without resorting to awful kludges. (The problem here | |
68 ;; is that when you switch a buffer into a mode, reset-buffer is usually | |
69 ;; called, which destroys all buffer-local settings that you carefully | |
70 ;; tried to set up when you created the buffer. Therefore, the only way | |
71 ;; to set these variables is to use the setup hooks -- but if they are | |
72 ;; not declared permanent local, then any local hook functions that you | |
73 ;; put on them (which is exactly what you want to do) also get removed, | |
74 ;; so you would have to resort to putting a global hook function on the | |
75 ;; setup hook, and then making sure it gets removed later. I actually | |
76 ;; added some support for doing this with one-shot hooks, but this is | |
77 ;; clearly not the correct way to do things, and it fails in some cases, | |
78 ;; particularly when the buffer gets put into the mode more than once, | |
79 ;; which typically happens with completion buffers, for example.) In | |
80 ;; fact, all setup hooks should be made permanent local, but I didn't | |
81 ;; feel like making a global change like this quite yet. The proper way | |
82 ;; to do it would be to declare new def-style forms, such as defhook and | |
83 ;; define-local-setup-hook, which are used to initialize hooks in place | |
84 ;; of the current generic defvars. --ben | |
85 | |
86 (put 'list-mode-hook 'permanent-local t) | |
87 (defvar list-mode-hook nil | |
88 "Normal hook run when entering List mode.") | |
89 | |
428 | 90 (defun list-mode () |
91 "Major mode for buffer containing lists of items." | |
92 (interactive) | |
93 (kill-all-local-variables) | |
94 (use-local-map list-mode-map) | |
95 (setq mode-name "List") | |
96 (setq major-mode 'list-mode) | |
442 | 97 (add-local-hook 'post-command-hook 'set-list-mode-extent) |
98 (add-local-hook 'pre-command-hook 'list-mode-extent-pre-hook) | |
99 (set (make-local-variable 'next-line-add-newlines) nil) | |
428 | 100 (setq list-mode-extent nil) |
101 ;; It is visually disconcerting to have the text cursor disappear within list | |
102 ;; buffers, especially when moving from window to window, so leave it | |
103 ;; visible. -- Bob Weiner, 06/20/1999 | |
104 ; (set-specifier text-cursor-visible-p nil (current-buffer)) | |
105 (setq buffer-read-only t) | |
106 (goto-char (point-min)) | |
107 (run-hooks 'list-mode-hook)) | |
108 | |
109 ;; List mode is suitable only for specially formatted data. | |
110 (put 'list-mode 'mode-class 'special) | |
111 | |
112 (defvar list-mode-extent-old-point nil | |
113 "The value of point when pre-command-hook is called. | |
114 Used to determine the direction of motion.") | |
115 (make-variable-buffer-local 'list-mode-extent-old-point) | |
116 | |
117 (defun list-mode-extent-pre-hook () | |
118 (setq list-mode-extent-old-point (point)) | |
119 ;(setq atomic-extent-goto-char-p nil) | |
120 ) | |
121 | |
122 (defun set-list-mode-extent () | |
123 "Move to the closest list item and set up the extent for it. | |
124 This is called from `post-command-hook'." | |
125 (cond ((get-char-property (point) 'list-mode-item)) | |
126 ((and (> (point) (point-min)) | |
127 (get-char-property (1- (point)) 'list-mode-item)) | |
128 (goto-char (1- (point)))) | |
129 (t | |
130 (let ((pos (point)) | |
131 dirflag) | |
132 ;this fucks things up more than it helps. | |
133 ;atomic-extent-goto-char-p as currently defined is all broken, | |
134 ;since it will be triggered if the command *ever* runs goto-char! | |
135 ;(if atomic-extent-goto-char-p | |
136 ; (setq dirflag 1) | |
137 (if (and list-mode-extent-old-point | |
138 (> pos list-mode-extent-old-point)) | |
139 (setq dirflag 1) | |
140 (setq dirflag -1)) | |
141 (next-list-mode-item dirflag) | |
142 (or (get-char-property (point) 'list-mode-item) | |
143 (next-list-mode-item (- dirflag)))))) | |
144 (or (and list-mode-extent | |
145 (eq (current-buffer) (extent-object list-mode-extent))) | |
146 (progn | |
147 (setq list-mode-extent (make-extent nil nil (current-buffer))) | |
148 (set-extent-face list-mode-extent 'list-mode-item-selected))) | |
149 (let ((ex (extent-at (point) nil 'list-mode-item nil 'at))) | |
150 (if ex | |
151 (progn | |
152 (set-extent-endpoints list-mode-extent | |
153 (extent-start-position ex) | |
154 (extent-end-position ex)) | |
155 (auto-show-make-region-visible (extent-start-position ex) | |
156 (extent-end-position ex))) | |
157 (detach-extent list-mode-extent)))) | |
158 | |
159 (defun previous-list-mode-item (n) | |
160 "Move to the previous item in list-mode." | |
161 (interactive "p") | |
162 (next-list-mode-item (- n))) | |
163 | |
164 (defun next-list-mode-item (n) | |
165 "Move to the next item in list-mode. | |
166 With prefix argument N, move N items (negative N means move backward)." | |
167 (interactive "p") | |
168 (while (and (> n 0) (not (eobp))) | |
169 (let ((extent (extent-at (point) (current-buffer) 'list-mode-item)) | |
170 (end (point-max))) | |
171 ;; If in a completion, move to the end of it. | |
172 (if extent (goto-char (extent-end-position extent))) | |
173 ;; Move to start of next one. | |
174 (or (extent-at (point) (current-buffer) 'list-mode-item) | |
4791
ea07b60c097f
Fix issue 546, use next-single-char-property-change in list-mode.el
Aidan Kehoe <kehoea@parhasard.net>
parents:
2098
diff
changeset
|
175 (goto-char (next-single-char-property-change (point) |
ea07b60c097f
Fix issue 546, use next-single-char-property-change in list-mode.el
Aidan Kehoe <kehoea@parhasard.net>
parents:
2098
diff
changeset
|
176 'list-mode-item |
ea07b60c097f
Fix issue 546, use next-single-char-property-change in list-mode.el
Aidan Kehoe <kehoea@parhasard.net>
parents:
2098
diff
changeset
|
177 nil end)))) |
428 | 178 (setq n (1- n))) |
179 (while (and (< n 0) (not (bobp))) | |
180 (let ((extent (extent-at (point) (current-buffer) 'list-mode-item)) | |
181 (end (point-min))) | |
182 ;; If in a completion, move to the start of it. | |
183 (if extent (goto-char (extent-start-position extent))) | |
184 ;; Move to the start of that one. | |
185 (if (setq extent (extent-at (point) (current-buffer) 'list-mode-item | |
186 nil 'before)) | |
187 (goto-char (extent-start-position extent)) | |
4791
ea07b60c097f
Fix issue 546, use next-single-char-property-change in list-mode.el
Aidan Kehoe <kehoea@parhasard.net>
parents:
2098
diff
changeset
|
188 (goto-char (previous-single-char-property-change |
428 | 189 (point) 'list-mode-item nil end)) |
190 (if (setq extent (extent-at (point) (current-buffer) 'list-mode-item | |
191 nil 'before)) | |
192 (goto-char (extent-start-position extent))))) | |
193 (setq n (1+ n)))) | |
194 | |
195 (defun list-mode-item-selected-1 (extent event) | |
196 (let ((func (extent-property extent 'list-mode-item-activate-callback)) | |
197 (user-data (extent-property extent 'list-mode-item-user-data))) | |
198 (if func | |
199 (funcall func event extent user-data)))) | |
200 | |
201 ;; we could make these two be just one function, but we want to be | |
202 ;; able to refer to them in DOC strings. | |
203 | |
204 (defun list-mode-item-keyboard-selected () | |
205 (interactive) | |
206 (list-mode-item-selected-1 (extent-at (point) (current-buffer) | |
207 'list-mode-item nil 'at) | |
208 nil)) | |
209 | |
210 (defun list-mode-item-mouse-selected (event) | |
211 (interactive "e") | |
212 ;; Sometimes event-closest-point returns nil. | |
213 ;; So beep instead of bombing. | |
214 (let ((point (event-closest-point event))) | |
215 (if point | |
216 (list-mode-item-selected-1 (extent-at point | |
217 (event-buffer event) | |
218 'list-mode-item nil 'at) | |
219 event) | |
220 (ding)))) | |
221 | |
222 (defun add-list-mode-item (start end &optional buffer activate-callback | |
223 user-data) | |
224 "Add a new list item in list-mode, from START to END in BUFFER. | |
225 BUFFER defaults to the current buffer. | |
226 This works by creating an extent for the span of text in question. | |
227 If ACTIVATE-CALLBACK is non-nil, it should be a function of three | |
228 arguments (EVENT EXTENT USER-DATA) that will be called when button2 | |
229 is pressed on the extent. USER-DATA comes from the optional | |
230 USER-DATA argument." | |
231 (let ((extent (make-extent start end buffer))) | |
232 (set-extent-property extent 'list-mode-item t) | |
233 (set-extent-property extent 'start-open t) | |
234 (if activate-callback | |
235 (progn | |
236 (set-extent-property extent 'mouse-face 'highlight) | |
237 (set-extent-property extent 'list-mode-item-activate-callback | |
238 activate-callback) | |
239 (set-extent-property extent 'list-mode-item-user-data user-data))) | |
240 extent)) | |
241 | |
242 | |
243 ;; Define the major mode for lists of completions. | |
244 | |
245 | |
246 (defvar completion-highlight-first-word-only nil | |
247 "*Completion will only highlight the first blank delimited word if t. | |
248 If the variable in not t or nil, the string is taken as a regexp to match for end | |
249 of highlight") | |
250 | |
442 | 251 ;; see comment at list-mode-hook. |
252 (put 'completion-setup-hook 'permanent-local t) | |
428 | 253 (defvar completion-setup-hook nil |
442 | 254 "Normal hook run at the end of setting up the text of a completion buffer. |
255 When run, the completion buffer is the current buffer.") | |
428 | 256 |
257 ; Unnecessary FSFmacs crock. We frob the extents directly in | |
258 ; display-completion-list, so no "heuristics" like this are necessary. | |
259 ;(defvar completion-fixup-function nil | |
260 ; "A function to customize how completions are identified in completion lists. | |
261 ;`completion-setup-function' calls this function with no arguments | |
262 ;each time it has found what it thinks is one completion. | |
263 ;Point is at the end of the completion in the completion list buffer. | |
264 ;If this function moves point, it can alter the end of that completion.") | |
265 | |
266 (defvar completion-default-help-string | |
267 '(concat | |
268 (if (device-on-window-system-p) | |
269 (substitute-command-keys | |
270 "Click \\<list-mode-map>\\[list-mode-item-mouse-selected] on a completion to select it.\n") "") | |
271 (substitute-command-keys | |
272 "Type \\<minibuffer-local-completion-map>\\[advertised-switch-to-completions] or \\[switch-to-completions] to move to this buffer, for keyboard selection.\n\n")) | |
273 "Form the evaluate to get a help string for completion lists. | |
274 This string is inserted at the beginning of the buffer. | |
275 See `display-completion-list'.") | |
276 | |
5330
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
277 (defun* display-completion-list (completions &key user-data reference-buffer |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
278 (activate-callback 'default-choose-completion) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
279 (help-string completion-default-help-string) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
280 (completion-string "Possible completions are:") |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
281 window-width window-height) |
428 | 282 "Display the list of completions, COMPLETIONS, using `standard-output'. |
283 Each element may be just a symbol or string or may be a list of two | |
284 strings to be printed as if concatenated. | |
285 Frob a mousable extent onto each completion. This extent has properties | |
286 'mouse-face (so it highlights when the mouse passes over it) and | |
287 'list-mode-item (so it can be located). | |
288 | |
289 Keywords: | |
290 :activate-callback (default is `default-choose-completion') | |
291 See `add-list-mode-item'. | |
292 :user-data | |
293 Value passed to activation callback. | |
294 :window-width | |
295 If non-nil, width to use in displaying the list, instead of the | |
296 actual window's width. | |
442 | 297 :window-height |
298 If non-nil, use no more than this many lines, and extend line width as | |
299 necessary. | |
428 | 300 :help-string (default is the value of `completion-default-help-string') |
301 Form to evaluate to get a string to insert at the beginning of | |
302 the completion list buffer. This is evaluated when that buffer | |
303 is the current buffer and after it has been put into | |
304 completion-list-mode. | |
305 :reference-buffer (default is the current buffer) | |
306 This specifies the value of `completion-reference-buffer' in | |
307 the completion buffer. This specifies the buffer (normally a | |
308 minibuffer) that `default-choose-completion' will insert the | |
309 completion into. | |
310 | |
311 At the end, run the normal hook `completion-setup-hook'. | |
312 It can find the completion buffer in `standard-output'. | |
313 If `completion-highlight-first-word-only' is non-nil, then only the start | |
314 of the string is highlighted." | |
5330
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
315 ;; #### I18N3 should set standard-output to be (temporarily) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
316 ;; output-translating. |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
317 (let ((old-buffer (current-buffer)) (bufferp (bufferp standard-output))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
318 (if bufferp |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
319 (set-buffer standard-output)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
320 (if (null completions) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
321 (princ (gettext |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
322 "There are no possible completions of what you have typed.")) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
323 (let ((win-width |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
324 (or window-width |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
325 (if bufferp |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
326 ;; We have to use last-nonminibuf-frame here |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
327 ;; and not selected-frame because if a |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
328 ;; minibuffer-only frame is being used it will |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
329 ;; be the selected-frame at the point this is |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
330 ;; run. We keep the selected-frame call around |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
331 ;; just in case. |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
332 (window-width (get-lru-window (last-nonminibuf-frame))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
333 80)))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
334 (let ((count 0) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
335 (max-width 0) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
336 old-max-width) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
337 ;; Find longest completion |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
338 (let ((tail completions)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
339 (while tail |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
340 (let* ((elt (car tail)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
341 (len (cond ((stringp elt) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
342 (length elt)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
343 ((and (consp elt) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
344 (stringp (car elt)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
345 (stringp (car (cdr elt)))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
346 (+ (length (car elt)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
347 (length (car (cdr elt))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
348 (t |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
349 (signal 'wrong-type-argument |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
350 (list 'stringp elt)))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
351 (if (> len max-width) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
352 (setq max-width len)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
353 (setq count (1+ count) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
354 tail (cdr tail))))) |
428 | 355 |
5330
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
356 (setq max-width (+ 2 max-width)) ; at least two chars between cols |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
357 (setq old-max-width max-width) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
358 (let ((rows (let ((cols (min (/ win-width max-width) count))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
359 (if (<= cols 1) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
360 count |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
361 (progn |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
362 ;; re-space the columns |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
363 (setq max-width (/ win-width cols)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
364 (if (/= (% count cols) 0) ; want ceiling... |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
365 (1+ (/ count cols)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
366 (/ count cols))))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
367 (when |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
368 (and window-height |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
369 (> rows window-height)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
370 (setq max-width old-max-width) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
371 (setq rows window-height)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
372 (when (and (stringp completion-string) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
373 (> (length completion-string) 0)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
374 (princ (gettext completion-string)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
375 (terpri)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
376 (let ((tail completions) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
377 (r 0) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
378 (regexp-string |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
379 (if (eq t |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
380 completion-highlight-first-word-only) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
381 "[ \t]" |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
382 completion-highlight-first-word-only))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
383 (while (< r rows) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
384 (and (> r 0) (terpri)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
385 (let ((indent 0) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
386 (column 0) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
387 (tail2 tail)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
388 (while tail2 |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
389 (let ((elt (car tail2))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
390 (if (/= indent 0) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
391 (if bufferp |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
392 (indent-to indent 2) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
393 (while (progn (write-char ?\ ) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
394 (setq column (1+ column)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
395 (< column indent))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
396 (setq indent (+ indent max-width)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
397 (let ((start (point)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
398 end) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
399 ;; Frob some mousable extents in there too! |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
400 (if (consp elt) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
401 (progn |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
402 (princ (car elt)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
403 (princ (car (cdr elt))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
404 (or bufferp |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
405 (setq column |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
406 (+ column |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
407 (length (car elt)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
408 (length (car (cdr elt))))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
409 (progn |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
410 (princ elt) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
411 (or bufferp |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
412 (setq column (+ column (length |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
413 elt)))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
414 (add-list-mode-item |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
415 start |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
416 (progn |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
417 (setq end (point)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
418 (or |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
419 (and completion-highlight-first-word-only |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
420 (goto-char start) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
421 (re-search-forward regexp-string end t) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
422 (match-beginning 0)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
423 end)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
424 nil activate-callback user-data) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
425 (goto-char end))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
426 (setq tail2 (nthcdr rows tail2))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
427 (setq tail (cdr tail) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
428 r (1+ r))))))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
429 (if bufferp |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
430 (set-buffer old-buffer))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
431 (save-excursion |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
432 (let ((mainbuf (or reference-buffer (current-buffer)))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
433 (set-buffer standard-output) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
434 (completion-list-mode) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
435 (make-local-variable 'completion-reference-buffer) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
436 (setq completion-reference-buffer mainbuf) |
428 | 437 ;;; The value 0 is right in most cases, but not for file name completion. |
438 ;;; so this has to be turned off. | |
5330
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
439 ;;; (setq completion-base-size 0) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
440 (goto-char (point-min)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
441 (let ((buffer-read-only nil)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
442 (insert (eval help-string))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
443 ;; unnecessary FSFmacs crock |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
444 ;;(forward-line 1) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
445 ;;(while (re-search-forward "[^ \t\n]+\\( [^ \t\n]+\\)*" nil t) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
446 ;; (let ((beg (match-beginning 0)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
447 ;; (end (point))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
448 ;; (if completion-fixup-function |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
449 ;; (funcall completion-fixup-function)) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
450 ;; (put-text-property beg (point) 'mouse-face 'highlight) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
451 ;; (put-text-property beg (point) 'list-mode-item t) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
452 ;; (goto-char end))))) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
453 )) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
454 (save-excursion |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
455 (set-buffer standard-output) |
fbafdc1bb4d2
Use defun*, not cl-parsing-keywords, #'make-dialog-box, #'display-completion-list
Aidan Kehoe <kehoea@parhasard.net>
parents:
4791
diff
changeset
|
456 (run-hooks 'completion-setup-hook))) |
428 | 457 |
458 (defvar completion-display-completion-list-function 'display-completion-list | |
459 "Function to set up the list of completions in the completion buffer. | |
460 The function is called with one argument, the sorted list of completions. | |
461 Particular minibuffer interface functions (e.g. `read-file-name') may | |
462 want to change this. To do that, set a local value for this variable | |
463 in the minibuffer; that ensures that other minibuffer invocations will | |
464 not be affected.") | |
465 | |
466 (defun minibuffer-completion-help () | |
467 "Display a list of possible completions of the current minibuffer contents. | |
468 The list of completions is determined by calling `all-completions', | |
469 passing it the current minibuffer contents, the value of | |
470 `minibuffer-completion-table', and the value of | |
471 `minibuffer-completion-predicate'. The list is displayed by calling | |
472 the value of `completion-display-completion-list-function' on the sorted | |
473 list of completions, with the standard output set to the completion | |
474 buffer." | |
475 (interactive) | |
476 (message "Making completion list...") | |
477 (let ((completions (all-completions (buffer-string) | |
478 minibuffer-completion-table | |
479 minibuffer-completion-predicate))) | |
480 (message nil) | |
481 (if (null completions) | |
482 (progn | |
483 (ding nil 'no-completion) | |
484 (temp-minibuffer-message " [No completions]")) | |
485 (with-output-to-temp-buffer "*Completions*" | |
486 (funcall completion-display-completion-list-function | |
487 (sort completions #'string-lessp)))))) | |
488 | |
489 (define-derived-mode completion-list-mode list-mode | |
490 "Completion List" | |
491 "Major mode for buffers showing lists of possible completions. | |
492 \\{completion-list-mode-map}" | |
493 (make-local-variable 'completion-base-size) | |
494 (setq completion-base-size nil)) | |
495 | |
496 (let ((map completion-list-mode-map)) | |
497 (define-key map 'button2up 'mouse-choose-completion) | |
498 (define-key map 'button2 'undefined) | |
499 (define-key map "\C-m" 'choose-completion) | |
500 (define-key map "\e\e\e" 'delete-completion-window) | |
501 (define-key map "\C-g" 'minibuffer-keyboard-quit) | |
502 (define-key map "q" 'completion-list-mode-quit) | |
503 (define-key map " " 'completion-switch-to-minibuffer) | |
504 ;; [Tab] used to switch to the minibuffer but since [space] does that and | |
505 ;; since most applications in the world use [Tab] to select the next item | |
506 ;; in a list, do that in the *Completions* buffer too. -- Bob Weiner, | |
507 ;; BeOpen.com, 06/23/1999. | |
508 (define-key map "\t" 'next-list-mode-item)) | |
509 | |
510 (defvar completion-reference-buffer nil | |
511 "Record the buffer that was current when the completion list was requested. | |
512 This is a local variable in the completion list buffer. | |
513 Initial value is nil to avoid some compiler warnings.") | |
514 | |
515 (defvar completion-base-size nil | |
516 "Number of chars at beginning of minibuffer not involved in completion. | |
517 This is a local variable in the completion list buffer | |
518 but it talks about the buffer in `completion-reference-buffer'. | |
519 If this is nil, it means to compare text to determine which part | |
520 of the tail end of the buffer's text is involved in completion.") | |
521 | |
522 ;; These names are referenced in the doc string for `completion-list-mode'. | |
523 (defalias 'choose-completion 'list-mode-item-keyboard-selected) | |
524 (defalias 'mouse-choose-completion 'list-mode-item-mouse-selected) | |
525 | |
526 (defun delete-completion-window () | |
527 "Delete the completion list window. | |
528 Go to the window from which completion was requested." | |
529 (interactive) | |
530 (let ((buf completion-reference-buffer)) | |
531 (delete-window (selected-window)) | |
532 (if (get-buffer-window buf) | |
533 (select-window (get-buffer-window buf))))) | |
534 | |
535 (defun completion-switch-to-minibuffer () | |
536 "Move from a completions buffer to the active minibuffer window." | |
537 (interactive) | |
538 (select-window (minibuffer-window))) | |
539 | |
540 (defun completion-list-mode-quit () | |
541 "Abort any recursive edit and bury the completions buffer." | |
542 (interactive) | |
543 (condition-case () | |
544 (abort-recursive-edit) | |
545 (error nil)) | |
546 ;; If there was no recursive edit to abort, simply bury the completions | |
547 ;; list buffer. | |
548 (if (eq major-mode 'completion-list-mode) (bury-buffer))) | |
549 | |
550 (defun completion-do-in-minibuffer () | |
551 (interactive "_") | |
552 (save-excursion | |
553 (set-buffer (window-buffer (minibuffer-window))) | |
554 (call-interactively (key-binding (this-command-keys))))) | |
555 | |
556 (defun default-choose-completion (event extent buffer) | |
557 "Click on an alternative in the `*Completions*' buffer to choose it." | |
558 (and (button-event-p event) | |
559 ;; Give temporary modes such as isearch a chance to turn off. | |
560 (run-hooks 'mouse-leave-buffer-hook)) | |
561 (or buffer (setq buffer (symbol-value-in-buffer | |
562 'completion-reference-buffer | |
563 (or (and (button-event-p event) | |
564 (event-buffer event)) | |
565 (current-buffer))))) | |
566 (save-selected-window | |
567 (and (button-event-p event) | |
568 (select-window (event-window event))) | |
569 (if (and (one-window-p t 'selected-frame) | |
570 (window-dedicated-p (selected-window))) | |
571 ;; This is a special buffer's frame | |
572 (iconify-frame (selected-frame)) | |
573 (or (window-dedicated-p (selected-window)) | |
574 (bury-buffer)))) | |
575 (choose-completion-string (extent-string extent) | |
576 buffer | |
577 completion-base-size)) | |
578 | |
579 ;; Delete the longest partial match for STRING | |
580 ;; that can be found before POINT. | |
581 (defun choose-completion-delete-max-match (string) | |
582 (let ((len (min (length string) | |
583 (- (point) (point-min))))) | |
584 (goto-char (- (point) (length string))) | |
585 (if completion-ignore-case | |
586 (setq string (downcase string))) | |
587 (while (and (> len 0) | |
588 (let ((tail (buffer-substring (point) | |
589 (+ (point) len)))) | |
590 (if completion-ignore-case | |
591 (setq tail (downcase tail))) | |
592 (not (string= tail (substring string 0 len))))) | |
593 (setq len (1- len)) | |
594 (forward-char 1)) | |
595 (delete-char len))) | |
596 | |
597 ;; Switch to BUFFER and insert the completion choice CHOICE. | |
598 ;; BASE-SIZE, if non-nil, says how many characters of BUFFER's text | |
599 ;; to keep. If it is nil, use choose-completion-delete-max-match instead. | |
600 (defun choose-completion-string (choice &optional buffer base-size) | |
601 (let ((buffer (or buffer completion-reference-buffer))) | |
602 ;; If BUFFER is a minibuffer, barf unless it's the currently | |
603 ;; active minibuffer. | |
604 (if (and (string-match "\\` \\*Minibuf-[0-9]+\\*\\'" (buffer-name buffer)) | |
605 (or (not (active-minibuffer-window)) | |
606 (not (equal buffer | |
607 (window-buffer (active-minibuffer-window)))))) | |
608 (error "Minibuffer is not active for completion") | |
609 ;; Insert the completion into the buffer where completion was requested. | |
610 (set-buffer buffer) | |
611 (if base-size | |
612 (delete-region (+ base-size (point-min)) (point)) | |
613 (choose-completion-delete-max-match choice)) | |
614 (insert choice) | |
615 (remove-text-properties (- (point) (length choice)) (point) | |
616 '(highlight nil)) | |
617 ;; Update point in the window that BUFFER is showing in. | |
618 (let ((window (get-buffer-window buffer t))) | |
619 (set-window-point window (point))) | |
620 ;; If completing for the minibuffer, exit it with this choice. | |
621 (and (equal buffer (window-buffer (minibuffer-window))) | |
622 minibuffer-completion-table | |
623 (exit-minibuffer))))) | |
624 | |
625 (define-key minibuffer-local-completion-map [prior] | |
626 'switch-to-completions) | |
627 (define-key minibuffer-local-must-match-map [prior] | |
628 'switch-to-completions) | |
629 (define-key minibuffer-local-completion-map "\M-v" | |
630 'advertised-switch-to-completions) | |
631 (define-key minibuffer-local-must-match-map "\M-v" | |
632 'advertised-switch-to-completions) | |
633 | |
634 (defalias 'advertised-switch-to-completions 'switch-to-completions) | |
635 (defun switch-to-completions () | |
636 "Select the completion list window." | |
637 (interactive) | |
638 ;; Make sure we have a completions window. | |
639 (or (get-buffer-window "*Completions*") | |
640 (minibuffer-completion-help)) | |
641 (if (not (get-buffer-window "*Completions*")) | |
642 nil | |
643 (select-window (get-buffer-window "*Completions*")) | |
4791
ea07b60c097f
Fix issue 546, use next-single-char-property-change in list-mode.el
Aidan Kehoe <kehoea@parhasard.net>
parents:
2098
diff
changeset
|
644 (goto-char (next-single-char-property-change (point-min) 'list-mode-item |
ea07b60c097f
Fix issue 546, use next-single-char-property-change in list-mode.el
Aidan Kehoe <kehoea@parhasard.net>
parents:
2098
diff
changeset
|
645 nil (point-max))))) |
428 | 646 |
647 ;;; list-mode.el ends here |