* doc/emacs/trouble.texi (Understanding Bug Reporting): Minor update.
[bpt/emacs.git] / lisp / icomplete.el
CommitLineData
fa157191 1;;; icomplete.el --- minibuffer completion incremental feedback
239c87a1 2
ab422c4d
PE
3;; Copyright (C) 1992-1994, 1997, 1999, 2001-2013 Free Software
4;; Foundation, Inc.
d462ff97 5
1934dbf4
GM
6;; Author: Ken Manheimer <klm@i.am>
7;; Maintainer: Ken Manheimer <klm@i.am>
8;; Created: Mar 1993 Ken Manheimer, klm@nist.gov - first release to usenet
9;; Last update: Ken Manheimer <klm@i.am>, 11/18/1999.
be010748 10;; Keywords: help, abbrev
d462ff97 11
239c87a1 12;; This file is part of GNU Emacs.
d462ff97 13
eb3fa2cf 14;; GNU Emacs is free software: you can redistribute it and/or modify
239c87a1 15;; it under the terms of the GNU General Public License as published by
eb3fa2cf
GM
16;; the Free Software Foundation, either version 3 of the License, or
17;; (at your option) any later version.
d462ff97 18
239c87a1
RS
19;; GNU Emacs is distributed in the hope that it will be useful,
20;; but WITHOUT ANY WARRANTY; without even the implied warranty of
21;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
22;; GNU General Public License for more details.
c89164c5 23
239c87a1 24;; You should have received a copy of the GNU General Public License
eb3fa2cf 25;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
d462ff97 26
239c87a1 27;;; Commentary:
d462ff97 28
b578f267
EN
29;; Loading this package implements a more fine-grained minibuffer
30;; completion feedback scheme. Prospective completions are concisely
31;; indicated within the minibuffer itself, with each successive
32;; keystroke.
33
5e537651 34;; See `icomplete-completions' docstring for a description of the
b578f267
EN
35;; icomplete display format.
36
37;; See the `icomplete-minibuffer-setup-hook' docstring for a means to
38;; customize icomplete setup for interoperation with other
39;; minibuffer-oriented packages.
40
1934dbf4
GM
41;; To activate icomplete mode, load the package and use the
42;; `icomplete-mode' function. You can subsequently deactivate it by
43;; invoking the function icomplete-mode with a negative prefix-arg
44;; (C-U -1 ESC-x icomplete-mode). Also, you can prevent activation of
45;; the mode during package load by first setting the variable
46;; `icomplete-mode' to nil. Icompletion can be enabled any time after
47;; the package is loaded by invoking icomplete-mode without a prefix
48;; arg.
92f7d003 49
b578f267
EN
50;; Thanks to everyone for their suggestions for refinements of this
51;; package. I particularly have to credit Michael Cook, who
52;; implemented an incremental completion style in his 'iswitch'
53;; functions that served as a model for icomplete. Some other
5e537651 54;; contributors: Noah Friedman (restructuring as minor mode), Colin
1be5a284 55;; Rafferty (lemacs reconciliation), Lars Lindberg, RMS, and others.
b578f267
EN
56
57;; klm.
c89164c5 58
239c87a1
RS
59;;; Code:
60
5e537651
SE
61(defgroup icomplete nil
62 "Show completions dynamically in minibuffer."
63 :prefix "icomplete-"
64 :group 'minibuffer)
65
c2d0b538
SM
66(defvar icomplete-prospects-length 80)
67(make-obsolete-variable
68 'icomplete-prospects-length 'icomplete-prospects-height "23.1")
69
cc37e70f
J
70(defcustom icomplete-separator " | "
71 "String used by icomplete to separate alternatives in the minibuffer."
72 :type 'string
fb3bf6ce 73 :version "24.4")
cc37e70f 74
5cbfe5b9
J
75(defcustom icomplete-hide-common-prefix t
76 "When non-nil, hide common prefix from completion candidates.
77When nil, show candidates in full."
78 :type 'boolean
79 :version "24.4"
80 :group 'icomplete)
81
82(defface icomplete-first-match '((t :weight bold))
83 "Face used by icomplete for highlighting first match."
84 :version "24.4"
85 :group 'icomplete)
86
1934dbf4 87;;;_* User Customization variables
c2d0b538
SM
88(defcustom icomplete-prospects-height
89 ;; 20 is an estimated common size for the prompt + minibuffer content, to
90 ;; try to guess the number of lines used up by icomplete-prospects-length.
91 (+ 1 (/ (+ icomplete-prospects-length 20) (window-width)))
92 "Maximum number of lines to use in the minibuffer."
dfb4dab1 93 :type 'integer
af09cfd7
JB
94 :group 'icomplete
95 :version "23.1")
1934dbf4 96
5e537651 97(defcustom icomplete-compute-delay .3
077aec27
JB
98 "Completions-computation stall, used only with large-number completions.
99See `icomplete-delay-completions-threshold'."
5e537651
SE
100 :type 'number
101 :group 'icomplete)
102
103(defcustom icomplete-delay-completions-threshold 400
077aec27 104 "Pending-completions number over which to apply `icomplete-compute-delay'."
5e537651
SE
105 :type 'integer
106 :group 'icomplete)
107
108(defcustom icomplete-max-delay-chars 3
077aec27 109 "Maximum number of initial chars to apply icomplete compute delay."
5e537651
SE
110 :type 'integer
111 :group 'icomplete)
112
504a0381
SM
113(defvar icomplete-in-buffer nil
114 "If non-nil, also use Icomplete when completing in non-mini buffers.")
115
5e537651 116(defcustom icomplete-minibuffer-setup-hook nil
077aec27 117 "Icomplete-specific customization of minibuffer setup.
239c87a1 118
4837b516 119This hook is run during minibuffer setup if icomplete is active.
239c87a1 120It is intended for use in customizing icomplete for interoperation
9c8acefd 121with other features and packages. For instance:
239c87a1 122
92f7d003 123 \(add-hook 'icomplete-minibuffer-setup-hook
239c87a1
RS
124 \(function
125 \(lambda ()
9c8acefd
EZ
126 \(make-local-variable 'max-mini-window-height)
127 \(setq max-mini-window-height 3))))
239c87a1 128
9c8acefd 129will constrain Emacs to a maximum minibuffer height of 3 lines when
5e537651
SE
130icompletion is occurring."
131 :type 'hook
132 :group 'icomplete)
133
134
135;;;_* Initialization
d462ff97 136
c89164c5 137;;;_ + Internal Variables
47fda8fc 138;;;_ = icomplete-eoinput nil
31d4b748
SM
139(defvar icomplete-overlay (make-overlay (point-min) (point-min) nil t t)
140 "Overlay used to display the list of completions.")
141
504a0381
SM
142(defun icomplete-pre-command-hook ()
143 (let ((non-essential t))
144 (icomplete-tidy)))
239c87a1 145
504a0381
SM
146(defun icomplete-post-command-hook ()
147 (let ((non-essential t)) ;E.g. don't prompt for password!
148 (icomplete-exhibit)))
239c87a1 149
397e713b 150;;;_ = icomplete-with-completion-tables
67982e2b 151(defcustom icomplete-with-completion-tables t
397e713b
CY
152 "Specialized completion tables with which icomplete should operate.
153
154Icomplete does not operate with any specialized completion tables
67982e2b 155except those on this list."
846ffe77 156 :version "24.4"
67982e2b
SM
157 :type '(choice (const :tag "All" t)
158 (repeat function)))
92f7d003 159
cc37e70f
J
160(defvar icomplete-minibuffer-map
161 (let ((map (make-sparse-keymap)))
162 (define-key map [?\M-\t] 'minibuffer-force-complete)
163 (define-key map [?\C-j] 'minibuffer-force-complete-and-exit)
d7e76a89
J
164 (define-key map [?\C-.] 'icomplete-forward-completions)
165 (define-key map [?\C-,] 'icomplete-backward-completions)
cc37e70f
J
166 map))
167
168(defun icomplete-forward-completions ()
169 "Step forward completions by one entry.
170Second entry becomes the first and can be selected with
171`minibuffer-force-complete-and-exit'."
172 (interactive)
504a0381
SM
173 (let* ((beg (icomplete--field-beg))
174 (end (icomplete--field-end))
67982e2b 175 (comps (completion-all-sorted-completions beg end))
cc37e70f 176 (last (last comps)))
6130b96a
J
177 (when comps
178 (setcdr last (cons (car comps) (cdr last)))
67982e2b 179 (completion--cache-all-sorted-completions beg end (cdr comps)))))
cc37e70f
J
180
181(defun icomplete-backward-completions ()
182 "Step backward completions by one entry.
183Last entry becomes the first and can be selected with
184`minibuffer-force-complete-and-exit'."
185 (interactive)
504a0381
SM
186 (let* ((beg (icomplete--field-beg))
187 (end (icomplete--field-end))
67982e2b 188 (comps (completion-all-sorted-completions beg end))
cc37e70f
J
189 (last-but-one (last comps 2))
190 (last (cdr last-but-one)))
6130b96a 191 (when (consp last) ; At least two elements in comps
cc37e70f
J
192 (setcdr last-but-one (cdr last))
193 (push (car last) comps)
67982e2b 194 (completion--cache-all-sorted-completions beg end comps))))
cc37e70f 195
239c87a1 196;;;_ > icomplete-mode (&optional prefix)
c89164c5 197;;;###autoload
47fda8fc 198(define-minor-mode icomplete-mode
06e21633
CY
199 "Toggle incremental minibuffer completion (Icomplete mode).
200With a prefix argument ARG, enable Icomplete mode if ARG is
201positive, and disable it otherwise. If called from Lisp, enable
202the mode if ARG is omitted or nil."
47fda8fc 203 :global t :group 'icomplete
504a0381
SM
204 (remove-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup)
205 (remove-hook 'completion-in-region-mode-hook #'icomplete--in-region-setup)
206 (when icomplete-mode
207 (when icomplete-in-buffer
208 (add-hook 'completion-in-region-mode-hook #'icomplete--in-region-setup))
209 (add-hook 'minibuffer-setup-hook #'icomplete-minibuffer-setup)))
210
211(defun icomplete--completion-table ()
212 (if (window-minibuffer-p) minibuffer-completion-table
213 (or (nth 2 completion-in-region--data)
214 (message "In %S (w=%S): %S"
215 (current-buffer) (selected-window) (window-minibuffer-p)))))
216(defun icomplete--completion-predicate ()
217 (if (window-minibuffer-p) minibuffer-completion-predicate
218 (nth 3 completion-in-region--data)))
219(defun icomplete--field-string ()
220 (if (window-minibuffer-p) (minibuffer-contents)
221 (buffer-substring-no-properties
222 (nth 0 completion-in-region--data)
223 (nth 1 completion-in-region--data))))
224(defun icomplete--field-beg ()
225 (if (window-minibuffer-p) (minibuffer-prompt-end)
226 (nth 0 completion-in-region--data)))
227(defun icomplete--field-end ()
228 (if (window-minibuffer-p) (point-max)
229 (nth 1 completion-in-region--data)))
239c87a1
RS
230
231;;;_ > icomplete-simple-completing-p ()
232(defun icomplete-simple-completing-p ()
239c87a1
RS
233 "Non-nil if current window is minibuffer that's doing simple completion.
234
235Conditions are:
236 the selected window is a minibuffer,
237 and not in the middle of macro execution,
504a0381 238 and the completion table is not a function (which would
81276211 239 indicate some non-standard, non-simple completion mechanism,
239c87a1
RS
240 like file-name and other custom-func completions)."
241
504a0381
SM
242 (unless executing-kbd-macro
243 (let ((table (icomplete--completion-table)))
244 (and table
245 (or (not (functionp table))
246 (eq icomplete-with-completion-tables t)
247 (member table icomplete-with-completion-tables))))))
d183f322 248
239c87a1 249;;;_ > icomplete-minibuffer-setup ()
239c87a1 250(defun icomplete-minibuffer-setup ()
239c87a1 251 "Run in minibuffer on activation to establish incremental completion.
d183f322 252Usually run by inclusion in `minibuffer-setup-hook'."
47fda8fc 253 (when (and icomplete-mode (icomplete-simple-completing-p))
2176854d 254 (set (make-local-variable 'completion-show-inline-help) nil)
cc37e70f
J
255 (use-local-map (make-composed-keymap icomplete-minibuffer-map
256 (current-local-map)))
504a0381
SM
257 (add-hook 'pre-command-hook #'icomplete-pre-command-hook nil t)
258 (add-hook 'post-command-hook #'icomplete-post-command-hook nil t)
47fda8fc 259 (run-hooks 'icomplete-minibuffer-setup-hook)))
504a0381
SM
260
261(defvar icomplete--in-region-buffer nil)
262
263(defun icomplete--in-region-setup ()
264 (when (or (not completion-in-region-mode)
265 (and icomplete--in-region-buffer
266 (not (eq icomplete--in-region-buffer (current-buffer)))))
267 (with-current-buffer (or icomplete--in-region-buffer (current-buffer))
268 (setq icomplete--in-region-buffer nil)
269 (delete-overlay icomplete-overlay)
270 (kill-local-variable 'completion-show-inline-help)
271 (remove-hook 'pre-command-hook 'icomplete-pre-command-hook t)
272 (remove-hook 'post-command-hook 'icomplete-post-command-hook t)
273 (message nil)))
274 (when (and completion-in-region-mode
275 icomplete-mode (icomplete-simple-completing-p))
276 (setq icomplete--in-region-buffer (current-buffer))
277 (set (make-local-variable 'completion-show-inline-help) nil)
278 (let ((tem (assq 'completion-in-region-mode
279 minor-mode-overriding-map-alist)))
280 (unless (memq icomplete-minibuffer-map (cdr tem))
281 (setcdr tem (make-composed-keymap icomplete-minibuffer-map
282 (cdr tem)))))
283 (add-hook 'pre-command-hook 'icomplete-pre-command-hook nil t)
284 (add-hook 'post-command-hook 'icomplete-post-command-hook nil t)))
285\f
1934dbf4
GM
286
287
239c87a1
RS
288;;;_* Completion
289
290;;;_ > icomplete-tidy ()
291(defun icomplete-tidy ()
292 "Remove completions display \(if any) prior to new user input.
d183f322 293Should be run in on the minibuffer `pre-command-hook'. See `icomplete-mode'
239c87a1 294and `minibuffer-setup-hook'."
31d4b748 295 (delete-overlay icomplete-overlay))
d183f322 296
239c87a1 297;;;_ > icomplete-exhibit ()
d462ff97 298(defun icomplete-exhibit ()
239c87a1 299 "Insert icomplete completions display.
d183f322 300Should be run via minibuffer `post-command-hook'. See `icomplete-mode'
239c87a1 301and `minibuffer-setup-hook'."
67982e2b
SM
302 (when (and icomplete-mode
303 (icomplete-simple-completing-p)) ;Shouldn't be necessary.
47fda8fc
SM
304 (save-excursion
305 (goto-char (point-max))
d462ff97 306 ; Insert the match-status information:
504a0381 307 (if (and (> (icomplete--field-end) (icomplete--field-beg))
cc37e70f
J
308 buffer-undo-list ; Wait for some user input.
309 (or
310 ;; Don't bother with delay after certain number of chars:
504a0381
SM
311 (> (- (point) (icomplete--field-beg))
312 icomplete-max-delay-chars)
cc37e70f
J
313 ;; Don't delay if the completions are known.
314 completion-all-sorted-completions
315 ;; Don't delay if alternatives number is small enough:
504a0381
SM
316 (and (sequencep (icomplete--completion-table))
317 (< (length (icomplete--completion-table))
cc37e70f
J
318 icomplete-delay-completions-threshold))
319 ;; Delay - give some grace time for next keystroke, before
47fda8fc
SM
320 ;; embarking on computing completions:
321 (sit-for icomplete-compute-delay)))
504a0381
SM
322 (let* ((field-string (icomplete--field-string))
323 (text (while-no-input
324 (icomplete-completions
325 field-string
326 (icomplete--completion-table)
327 (icomplete--completion-predicate)
328 (if (window-minibuffer-p)
329 (not minibuffer-completion-confirm)))))
330 (buffer-undo-list t)
331 deactivate-mark)
9a84ddd8 332 ;; Do nothing if while-no-input was aborted.
cc37e70f 333 (when (stringp text)
31d4b748
SM
334 (move-overlay icomplete-overlay (point) (point) (current-buffer))
335 ;; The current C cursor code doesn't know to use the overlay's
336 ;; marker's stickiness to figure out whether to place the cursor
337 ;; before or after the string, so let's spoon-feed it the pos.
338 (put-text-property 0 1 'cursor t text)
339 (overlay-put icomplete-overlay 'after-string text)))))))
d183f322 340
239c87a1
RS
341;;;_ > icomplete-completions (name candidates predicate require-match)
342(defun icomplete-completions (name candidates predicate require-match)
d462ff97
RS
343 "Identify prospective candidates for minibuffer completion.
344
c89164c5 345The display is updated with each minibuffer keystroke during
d462ff97
RS
346minibuffer completion.
347
348Prospective completion suffixes (if any) are displayed, bracketed by
349one of \(), \[], or \{} pairs. The choice of brackets is as follows:
350
351 \(...) - a single prospect is identified and matching is enforced,
352 \[...] - a single prospect is identified but matching is optional, or
353 \{...} - multiple prospects, separated by commas, are indicated, and
81276211 354 further input is required to distinguish a single one.
d462ff97 355
81276211 356The displays for unambiguous matches have ` [Matched]' appended
d183f322 357\(whether complete or not), or ` \[No matches]', if no eligible
1be5a284 358matches exist. \(Keybindings for uniquely matched commands
92f7d003
KH
359are exhibited within the square braces.)"
360
504a0381
SM
361 (let* ((minibuffer-completion-table candidates)
362 (minibuffer-completion-predicate predicate)
363 (md (completion--field-metadata (icomplete--field-beg)))
67982e2b 364 (comps (completion-all-sorted-completions
504a0381 365 (icomplete--field-beg) (icomplete--field-end)))
31d4b748
SM
366 (last (if (consp comps) (last comps)))
367 (base-size (cdr last))
476d2aef
SM
368 (open-bracket (if require-match "(" "["))
369 (close-bracket (if require-match ")" "]")))
c2d0b538 370 ;; `concat'/`mapconcat' is the slow part.
31d4b748 371 (if (not (consp comps))
504a0381
SM
372 (progn ;;(debug (format "Candidates=%S field=%S" candidates name))
373 (format " %sNo matches%s" open-bracket close-bracket))
31d4b748 374 (if last (setcdr last nil))
be91065f
SM
375 (let* ((most-try
376 (if (and base-size (> base-size 0))
377 (completion-try-completion
620c53a6 378 name candidates predicate (length name) md)
be91065f
SM
379 ;; If the `comps' are 0-based, the result should be
380 ;; the same with `comps'.
381 (completion-try-completion
620c53a6 382 name comps nil (length name) md)))
31d4b748
SM
383 (most (if (consp most-try) (car most-try)
384 (if most-try (car comps) "")))
476d2aef
SM
385 ;; Compare name and most, so we can determine if name is
386 ;; a prefix of most, or something else.
387 (compare (compare-strings name nil nil
388 most nil nil completion-ignore-case))
389 (determ (unless (or (eq t compare) (eq t most-try)
390 (= (setq compare (1- (abs compare)))
391 (length most)))
392 (concat open-bracket
393 (cond
394 ((= compare (length name))
395 ;; Typical case: name is a prefix.
396 (substring most compare))
2387610d
SM
397 ;; Don't bother truncating if it doesn't gain
398 ;; us at least 2 columns.
399 ((< compare 3) most)
400 (t (concat "…" (substring most compare))))
476d2aef 401 close-bracket)))
47fda8fc 402 ;;"-prospects" - more than one candidate
5cbfe5b9
J
403 (prospects-len (+ (string-width
404 (or determ (concat open-bracket close-bracket)))
bdd9367d
WD
405 (string-width icomplete-separator)
406 3 ;; take {…} into account
407 (string-width (buffer-string))))
c2d0b538
SM
408 (prospects-max
409 ;; Max total length to use, including the minibuffer content.
29f313d7 410 (* (+ icomplete-prospects-height
c2d0b538
SM
411 ;; If the minibuffer content already uses up more than
412 ;; one line, increase the allowable space accordingly.
413 (/ prospects-len (window-width)))
414 (window-width)))
aa2bddd7
SM
415 ;; Find the common prefix among `comps'.
416 ;; We can't use the optimization below because its assumptions
417 ;; aren't always true, e.g. when completion-cycling (bug#10850):
418 ;; (if (eq t (compare-strings (car comps) nil (length most)
419 ;; most nil nil completion-ignore-case))
420 ;; ;; Common case.
421 ;; (length most)
422 ;; Else, use try-completion.
5cbfe5b9
J
423 (prefix (when icomplete-hide-common-prefix
424 (try-completion "" comps)))
476d2aef 425 (prefix-len
aa2bddd7
SM
426 (and (stringp prefix)
427 ;; Only hide the prefix if the corresponding info
428 ;; is already displayed via `most'.
429 (string-prefix-p prefix most t)
430 (length prefix))) ;;)
5cbfe5b9 431 prospects comp limit)
504a0381 432 (if (or (eq most-try t) (not (consp (cdr comps))))
1934dbf4 433 (setq prospects nil)
5cbfe5b9
J
434 (when (member name comps)
435 ;; NAME is complete but not unique. This scenario poses
436 ;; following UI issues:
437 ;;
438 ;; - When `icomplete-hide-common-prefix' is non-nil, NAME
439 ;; is stripped empty. This would make the entry
440 ;; inconspicuous.
441 ;;
442 ;; - Due to sorting of completions, NAME may not be the
443 ;; first of the prospects and could be hidden deep in
444 ;; the displayed string.
445 ;;
446 ;; - Because of `icomplete-prospects-height' , NAME may
447 ;; not even be displayed to the user.
448 ;;
449 ;; To circumvent all the above problems, provide a visual
450 ;; cue to the user via an "empty string" in the try
451 ;; completion field.
452 (setq determ (concat open-bracket "" close-bracket)))
453 ;; Compute prospects for display.
7d94fb17 454 (while (and comps (not limit))
476d2aef 455 (setq comp
8f0fde21 456 (if prefix-len (substring (car comps) prefix-len) (car comps))
1934dbf4 457 comps (cdr comps))
5cbfe5b9 458 (setq prospects-len
bdd9367d
WD
459 (+ (string-width comp)
460 (string-width icomplete-separator)
461 prospects-len))
c2d0b538 462 (if (< prospects-len prospects-max)
31d4b748 463 (push comp prospects)
5cbfe5b9
J
464 (setq limit t))))
465 (setq prospects (nreverse prospects))
466 ;; Decorate first of the prospects.
467 (when prospects
468 (let ((first (copy-sequence (pop prospects))))
469 (put-text-property 0 (length first)
470 'face 'icomplete-first-match first)
471 (push first prospects)))
31d4b748
SM
472 ;; Restore the base-size info, since completion-all-sorted-completions
473 ;; is cached.
474 (if last (setcdr last base-size))
1934dbf4
GM
475 (if prospects
476 (concat determ
47fda8fc 477 "{"
5cbfe5b9 478 (mapconcat 'identity prospects icomplete-separator)
cc37e70f 479 (and limit (concat icomplete-separator "…"))
47fda8fc 480 "}")
cc37e70f 481 (concat determ " [Matched]"))))))
d462ff97 482
0da54898
DC
483;;;_* Provide
484(provide 'icomplete)
485
476d2aef
SM
486;;_* Local emacs vars.
487;;Local variables:
488;;allout-layout: (-2 :)
489;;End:
d462ff97
RS
490
491;;; icomplete.el ends here