annotate lisp/list-mode.el @ 5697:40fbceabaafd

menubar-items.el (default-menubar): Reorganize. Add PROBLEMS to toplevel. New "More about XEmacs" submenu for NEWS, licensing, etc. New "Recent History" menu for messages, lossage, etc. Get rid of ugly and unexpressive ellipses.
author Stephen J. Turnbull <stephen@xemacs.org>
date Mon, 24 Dec 2012 03:08:33 +0900
parents 89331fa1c819
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; list-mode.el --- Major mode for buffers containing lists of items
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1992-4, 1997 Free Software Foundation, Inc.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
4 ;; Copyright (C) 1996, 2000 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
5
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Keywords: extensions, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
20
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;;; Synched up with: Not synched
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
25
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;; Cleanup, merging with FSF by Ben Wing, January 1996
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 (defvar list-mode-extent nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35 (make-variable-buffer-local 'list-mode-extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 (defvar list-mode-map nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38 "Local map for buffers containing lists of items.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 (or list-mode-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40 (let ((map (setq list-mode-map (make-sparse-keymap 'list-mode-map))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
41 (suppress-keymap map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
42 (define-key map 'button2up 'list-mode-item-mouse-selected)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 (define-key map 'button2 'undefined)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
44 (define-key map "\C-m" 'list-mode-item-keyboard-selected)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46 ;; The following calls to `substitute-key-definition' losed because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47 ;; they were based on an incorrect assumption that `forward-char' and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 ;; `backward-char' are bound to keys in the global map. This might not
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 ;; be the case if a user binds motion keys to different functions,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 ;; and was not actually the case since 20.5 beta 28 or around.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52 ;; (substitute-key-definition 'forward-char 'next-list-mode-item map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 ;; global-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 ;; (substitute-key-definition 'backward-char 'previous-list-mode-item map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
55 ;; global-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 ;; We bind standard keys to motion commands instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59 (dolist (key '(kp-right right (control ?f)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 (define-key map key 'next-list-mode-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
61 (dolist (key '(kp-left left (control ?b)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62 (define-key map key 'previous-list-mode-item))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
63
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
64 ;; #### We make list-mode-hook, as well as completion-setup-hook and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
65 ;; minibuffer-setup-hook, permanent-local so that it's possible to create
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
66 ;; buffers in these modes and then set up some buffer-specific
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
67 ;; customizations without resorting to awful kludges. (The problem here
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
68 ;; is that when you switch a buffer into a mode, reset-buffer is usually
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
69 ;; called, which destroys all buffer-local settings that you carefully
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
70 ;; tried to set up when you created the buffer. Therefore, the only way
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
71 ;; to set these variables is to use the setup hooks -- but if they are
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
72 ;; not declared permanent local, then any local hook functions that you
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
73 ;; put on them (which is exactly what you want to do) also get removed,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
74 ;; so you would have to resort to putting a global hook function on the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
75 ;; setup hook, and then making sure it gets removed later. I actually
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
76 ;; added some support for doing this with one-shot hooks, but this is
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
77 ;; clearly not the correct way to do things, and it fails in some cases,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
78 ;; particularly when the buffer gets put into the mode more than once,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
79 ;; which typically happens with completion buffers, for example.) In
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
80 ;; fact, all setup hooks should be made permanent local, but I didn't
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
81 ;; feel like making a global change like this quite yet. The proper way
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
82 ;; to do it would be to declare new def-style forms, such as defhook and
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
83 ;; define-local-setup-hook, which are used to initialize hooks in place
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
84 ;; of the current generic defvars. --ben
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
85
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
86 (put 'list-mode-hook 'permanent-local t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
87 (defvar list-mode-hook nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
88 "Normal hook run when entering List mode.")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
89
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 (defun list-mode ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 "Major mode for buffer containing lists of items."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (kill-all-local-variables)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 (use-local-map list-mode-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 (setq mode-name "List")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 (setq major-mode 'list-mode)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
97 (add-local-hook 'post-command-hook 'set-list-mode-extent)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
98 (add-local-hook 'pre-command-hook 'list-mode-extent-pre-hook)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
99 (set (make-local-variable 'next-line-add-newlines) nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 (setq list-mode-extent nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101 ;; It is visually disconcerting to have the text cursor disappear within list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 ;; buffers, especially when moving from window to window, so leave it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 ;; visible. -- Bob Weiner, 06/20/1999
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 ; (set-specifier text-cursor-visible-p nil (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 (setq buffer-read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
107 (run-hooks 'list-mode-hook))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
108
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
109 ;; List mode is suitable only for specially formatted data.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 (put 'list-mode 'mode-class 'special)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
112 (defvar list-mode-extent-old-point nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113 "The value of point when pre-command-hook is called.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 Used to determine the direction of motion.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 (make-variable-buffer-local 'list-mode-extent-old-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 (defun list-mode-extent-pre-hook ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 (setq list-mode-extent-old-point (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119 ;(setq atomic-extent-goto-char-p nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 (defun set-list-mode-extent ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 "Move to the closest list item and set up the extent for it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124 This is called from `post-command-hook'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 (cond ((get-char-property (point) 'list-mode-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 ((and (> (point) (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (get-char-property (1- (point)) 'list-mode-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 (goto-char (1- (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130 (let ((pos (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 dirflag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 ;this fucks things up more than it helps.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 ;atomic-extent-goto-char-p as currently defined is all broken,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 ;since it will be triggered if the command *ever* runs goto-char!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 ;(if atomic-extent-goto-char-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136 ; (setq dirflag 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 (if (and list-mode-extent-old-point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (> pos list-mode-extent-old-point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 (setq dirflag 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 (setq dirflag -1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141 (next-list-mode-item dirflag)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 (or (get-char-property (point) 'list-mode-item)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 (next-list-mode-item (- dirflag))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 (or (and list-mode-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 (eq (current-buffer) (extent-object list-mode-extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 (setq list-mode-extent (make-extent nil nil (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 (set-extent-face list-mode-extent 'list-mode-item-selected)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 (let ((ex (extent-at (point) nil 'list-mode-item nil 'at)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 (if ex
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 (set-extent-endpoints list-mode-extent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (extent-start-position ex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (extent-end-position ex))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 (auto-show-make-region-visible (extent-start-position ex)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 (extent-end-position ex)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157 (detach-extent list-mode-extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (defun previous-list-mode-item (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 "Move to the previous item in list-mode."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (next-list-mode-item (- n)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (defun next-list-mode-item (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 "Move to the next item in list-mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 With prefix argument N, move N items (negative N means move backward)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168 (while (and (> n 0) (not (eobp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 (let ((extent (extent-at (point) (current-buffer) 'list-mode-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 (end (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 ;; If in a completion, move to the end of it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 (if extent (goto-char (extent-end-position extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 ;; Move to start of next one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 (setq n (1- n)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (while (and (< n 0) (not (bobp)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 (let ((extent (extent-at (point) (current-buffer) 'list-mode-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (end (point-min)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 ;; If in a completion, move to the start of it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 (if extent (goto-char (extent-start-position extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184 ;; Move to the start of that one.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (if (setq extent (extent-at (point) (current-buffer) 'list-mode-item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 nil 'before))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (point) 'list-mode-item nil end))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (if (setq extent (extent-at (point) (current-buffer) 'list-mode-item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 nil 'before))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
192 (goto-char (extent-start-position extent)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193 (setq n (1+ n))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 (defun list-mode-item-selected-1 (extent event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 (let ((func (extent-property extent 'list-mode-item-activate-callback))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 (user-data (extent-property extent 'list-mode-item-user-data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 (if func
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199 (funcall func event extent user-data))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 ;; we could make these two be just one function, but we want to be
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 ;; able to refer to them in DOC strings.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 (defun list-mode-item-keyboard-selected ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206 (list-mode-item-selected-1 (extent-at (point) (current-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 'list-mode-item nil 'at)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 (defun list-mode-item-mouse-selected (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 ;; Sometimes event-closest-point returns nil.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 ;; So beep instead of bombing.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 (let ((point (event-closest-point event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (if point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 (list-mode-item-selected-1 (extent-at point
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (event-buffer event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 'list-mode-item nil 'at)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 (ding))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (defun add-list-mode-item (start end &optional buffer activate-callback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 user-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 "Add a new list item in list-mode, from START to END in BUFFER.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 BUFFER defaults to the current buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 This works by creating an extent for the span of text in question.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 If ACTIVATE-CALLBACK is non-nil, it should be a function of three
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 arguments (EVENT EXTENT USER-DATA) that will be called when button2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 is pressed on the extent. USER-DATA comes from the optional
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 USER-DATA argument."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 (let ((extent (make-extent start end buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (set-extent-property extent 'list-mode-item t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (set-extent-property extent 'start-open t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 (if activate-callback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (set-extent-property extent 'mouse-face 'highlight)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 (set-extent-property extent 'list-mode-item-activate-callback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 activate-callback)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (set-extent-property extent 'list-mode-item-user-data user-data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 ;; Define the major mode for lists of completions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (defvar completion-highlight-first-word-only nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 "*Completion will only highlight the first blank delimited word if t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 If the variable in not t or nil, the string is taken as a regexp to match for end
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 of highlight")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
251 ;; see comment at list-mode-hook.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
252 (put 'completion-setup-hook 'permanent-local t)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253 (defvar completion-setup-hook nil
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
254 "Normal hook run at the end of setting up the text of a completion buffer.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
255 When run, the completion buffer is the current buffer.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 ; Unnecessary FSFmacs crock. We frob the extents directly in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 ; display-completion-list, so no "heuristics" like this are necessary.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 ;(defvar completion-fixup-function nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ; "A function to customize how completions are identified in completion lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261 ;`completion-setup-function' calls this function with no arguments
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 ;each time it has found what it thinks is one completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 ;Point is at the end of the completion in the completion list buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 ;If this function moves point, it can alter the end of that completion.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (defvar completion-default-help-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
267 '(concat
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 (if (device-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 (substitute-command-keys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 "Click \\<list-mode-map>\\[list-mode-item-mouse-selected] on a completion to select it.\n") "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (substitute-command-keys
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272 "Type \\<minibuffer-local-completion-map>\\[advertised-switch-to-completions] or \\[switch-to-completions] to move to this buffer, for keyboard selection.\n\n"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 "Form the evaluate to get a help string for completion lists.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274 This string is inserted at the beginning of the buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 See `display-completion-list'.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 "Display the list of completions, COMPLETIONS, using `standard-output'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 Each element may be just a symbol or string or may be a list of two
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 strings to be printed as if concatenated.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 Frob a mousable extent onto each completion. This extent has properties
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 'mouse-face (so it highlights when the mouse passes over it) and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 'list-mode-item (so it can be located).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 Keywords:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 :activate-callback (default is `default-choose-completion')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 See `add-list-mode-item'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292 :user-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293 Value passed to activation callback.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 :window-width
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 If non-nil, width to use in displaying the list, instead of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 actual window's width.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
297 :window-height
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
298 If non-nil, use no more than this many lines, and extend line width as
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 428
diff changeset
299 necessary.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 :help-string (default is the value of `completion-default-help-string')
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 Form to evaluate to get a string to insert at the beginning of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 the completion list buffer. This is evaluated when that buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 is the current buffer and after it has been put into
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 completion-list-mode.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 :reference-buffer (default is the current buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 This specifies the value of `completion-reference-buffer' in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 the completion buffer. This specifies the buffer (normally a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 minibuffer) that `default-choose-completion' will insert the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 completion into.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 At the end, run the normal hook `completion-setup-hook'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 It can find the completion buffer in `standard-output'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 If `completion-highlight-first-word-only' is non-nil, then only the start
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 ;;; The value 0 is right in most cases, but not for file name completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
457
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (defvar completion-display-completion-list-function 'display-completion-list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
459 "Function to set up the list of completions in the completion buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
460 The function is called with one argument, the sorted list of completions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
461 Particular minibuffer interface functions (e.g. `read-file-name') may
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 want to change this. To do that, set a local value for this variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 in the minibuffer; that ensures that other minibuffer invocations will
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 not be affected.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 (defun minibuffer-completion-help ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 "Display a list of possible completions of the current minibuffer contents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 The list of completions is determined by calling `all-completions',
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 passing it the current minibuffer contents, the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 `minibuffer-completion-table', and the value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
471 `minibuffer-completion-predicate'. The list is displayed by calling
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
472 the value of `completion-display-completion-list-function' on the sorted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
473 list of completions, with the standard output set to the completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (message "Making completion list...")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (let ((completions (all-completions (buffer-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 minibuffer-completion-predicate)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
480 (message nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 (if (null completions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (ding nil 'no-completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 (temp-minibuffer-message " [No completions]"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (with-output-to-temp-buffer "*Completions*"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (funcall completion-display-completion-list-function
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (sort completions #'string-lessp))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
488
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
489 (define-derived-mode completion-list-mode list-mode
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
490 "Completion List"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
491 "Major mode for buffers showing lists of possible completions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
492 \\{completion-list-mode-map}"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
493 (make-local-variable 'completion-base-size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
494 (setq completion-base-size nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (let ((map completion-list-mode-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 (define-key map 'button2up 'mouse-choose-completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 (define-key map 'button2 'undefined)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 (define-key map "\C-m" 'choose-completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (define-key map "\e\e\e" 'delete-completion-window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (define-key map "\C-g" 'minibuffer-keyboard-quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (define-key map "q" 'completion-list-mode-quit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (define-key map " " 'completion-switch-to-minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 ;; [Tab] used to switch to the minibuffer but since [space] does that and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 ;; since most applications in the world use [Tab] to select the next item
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 ;; in a list, do that in the *Completions* buffer too. -- Bob Weiner,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 ;; BeOpen.com, 06/23/1999.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 (define-key map "\t" 'next-list-mode-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 (defvar completion-reference-buffer nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 "Record the buffer that was current when the completion list was requested.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 This is a local variable in the completion list buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 Initial value is nil to avoid some compiler warnings.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 (defvar completion-base-size nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 "Number of chars at beginning of minibuffer not involved in completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 This is a local variable in the completion list buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 but it talks about the buffer in `completion-reference-buffer'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 If this is nil, it means to compare text to determine which part
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 of the tail end of the buffer's text is involved in completion.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 ;; These names are referenced in the doc string for `completion-list-mode'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 (defalias 'choose-completion 'list-mode-item-keyboard-selected)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (defalias 'mouse-choose-completion 'list-mode-item-mouse-selected)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (defun delete-completion-window ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 "Delete the completion list window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 Go to the window from which completion was requested."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
530 (let ((buf completion-reference-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
531 (delete-window (selected-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
532 (if (get-buffer-window buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
533 (select-window (get-buffer-window buf)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
534
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535 (defun completion-switch-to-minibuffer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
536 "Move from a completions buffer to the active minibuffer window."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
537 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
538 (select-window (minibuffer-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
539
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
540 (defun completion-list-mode-quit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
541 "Abort any recursive edit and bury the completions buffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
542 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
543 (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544 (abort-recursive-edit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (error nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 ;; If there was no recursive edit to abort, simply bury the completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 ;; list buffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 (if (eq major-mode 'completion-list-mode) (bury-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 (defun completion-do-in-minibuffer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 (interactive "_")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 (set-buffer (window-buffer (minibuffer-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 (call-interactively (key-binding (this-command-keys)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 (defun default-choose-completion (event extent buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 "Click on an alternative in the `*Completions*' buffer to choose it."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 (and (button-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 ;; Give temporary modes such as isearch a chance to turn off.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 (run-hooks 'mouse-leave-buffer-hook))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 (or buffer (setq buffer (symbol-value-in-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 'completion-reference-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (or (and (button-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 (event-buffer event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 (current-buffer)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 (save-selected-window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (and (button-event-p event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 (select-window (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (if (and (one-window-p t 'selected-frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 (window-dedicated-p (selected-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 ;; This is a special buffer's frame
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 (iconify-frame (selected-frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 (or (window-dedicated-p (selected-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (bury-buffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (choose-completion-string (extent-string extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 completion-base-size))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 ;; Delete the longest partial match for STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 ;; that can be found before POINT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 (defun choose-completion-delete-max-match (string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 (let ((len (min (length string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 (- (point) (point-min)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (goto-char (- (point) (length string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (if completion-ignore-case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (setq string (downcase string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (while (and (> len 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (let ((tail (buffer-substring (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 (+ (point) len))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (if completion-ignore-case
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (setq tail (downcase tail)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (not (string= tail (substring string 0 len)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593 (setq len (1- len))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594 (forward-char 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 (delete-char len)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597 ;; Switch to BUFFER and insert the completion choice CHOICE.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 ;; BASE-SIZE, if non-nil, says how many characters of BUFFER's text
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
599 ;; to keep. If it is nil, use choose-completion-delete-max-match instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600 (defun choose-completion-string (choice &optional buffer base-size)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (let ((buffer (or buffer completion-reference-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 ;; If BUFFER is a minibuffer, barf unless it's the currently
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 ;; active minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (if (and (string-match "\\` \\*Minibuf-[0-9]+\\*\\'" (buffer-name buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (or (not (active-minibuffer-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 (not (equal buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (window-buffer (active-minibuffer-window))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (error "Minibuffer is not active for completion")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 ;; Insert the completion into the buffer where completion was requested.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 (set-buffer buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 (if base-size
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 (delete-region (+ base-size (point-min)) (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (choose-completion-delete-max-match choice))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 (insert choice)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 (remove-text-properties (- (point) (length choice)) (point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616 '(highlight nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 ;; Update point in the window that BUFFER is showing in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 (let ((window (get-buffer-window buffer t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 (set-window-point window (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 ;; If completing for the minibuffer, exit it with this choice.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 (and (equal buffer (window-buffer (minibuffer-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 (exit-minibuffer)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 (define-key minibuffer-local-completion-map [prior]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 'switch-to-completions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 (define-key minibuffer-local-must-match-map [prior]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 'switch-to-completions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 (define-key minibuffer-local-completion-map "\M-v"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 'advertised-switch-to-completions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 (define-key minibuffer-local-must-match-map "\M-v"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 'advertised-switch-to-completions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (defalias 'advertised-switch-to-completions 'switch-to-completions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 (defun switch-to-completions ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 "Select the completion list window."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 ;; Make sure we have a completions window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
639 (or (get-buffer-window "*Completions*")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
640 (minibuffer-completion-help))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 (if (not (get-buffer-window "*Completions*"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
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
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 ;;; list-mode.el ends here