Mercurial > emacs
annotate lisp/minibuffer.el @ 108851:cb093dac3d58
Merge from mainline.
author | Katsumi Yamaoka <yamaoka@jpl.org> |
---|---|
date | Fri, 28 May 2010 00:48:45 +0000 |
parents | 9f927f4deab4 |
children | c8b4b7099b45 |
rev | line source |
---|---|
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1 ;;; minibuffer.el --- Minibuffer completion functions |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
2 |
106815 | 3 ;; Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
4 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
5 ;; Author: Stefan Monnier <monnier@iro.umontreal.ca> |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
6 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
7 ;; This file is part of GNU Emacs. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
8 |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94607
diff
changeset
|
9 ;; GNU Emacs is free software: you can redistribute it and/or modify |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
10 ;; it under the terms of the GNU General Public License as published by |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
11 ;; the Free Software Foundation, either version 3 of the License, or |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
12 ;; (at your option) any later version. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
13 |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94607
diff
changeset
|
14 ;; GNU Emacs is distributed in the hope that it will be useful, |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
17 ;; GNU General Public License for more details. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
18 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
19 ;; You should have received a copy of the GNU General Public License |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
94607
diff
changeset
|
20 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
21 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
22 ;;; Commentary: |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
23 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
24 ;; Names with "--" are for functions and variables that are meant to be for |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
25 ;; internal use only. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
26 |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
27 ;; Functional completion tables have an extended calling conventions: |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
28 ;; - The `action' can be (additionally to nil, t, and lambda) of the form |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
29 ;; (boundaries . SUFFIX) in which case it should return |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
30 ;; (boundaries START . END). See `completion-boundaries'. |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
31 ;; Any other return value should be ignored (so we ignore values returned |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
32 ;; from completion tables that don't know about this new `action' form). |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
33 |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
34 ;;; Bugs: |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
35 |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
36 ;; - completion-all-sorted-completions list all the completions, whereas |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
37 ;; it should only lists the ones that `try-completion' would consider. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
38 ;; E.g. it should honor completion-ignored-extensions. |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
39 ;; - choose-completion can't automatically figure out the boundaries |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
40 ;; corresponding to the displayed completions because we only |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
41 ;; provide the start info but not the end info in |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
42 ;; completion-base-position. |
105763
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
43 ;; - quoting is problematic. E.g. the double-dollar quoting used in |
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
44 ;; substitie-in-file-name (and hence read-file-name-internal) bumps |
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
45 ;; into various bugs: |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
46 ;; - choose-completion doesn't know how to quote the text it inserts. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
47 ;; E.g. it fails to double the dollars in file-name completion, or |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
48 ;; to backslash-escape spaces and other chars in comint completion. |
105763
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
49 ;; - when completing ~/tmp/fo$$o, the highligting in *Completions* |
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
50 ;; is off by one position. |
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
51 ;; - all code like PCM which relies on all-completions to match |
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
52 ;; its argument gets confused because all-completions returns unquoted |
5041ae86859e
(all-completions): Declare the 4th arg obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105733
diff
changeset
|
53 ;; texts (as desired for *Completions* output). |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
54 ;; - C-x C-f ~/*/sr ? should not list "~/./src". |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
55 ;; - minibuffer-force-complete completes ~/src/emacs/t<!>/lisp/minibuffer.el |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
56 ;; to ~/src/emacs/trunk/ and throws away lisp/minibuffer.el. |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
57 |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
58 ;;; Todo: |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
59 |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
60 ;; - extend `boundaries' to provide various other meta-data about the |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
61 ;; output of `all-completions': |
107250
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
62 ;; - preferred sorting order when displayed in *Completions*. |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
63 ;; - annotations/text-properties to add when displayed in *Completions*. |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
64 ;; - quoting/unquoting (so we can complete files names with envvars |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
65 ;; and backslashes, and all-completion can list names without |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
66 ;; quoting backslashes and dollars). |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
67 ;; - indicate how to turn all-completion's output into |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
68 ;; try-completion's output: e.g. completion-ignored-extensions. |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
69 ;; maybe that could be merged with the "quote" operation above. |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
70 ;; - completion hook to run when the completion is |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
71 ;; selected/inserted (maybe this should be provided some other |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
72 ;; way, e.g. as text-property, so `try-completion can also return it?) |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
73 ;; both for when it's inserted via TAB or via choose-completion. |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
74 ;; - indicate that `all-completions' doesn't do prefix-completion |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
75 ;; but just returns some list that relates in some other way to |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
76 ;; the provided string (as is the case in filecache.el), in which |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
77 ;; case partial-completion (for example) doesn't make any sense |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
78 ;; and neither does the completions-first-difference highlight. |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
79 ;; - indicate how to display the completions in *Completions* (turn |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
80 ;; \n into something else, add special boundaries between |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
81 ;; completions). E.g. when completing from the kill-ring. |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
82 |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
83 ;; - make partial-completion-mode obsolete: |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
84 ;; - (?) <foo.h> style completion for file names. |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
85 ;; This can't be done identically just by tweaking completion, |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
86 ;; because partial-completion-mode's behavior is to expand <string.h> |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
87 ;; to /usr/include/string.h only when exiting the minibuffer, at which |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
88 ;; point the completion code is actually not involved normally. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
89 ;; Partial-completion-mode does it via a find-file-not-found-function. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
90 ;; - special code for C-x C-f <> to visit the file ref'd at point |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
91 ;; via (require 'foo) or #include "foo". ffap seems like a better |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
92 ;; place for this feature (supplemented with major-mode-provided |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
93 ;; functions to find the file ref'd at point). |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
94 |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
95 ;; - case-sensitivity currently confuses two issues: |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
96 ;; - whether or not a particular completion table should be case-sensitive |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
97 ;; (i.e. whether strings that differ only by case are semantically |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
98 ;; equivalent) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
99 ;; - whether the user wants completion to pay attention to case. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
100 ;; e.g. we may want to make it possible for the user to say "first try |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
101 ;; completion case-sensitively, and if that fails, try to ignore case". |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
102 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
103 ;; - add support for ** to pcm. |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
104 ;; - Add vc-file-name-completion-table to read-file-name-internal. |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
105 ;; - A feature like completing-help.el. |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
106 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
107 ;;; Code: |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
108 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
109 (eval-when-compile (require 'cl)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
110 |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
111 ;;; Completion table manipulation |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
112 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
113 ;; New completion-table operation. |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
114 (defun completion-boundaries (string table pred suffix) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
115 "Return the boundaries of the completions returned by TABLE for STRING. |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
116 STRING is the string on which completion will be performed. |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
117 SUFFIX is the string after point. |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
118 The result is of the form (START . END) where START is the position |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
119 in STRING of the beginning of the completion field and END is the position |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
120 in SUFFIX of the end of the completion field. |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
121 E.g. for simple completion tables, the result is always (0 . (length SUFFIX)) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
122 and for file names the result is the positions delimited by |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
123 the closest directory separators." |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
124 (let ((boundaries (if (functionp table) |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
125 (funcall table string pred (cons 'boundaries suffix))))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
126 (if (not (eq (car-safe boundaries) 'boundaries)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
127 (setq boundaries nil)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
128 (cons (or (cadr boundaries) 0) |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
129 (or (cddr boundaries) (length suffix))))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
130 |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
131 (defun completion--some (fun xs) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
132 "Apply FUN to each element of XS in turn. |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
133 Return the first non-nil returned value. |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
134 Like CL's `some'." |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
135 (let ((firsterror nil) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
136 res) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
137 (while (and (not res) xs) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
138 (condition-case err |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
139 (setq res (funcall fun (pop xs))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
140 (error (unless firsterror (setq firsterror err)) nil))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
141 (or res |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
142 (if firsterror (signal (car firsterror) (cdr firsterror)))))) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
143 |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
144 (defun complete-with-action (action table string pred) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
145 "Perform completion ACTION. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
146 STRING is the string to complete. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
147 TABLE is the completion table, which should not be a function. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
148 PRED is a completion predicate. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
149 ACTION can be one of nil, t or `lambda'." |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
150 (cond |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
151 ((functionp table) (funcall table string pred action)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
152 ((eq (car-safe action) 'boundaries) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
153 (cons 'boundaries (completion-boundaries string table pred (cdr action)))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
154 (t |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
155 (funcall |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
156 (cond |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
157 ((null action) 'try-completion) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
158 ((eq action t) 'all-completions) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
159 (t 'test-completion)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
160 string table pred)))) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
161 |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
162 (defun completion-table-dynamic (fun) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
163 "Use function FUN as a dynamic completion table. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
164 FUN is called with one argument, the string for which completion is required, |
94202
987535788e11
(completion-table-dynamic): Fix typo, and reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
94182
diff
changeset
|
165 and it should return an alist containing all the intended possible completions. |
987535788e11
(completion-table-dynamic): Fix typo, and reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
94182
diff
changeset
|
166 This alist may be a full list of possible completions so that FUN can ignore |
987535788e11
(completion-table-dynamic): Fix typo, and reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
94182
diff
changeset
|
167 the value of its argument. If completion is performed in the minibuffer, |
987535788e11
(completion-table-dynamic): Fix typo, and reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
94182
diff
changeset
|
168 FUN will be called in the buffer from which the minibuffer was entered. |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
169 |
97550
dc32b170fe16
(completion-table-dynamic): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
97544
diff
changeset
|
170 The result of the `completion-table-dynamic' form is a function |
95426
92edde3e7af6
(completion-table-dynamic): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents:
95394
diff
changeset
|
171 that can be used as the COLLECTION argument to `try-completion' and |
94202
987535788e11
(completion-table-dynamic): Fix typo, and reflow docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
94182
diff
changeset
|
172 `all-completions'. See Info node `(elisp)Programmed Completion'." |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
173 (lexical-let ((fun fun)) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
174 (lambda (string pred action) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
175 (with-current-buffer (let ((win (minibuffer-selected-window))) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
176 (if (window-live-p win) (window-buffer win) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
177 (current-buffer))) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
178 (complete-with-action action (funcall fun string) string pred))))) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
179 |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
180 (defmacro lazy-completion-table (var fun) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
181 "Initialize variable VAR as a lazy completion table. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
182 If the completion table VAR is used for the first time (e.g., by passing VAR |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
183 as an argument to `try-completion'), the function FUN is called with no |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
184 arguments. FUN must return the completion table that will be stored in VAR. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
185 If completion is requested in the minibuffer, FUN will be called in the buffer |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
186 from which the minibuffer was entered. The return value of |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
187 `lazy-completion-table' must be used to initialize the value of VAR. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
188 |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
189 You should give VAR a non-nil `risky-local-variable' property." |
94017
f2ded84f543c
(lazy-completion-table): Fix debug spec.
Johan Bockgård <bojohan@gnu.org>
parents:
94013
diff
changeset
|
190 (declare (debug (symbolp lambda-expr))) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
191 (let ((str (make-symbol "string"))) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
192 `(completion-table-dynamic |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
193 (lambda (,str) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
194 (when (functionp ,var) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
195 (setq ,var (,fun))) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
196 ,var)))) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
197 |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
198 (defun completion-table-with-context (prefix table string pred action) |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
199 ;; TODO: add `suffix' maybe? |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
200 ;; Notice that `pred' may not be a function in some abusive cases. |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
201 (when (functionp pred) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
202 (setq pred |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
203 (lexical-let ((pred pred)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
204 ;; Predicates are called differently depending on the nature of |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
205 ;; the completion table :-( |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
206 (cond |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
207 ((vectorp table) ;Obarray. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
208 (lambda (sym) (funcall pred (concat prefix (symbol-name sym))))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
209 ((hash-table-p table) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
210 (lambda (s v) (funcall pred (concat prefix s)))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
211 ((functionp table) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
212 (lambda (s) (funcall pred (concat prefix s)))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
213 (t ;Lists and alists. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
214 (lambda (s) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
215 (funcall pred (concat prefix (if (consp s) (car s) s))))))))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
216 (if (eq (car-safe action) 'boundaries) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
217 (let* ((len (length prefix)) |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
218 (bound (completion-boundaries string table pred (cdr action)))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
219 (list* 'boundaries (+ (car bound) len) (cdr bound))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
220 (let ((comp (complete-with-action action table string pred))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
221 (cond |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
222 ;; In case of try-completion, add the prefix. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
223 ((stringp comp) (concat prefix comp)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
224 (t comp))))) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
225 |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
226 (defun completion-table-with-terminator (terminator table string pred action) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
227 "Construct a completion table like TABLE but with an extra TERMINATOR. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
228 This is meant to be called in a curried way by first passing TERMINATOR |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
229 and TABLE only (via `apply-partially'). |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
230 TABLE is a completion table, and TERMINATOR is a string appended to TABLE's |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
231 completion if it is complete. TERMINATOR is also used to determine the |
105711
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
232 completion suffix's boundary. |
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
233 TERMINATOR can also be a cons cell (TERMINATOR . TERMINATOR-REGEXP) |
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
234 in which case TERMINATOR-REGEXP is a regular expression whose submatch |
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
235 number 1 should match TERMINATOR. This is used when there is a need to |
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
236 distinguish occurrences of the TERMINATOR strings which are really terminators |
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
237 from others (e.g. escaped)." |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
238 (cond |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
239 ((eq (car-safe action) 'boundaries) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
240 (let* ((suffix (cdr action)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
241 (bounds (completion-boundaries string table pred suffix)) |
105711
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
242 (terminator-regexp (if (consp terminator) |
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
243 (cdr terminator) (regexp-quote terminator))) |
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
244 (max (string-match terminator-regexp suffix))) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
245 (list* 'boundaries (car bounds) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
246 (min (cdr bounds) (or max (length suffix)))))) |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
247 ((eq action nil) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
248 (let ((comp (try-completion string table pred))) |
105711
834e4fdbe74a
(completion-table-with-terminator): Allow to specify the terminator-regexp.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105697
diff
changeset
|
249 (if (consp terminator) (setq terminator (car terminator))) |
94077
28e2f73174d6
(completion-table-with-terminator): Those completions
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94069
diff
changeset
|
250 (if (eq comp t) |
28e2f73174d6
(completion-table-with-terminator): Those completions
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94069
diff
changeset
|
251 (concat string terminator) |
28e2f73174d6
(completion-table-with-terminator): Those completions
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94069
diff
changeset
|
252 (if (and (stringp comp) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
253 ;; FIXME: Try to avoid this second call, especially since |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
254 ;; it may be very inefficient (because `comp' made us |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
255 ;; jump to a new boundary, so we complete in that |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
256 ;; boundary with an empty start string). |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
257 ;; completion-boundaries might help. |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
258 (eq (try-completion comp table pred) t)) |
94077
28e2f73174d6
(completion-table-with-terminator): Those completions
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94069
diff
changeset
|
259 (concat comp terminator) |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
260 comp)))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
261 ((eq action t) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
262 ;; FIXME: We generally want the `try' and `all' behaviors to be |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
263 ;; consistent so pcm can merge the `all' output to get the `try' output, |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
264 ;; but that sometimes clashes with the need for `all' output to look |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
265 ;; good in *Completions*. |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
266 ;; (mapcar (lambda (s) (concat s terminator)) |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
267 ;; (all-completions string table pred)))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
268 (all-completions string table pred)) |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
269 ;; completion-table-with-terminator is always used for |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
270 ;; "sub-completions" so it's only called if the terminator is missing, |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
271 ;; in which case `test-completion' should return nil. |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
272 ((eq action 'lambda) nil))) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
273 |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
274 (defun completion-table-with-predicate (table pred1 strict string pred2 action) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
275 "Make a completion table equivalent to TABLE but filtered through PRED1. |
94736
3a7862f514d0
(completion-table-with-predicate): Don't use `iff' in docstring.
Juanma Barranquero <lekktu@gmail.com>
parents:
94678
diff
changeset
|
276 PRED1 is a function of one argument which returns non-nil if and only if the |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
277 argument is an element of TABLE which should be considered for completion. |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
278 STRING, PRED2, and ACTION are the usual arguments to completion tables, |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
279 as described in `try-completion', `all-completions', and `test-completion'. |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
280 If STRICT is t, the predicate always applies; if nil it only applies if |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
281 it does not reduce the set of possible completions to nothing. |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
282 Note: TABLE needs to be a proper completion table which obeys predicates." |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
283 (cond |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
284 ((and (not strict) (eq action 'lambda)) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
285 ;; Ignore pred1 since it doesn't really have to apply anyway. |
94182
0be1624297ac
(completion-table-with-predicate): Typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94180
diff
changeset
|
286 (test-completion string table pred2)) |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
287 (t |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
288 (or (complete-with-action action table string |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
289 (if (null pred2) pred1 |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
290 (lexical-let ((pred1 pred2) (pred2 pred2)) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
291 (lambda (x) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
292 ;; Call `pred1' first, so that `pred2' |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
293 ;; really can't tell that `x' is in table. |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
294 (if (funcall pred1 x) (funcall pred2 x)))))) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
295 ;; If completion failed and we're not applying pred1 strictly, try |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
296 ;; again without pred1. |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
297 (and (not strict) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
298 (complete-with-action action table string pred2)))))) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
299 |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
300 (defun completion-table-in-turn (&rest tables) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
301 "Create a completion table that tries each table in TABLES in turn." |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
302 ;; FIXME: the boundaries may come from TABLE1 even when the completion list |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
303 ;; is returned by TABLE2 (because TABLE1 returned an empty list). |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
304 (lexical-let ((tables tables)) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
305 (lambda (string pred action) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
306 (completion--some (lambda (table) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
307 (complete-with-action action table string pred)) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
308 tables)))) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
309 |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
310 ;; (defmacro complete-in-turn (a b) `(completion-table-in-turn ,a ,b)) |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
311 ;; (defmacro dynamic-completion-table (fun) `(completion-table-dynamic ,fun)) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
312 (define-obsolete-function-alias |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
313 'complete-in-turn 'completion-table-in-turn "23.1") |
94180
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
314 (define-obsolete-function-alias |
114d8f4904d0
* minibuffer.el (completion-table-with-context): Add support for `pred'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94172
diff
changeset
|
315 'dynamic-completion-table 'completion-table-dynamic "23.1") |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
316 |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
317 ;;; Minibuffer completion |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
318 |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
319 (defgroup minibuffer nil |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
320 "Controlling the behavior of the minibuffer." |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
321 :link '(custom-manual "(emacs)Minibuffer") |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
322 :group 'environment) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
323 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
324 (defun minibuffer-message (message &rest args) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
325 "Temporarily display MESSAGE at the end of the minibuffer. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
326 The text is displayed for `minibuffer-message-timeout' seconds, |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
327 or until the next input event arrives, whichever comes first. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
328 Enclose MESSAGE in [...] if this is not yet the case. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
329 If ARGS are provided, then pass MESSAGE through `format'." |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
330 (if (not (minibufferp (current-buffer))) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
331 (progn |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
332 (if args |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
333 (apply 'message message args) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
334 (message "%s" message)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
335 (prog1 (sit-for (or minibuffer-message-timeout 1000000)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
336 (message nil))) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
337 ;; Clear out any old echo-area message to make way for our new thing. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
338 (message nil) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
339 (setq message (if (and (null args) (string-match-p "\\` *\\[.+\\]\\'" message)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
340 ;; Make sure we can put-text-property. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
341 (copy-sequence message) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
342 (concat " [" message "]"))) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
343 (when args (setq message (apply 'format message args))) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
344 (let ((ol (make-overlay (point-max) (point-max) nil t t)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
345 ;; A quit during sit-for normally only interrupts the sit-for, |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
346 ;; but since minibuffer-message is used at the end of a command, |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
347 ;; at a time when the command has virtually finished already, a C-g |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
348 ;; should really cause an abort-recursive-edit instead (i.e. as if |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
349 ;; the C-g had been typed at top-level). Binding inhibit-quit here |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
350 ;; is an attempt to get that behavior. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
351 (inhibit-quit t)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
352 (unwind-protect |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
353 (progn |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
354 (unless (zerop (length message)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
355 ;; The current C cursor code doesn't know to use the overlay's |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
356 ;; marker's stickiness to figure out whether to place the cursor |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
357 ;; before or after the string, so let's spoon-feed it the pos. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
358 (put-text-property 0 1 'cursor t message)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
359 (overlay-put ol 'after-string message) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
360 (sit-for (or minibuffer-message-timeout 1000000))) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
361 (delete-overlay ol))))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
362 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
363 (defun minibuffer-completion-contents () |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
364 "Return the user input in a minibuffer before point as a string. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
365 That is what completion commands operate on." |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
366 (buffer-substring (field-beginning) (point))) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
367 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
368 (defun delete-minibuffer-contents () |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
369 "Delete all user input in a minibuffer. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
370 If the current buffer is not a minibuffer, erase its entire contents." |
99232
63548ee8ae9f
(delete-minibuffer-contents): Delete all minibuffer contents instead
Chong Yidong <cyd@stupidchicken.com>
parents:
98907
diff
changeset
|
371 ;; We used to do `delete-field' here, but when file name shadowing |
63548ee8ae9f
(delete-minibuffer-contents): Delete all minibuffer contents instead
Chong Yidong <cyd@stupidchicken.com>
parents:
98907
diff
changeset
|
372 ;; is on, the field doesn't cover the entire minibuffer contents. |
63548ee8ae9f
(delete-minibuffer-contents): Delete all minibuffer contents instead
Chong Yidong <cyd@stupidchicken.com>
parents:
98907
diff
changeset
|
373 (delete-region (minibuffer-prompt-end) (point-max))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
374 |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
375 (defcustom completion-auto-help t |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
376 "Non-nil means automatically provide help for invalid completion input. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
377 If the value is t the *Completion* buffer is displayed whenever completion |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
378 is requested but cannot be done. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
379 If the value is `lazy', the *Completions* buffer is only displayed after |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
380 the second failed attempt to complete." |
93942
187008494f10
(completion-auto-help): Fix typo.
Juanma Barranquero <lekktu@gmail.com>
parents:
93937
diff
changeset
|
381 :type '(choice (const nil) (const t) (const lazy)) |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
382 :group 'minibuffer) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
383 |
105950
e411fa8e0abf
* progmodes/grep.el (grep-regexp-alist):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
105930
diff
changeset
|
384 (defconst completion-styles-alist |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
385 '((emacs21 |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
386 completion-emacs21-try-completion completion-emacs21-all-completions |
107977
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
387 "Simple prefix-based completion. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
388 I.e. when completing \"foo_bar\" (where _ is the position of point), |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
389 it will consider all completions candidates matching the glob |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
390 pattern \"foobar*\".") |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
391 (emacs22 |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
392 completion-emacs22-try-completion completion-emacs22-all-completions |
107977
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
393 "Prefix completion that only operates on the text before point. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
394 I.e. when completing \"foo_bar\" (where _ is the position of point), |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
395 it will consider all completions candidates matching the glob |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
396 pattern \"foo*\" and will add back \"bar\" to the end of it.") |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
397 (basic |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
398 completion-basic-try-completion completion-basic-all-completions |
107977
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
399 "Completion of the prefix before point and the suffix after point. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
400 I.e. when completing \"foo_bar\" (where _ is the position of point), |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
401 it will consider all completions candidates matching the glob |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
402 pattern \"foo*bar*\".") |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
403 (partial-completion |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
404 completion-pcm-try-completion completion-pcm-all-completions |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
405 "Completion of multiple words, each one taken as a prefix. |
107977
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
406 I.e. when completing \"l-co_h\" (where _ is the position of point), |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
407 it will consider all completions candidates matching the glob |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
408 pattern \"l*-co*h*\". |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
409 Furthermore, for completions that are done step by step in subfields, |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
410 the method is applied to all the preceding fields that do not yet match. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
411 E.g. C-x C-f /u/mo/s TAB could complete to /usr/monnier/src. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
412 Additionally the user can use the char \"*\" as a glob pattern.") |
107983
781bff25a517
(completion-styles-alist): Fix up last merge and document `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107978
diff
changeset
|
413 (substring |
781bff25a517
(completion-styles-alist): Fix up last merge and document `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107978
diff
changeset
|
414 completion-substring-try-completion completion-substring-all-completions |
781bff25a517
(completion-styles-alist): Fix up last merge and document `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107978
diff
changeset
|
415 "Completion of the string taken as a substring. |
781bff25a517
(completion-styles-alist): Fix up last merge and document `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107978
diff
changeset
|
416 I.e. when completing \"foo_bar\" (where _ is the position of point), |
781bff25a517
(completion-styles-alist): Fix up last merge and document `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107978
diff
changeset
|
417 it will consider all completions candidates matching the glob |
781bff25a517
(completion-styles-alist): Fix up last merge and document `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107978
diff
changeset
|
418 pattern \"*foo*bar*\".") |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
419 (initials |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
420 completion-initials-try-completion completion-initials-all-completions |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
421 "Completion of acronyms and initialisms. |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
422 E.g. can complete M-x lch to list-command-history |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
423 and C-x C-f ~/sew to ~/src/emacs/work.")) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
424 "List of available completion styles. |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
425 Each element has the form (NAME TRY-COMPLETION ALL-COMPLETIONS DOC): |
94375
f8b940834bbb
(completion-pcm-word-delimiters): Add :group.
Juanma Barranquero <lekktu@gmail.com>
parents:
94352
diff
changeset
|
426 where NAME is the name that should be used in `completion-styles', |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
427 TRY-COMPLETION is the function that does the completion (it should |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
428 follow the same calling convention as `completion-try-completion'), |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
429 ALL-COMPLETIONS is the function that lists the completions (it should |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
430 follow the calling convention of `completion-all-completions'), |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
431 and DOC describes the way this style of completion works.") |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
432 |
107977
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
433 (defcustom completion-styles |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
434 ;; First, use `basic' because prefix completion has been the standard |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
435 ;; for "ever" and works well in most cases, so using it first |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
436 ;; ensures that we obey previous behavior in most cases. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
437 '(basic |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
438 ;; Then use `partial-completion' because it has proven to |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
439 ;; be a very convenient extension. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
440 partial-completion |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
441 ;; Finally use `emacs22' so as to maintain (in many/most cases) |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
442 ;; the previous behavior that when completing "foobar" with point |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
443 ;; between "foo" and "bar" the completion try to complete "foo" |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
444 ;; and simply add "bar" to the end of the result. |
17966fd41dcf
(completion-styles): Improve docstrings.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107517
diff
changeset
|
445 emacs22) |
104342
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
446 "List of completion styles to use. |
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
447 The available styles are listed in `completion-styles-alist'." |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
448 :type `(repeat (choice ,@(mapcar (lambda (x) (list 'const (car x))) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
449 completion-styles-alist))) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
450 :group 'minibuffer |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
451 :version "23.1") |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
452 |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
453 (defun completion-try-completion (string table pred point) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
454 "Try to complete STRING using completion table TABLE. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
455 Only the elements of table that satisfy predicate PRED are considered. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
456 POINT is the position of point within STRING. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
457 The return value can be either nil to indicate that there is no completion, |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
458 t to indicate that STRING is the only possible completion, |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
459 or a pair (STRING . NEWPOINT) of the completed result string together with |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
460 a new position for point." |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
461 (completion--some (lambda (style) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
462 (funcall (nth 1 (assq style completion-styles-alist)) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
463 string table pred point)) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
464 completion-styles)) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
465 |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
466 (defun completion-all-completions (string table pred point) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
467 "List the possible completions of STRING in completion table TABLE. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
468 Only the elements of table that satisfy predicate PRED are considered. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
469 POINT is the position of point within STRING. |
94375
f8b940834bbb
(completion-pcm-word-delimiters): Add :group.
Juanma Barranquero <lekktu@gmail.com>
parents:
94352
diff
changeset
|
470 The return value is a list of completions and may contain the base-size |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
471 in the last `cdr'." |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
472 ;; FIXME: We need to additionally return the info needed for the |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
473 ;; second part of completion-base-position. |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
474 (completion--some (lambda (style) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
475 (funcall (nth 2 (assq style completion-styles-alist)) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
476 string table pred point)) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
477 completion-styles)) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
478 |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
479 (defun minibuffer--bitset (modified completions exact) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
480 (logior (if modified 4 0) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
481 (if completions 2 0) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
482 (if exact 1 0))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
483 |
107250
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
484 (defun completion--replace (beg end newtext) |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
485 "Replace the buffer text between BEG and END with NEWTEXT. |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
486 Moves point to the end of the new text." |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
487 ;; This should be in subr.el. |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
488 ;; You'd think this is trivial to do, but details matter if you want |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
489 ;; to keep markers "at the right place" and be robust in the face of |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
490 ;; after-change-functions that may themselves modify the buffer. |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
491 (goto-char beg) |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
492 (insert newtext) |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
493 (delete-region (point) (+ (point) (- end beg)))) |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
494 |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
495 (defcustom completion-cycle-threshold nil |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
496 "Number of completion candidates below which cycling is used. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
497 Depending on this setting `minibuffer-complete' may use cycling, |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
498 like `minibuffer-force-complete'. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
499 If nil, cycling is never used. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
500 If t, cycling is always used. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
501 If an integer, cycling is used as soon as there are fewer completion |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
502 candidates than this number." |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
503 :type '(choice (const :tag "No cycling" nil) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
504 (const :tag "Always cycle" t) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
505 (integer :tag "Threshold"))) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
506 |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
507 (defun completion--do-completion (&optional try-completion-function) |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
508 "Do the completion and return a summary of what happened. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
509 M = completion was performed, the text was Modified. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
510 C = there were available Completions. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
511 E = after completion we now have an Exact match. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
512 |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
513 MCE |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
514 000 0 no possible completion |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
515 001 1 was already an exact and unique completion |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
516 010 2 no completion happened |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
517 011 3 was already an exact completion |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
518 100 4 ??? impossible |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
519 101 5 ??? impossible |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
520 110 6 some completion happened |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
521 111 7 completed to an exact completion" |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
522 (let* ((beg (field-beginning)) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
523 (end (field-end)) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
524 (string (buffer-substring beg end)) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
525 (comp (funcall (or try-completion-function |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
526 'completion-try-completion) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
527 string |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
528 minibuffer-completion-table |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
529 minibuffer-completion-predicate |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
530 (- (point) beg)))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
531 (cond |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
532 ((null comp) |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
533 (minibuffer-hide-completions) |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
534 (ding) (minibuffer-message "No match") (minibuffer--bitset nil nil nil)) |
104342
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
535 ((eq t comp) |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
536 (minibuffer-hide-completions) |
104342
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
537 (goto-char (field-end)) |
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
538 (minibuffer--bitset nil nil t)) ;Exact and unique match. |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
539 (t |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
540 ;; `completed' should be t if some completion was done, which doesn't |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
541 ;; include simply changing the case of the entered string. However, |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
542 ;; for appearance, the string is rewritten if the case changes. |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
543 (let* ((comp-pos (cdr comp)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
544 (completion (car comp)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
545 (completed (not (eq t (compare-strings completion nil nil |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
546 string nil nil t)))) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
547 (unchanged (eq t (compare-strings completion nil nil |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
548 string nil nil nil)))) |
107250
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
549 (if unchanged |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
550 (goto-char end) |
107250
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
551 ;; Insert in minibuffer the chars we got. |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
552 (completion--replace beg end completion)) |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
553 ;; Move point to its completion-mandated destination. |
13dafa175b9c
Fix in-buffer completion when after-change-functions modify the buffer.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107089
diff
changeset
|
554 (forward-char (- comp-pos (length completion))) |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
555 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
556 (if (not (or unchanged completed)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
557 ;; The case of the string changed, but that's all. We're not sure |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
558 ;; whether this is a unique completion or not, so try again using |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
559 ;; the real case (this shouldn't recurse again, because the next |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
560 ;; time try-completion will return either t or the exact string). |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
561 (completion--do-completion try-completion-function) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
562 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
563 ;; It did find a match. Do we match some possibility exactly now? |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
564 (let ((exact (test-completion completion |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
565 minibuffer-completion-table |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
566 minibuffer-completion-predicate)) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
567 (comps |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
568 ;; Check to see if we want to do cycling. We do it |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
569 ;; here, after having performed the normal completion, |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
570 ;; so as to take advantage of the difference between |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
571 ;; try-completion and all-completions, for things |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
572 ;; like completion-ignored-extensions. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
573 (when (and completion-cycle-threshold |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
574 ;; Check that the completion didn't make |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
575 ;; us jump to a different boundary. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
576 (or (not completed) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
577 (< (car (completion-boundaries |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
578 (substring completion 0 comp-pos) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
579 minibuffer-completion-table |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
580 minibuffer-completion-predicate |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
581 "")) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
582 comp-pos))) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
583 (completion-all-sorted-completions)))) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
584 (setq completion-all-sorted-completions nil) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
585 (cond |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
586 ((and (not (ignore-errors |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
587 ;; This signal an (intended) error if comps is too |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
588 ;; short or if completion-cycle-threshold is t. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
589 (consp (nthcdr completion-cycle-threshold comps)))) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
590 ;; More than 1, so there's something to cycle. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
591 (consp (cdr comps))) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
592 ;; Fewer than completion-cycle-threshold remaining |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
593 ;; completions: let's cycle. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
594 (setq completed t exact t) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
595 (setq completion-all-sorted-completions comps) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
596 (minibuffer-force-complete)) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
597 (completed |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
598 ;; We could also decide to refresh the completions, |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
599 ;; if they're displayed (and assuming there are |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
600 ;; completions left). |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
601 (minibuffer-hide-completions)) |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
602 ;; Show the completion table, if requested. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
603 ((not exact) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
604 (if (case completion-auto-help |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
605 (lazy (eq this-command last-command)) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
606 (t completion-auto-help)) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
607 (minibuffer-completion-help) |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
608 (minibuffer-message "Next char not unique"))) |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
609 ;; If the last exact completion and this one were the same, it |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
610 ;; means we've already given a "Next char not unique" message |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
611 ;; and the user's hit TAB again, so now we give him help. |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
612 ((eq this-command last-command) |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
613 (if completion-auto-help (minibuffer-completion-help)))) |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
614 |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
615 (minibuffer--bitset completed t exact)))))))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
616 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
617 (defun minibuffer-complete () |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
618 "Complete the minibuffer contents as far as possible. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
619 Return nil if there is no valid completion, else t. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
620 If no characters can be completed, display a list of possible completions. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
621 If you repeat this command after it displayed such a list, |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
622 scroll the window of possible completions." |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
623 (interactive) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
624 ;; If the previous command was not this, |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
625 ;; mark the completion buffer obsolete. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
626 (unless (eq this-command last-command) |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
627 (setq completion-all-sorted-completions nil) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
628 (setq minibuffer-scroll-window nil)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
629 |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
630 (cond |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
631 ;; If there's a fresh completion window with a live buffer, |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
632 ;; and this command is repeated, scroll that window. |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
633 ((window-live-p minibuffer-scroll-window) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
634 (let ((window minibuffer-scroll-window)) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
635 (with-current-buffer (window-buffer window) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
636 (if (pos-visible-in-window-p (point-max) window) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
637 ;; If end is in view, scroll up to the beginning. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
638 (set-window-start window (point-min) nil) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
639 ;; Else scroll down one screen. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
640 (scroll-other-window)) |
108500
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
641 nil))) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
642 ;; If we're cycling, keep on cycling. |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
643 (completion-all-sorted-completions |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
644 (minibuffer-force-complete) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
645 t) |
9f927f4deab4
Allow the default completion to cycle.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108486
diff
changeset
|
646 (t (case (completion--do-completion) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
647 (#b000 nil) |
104342
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
648 (#b001 (minibuffer-message "Sole completion") |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
649 t) |
104342
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
650 (#b011 (minibuffer-message "Complete, but not unique") |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
651 t) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
652 (t t))))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
653 |
95172
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
654 (defvar completion-all-sorted-completions nil) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
655 (make-variable-buffer-local 'completion-all-sorted-completions) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
656 |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
657 (defun completion--flush-all-sorted-completions (&rest ignore) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
658 (setq completion-all-sorted-completions nil)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
659 |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
660 (defun completion-all-sorted-completions () |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
661 (or completion-all-sorted-completions |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
662 (let* ((start (field-beginning)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
663 (end (field-end)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
664 (all (completion-all-completions (buffer-substring start end) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
665 minibuffer-completion-table |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
666 minibuffer-completion-predicate |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
667 (- (point) start))) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
668 (last (last all)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
669 (base-size (or (cdr last) 0))) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
670 (when last |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
671 (setcdr last nil) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
672 ;; Prefer shorter completions. |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
673 (setq all (sort all (lambda (c1 c2) (< (length c1) (length c2))))) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
674 ;; Prefer recently used completions. |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
675 (let ((hist (symbol-value minibuffer-history-variable))) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
676 (setq all (sort all (lambda (c1 c2) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
677 (> (length (member c1 hist)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
678 (length (member c2 hist))))))) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
679 ;; Cache the result. This is not just for speed, but also so that |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
680 ;; repeated calls to minibuffer-force-complete can cycle through |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
681 ;; all possibilities. |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
682 (add-hook 'after-change-functions |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
683 'completion--flush-all-sorted-completions nil t) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
684 (setq completion-all-sorted-completions |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
685 (nconc all base-size)))))) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
686 |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
687 (defun minibuffer-force-complete () |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
688 "Complete the minibuffer to an exact match. |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
689 Repeated uses step through the possible completions." |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
690 (interactive) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
691 ;; FIXME: Need to deal with the extra-size issue here as well. |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
692 ;; FIXME: ~/src/emacs/t<M-TAB>/lisp/minibuffer.el completes to |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
693 ;; ~/src/emacs/trunk/ and throws away lisp/minibuffer.el. |
95172
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
694 (let* ((start (field-beginning)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
695 (end (field-end)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
696 (all (completion-all-sorted-completions))) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
697 (if (not (consp all)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
698 (minibuffer-message (if all "No more completions" "No completions")) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
699 (goto-char end) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
700 (insert (car all)) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
701 (delete-region (+ start (cdr (last all))) end) |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
702 ;; If completing file names, (car all) may be a directory, so we'd now |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
703 ;; have a new set of possible completions and might want to reset |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
704 ;; completion-all-sorted-completions to nil, but we prefer not to, |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
705 ;; so that repeated calls minibuffer-force-complete still cycle |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
706 ;; through the previous possible completions. |
105174
13f171fbff05
(minibuffer-force-complete): Cycle the list, rather
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104792
diff
changeset
|
707 (let ((last (last all))) |
13f171fbff05
(minibuffer-force-complete): Cycle the list, rather
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104792
diff
changeset
|
708 (setcdr last (cons (car all) (cdr last))) |
13f171fbff05
(minibuffer-force-complete): Cycle the list, rather
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104792
diff
changeset
|
709 (setq completion-all-sorted-completions (cdr all)))))) |
95172
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
710 |
100044
f42890851326
Add and use minibuffer-confirm-exit-commands variable
Miles Bader <miles@gnu.org>
parents:
100022
diff
changeset
|
711 (defvar minibuffer-confirm-exit-commands |
100052
766018471339
(minibuffer-confirm-exit-commands): Add PC-complete and
Chong Yidong <cyd@stupidchicken.com>
parents:
100044
diff
changeset
|
712 '(minibuffer-complete minibuffer-complete-word PC-complete PC-complete-word) |
100044
f42890851326
Add and use minibuffer-confirm-exit-commands variable
Miles Bader <miles@gnu.org>
parents:
100022
diff
changeset
|
713 "A list of commands which cause an immediately following |
f42890851326
Add and use minibuffer-confirm-exit-commands variable
Miles Bader <miles@gnu.org>
parents:
100022
diff
changeset
|
714 `minibuffer-complete-and-exit' to ask for extra confirmation.") |
f42890851326
Add and use minibuffer-confirm-exit-commands variable
Miles Bader <miles@gnu.org>
parents:
100022
diff
changeset
|
715 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
716 (defun minibuffer-complete-and-exit () |
99883
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
717 "Exit if the minibuffer contains a valid completion. |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
718 Otherwise, try to complete the minibuffer contents. If |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
719 completion leads to a valid completion, a repetition of this |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
720 command will exit. |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
721 |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
722 If `minibuffer-completion-confirm' is `confirm', do not try to |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
723 complete; instead, ask for confirmation and accept any input if |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
724 confirmed. |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
725 If `minibuffer-completion-confirm' is `confirm-after-completion', |
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
726 do not try to complete; instead, ask for confirmation if the |
102614
ac174f1dba45
(minibuffer-complete-and-exit): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102601
diff
changeset
|
727 preceding minibuffer command was a member of |
ac174f1dba45
(minibuffer-complete-and-exit): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102601
diff
changeset
|
728 `minibuffer-confirm-exit-commands', and accept the input |
ac174f1dba45
(minibuffer-complete-and-exit): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102601
diff
changeset
|
729 otherwise." |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
730 (interactive) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
731 (let ((beg (field-beginning)) |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
732 (end (field-end))) |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
733 (cond |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
734 ;; Allow user to specify null string |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
735 ((= beg end) (exit-minibuffer)) |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
736 ((test-completion (buffer-substring beg end) |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
737 minibuffer-completion-table |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
738 minibuffer-completion-predicate) |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
739 ;; FIXME: completion-ignore-case has various slightly |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
740 ;; incompatible meanings. E.g. it can reflect whether the user |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
741 ;; wants completion to pay attention to case, or whether the |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
742 ;; string will be used in a context where case is significant. |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
743 ;; E.g. usually try-completion should obey the first, whereas |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
744 ;; test-completion should obey the second. |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
745 (when completion-ignore-case |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
746 ;; Fixup case of the field, if necessary. |
94242
3530bf3c1687
(minibuffer-complete-and-exit): Fix last change.
Juanma Barranquero <lekktu@gmail.com>
parents:
94218
diff
changeset
|
747 (let* ((string (buffer-substring beg end)) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
748 (compl (try-completion |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
749 string |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
750 minibuffer-completion-table |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
751 minibuffer-completion-predicate))) |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
752 (when (and (stringp compl) (not (equal string compl)) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
753 ;; If it weren't for this piece of paranoia, I'd replace |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
754 ;; the whole thing with a call to do-completion. |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
755 ;; This is important, e.g. when the current minibuffer's |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
756 ;; content is a directory which only contains a single |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
757 ;; file, so `try-completion' actually completes to |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
758 ;; that file. |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
759 (= (length string) (length compl))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
760 (goto-char end) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
761 (insert compl) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
762 (delete-region beg end)))) |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
763 (exit-minibuffer)) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
764 |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
765 ((memq minibuffer-completion-confirm '(confirm confirm-after-completion)) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
766 ;; The user is permitted to exit with an input that's rejected |
99883
494c4c7bcf01
(minibuffer-complete-and-exit): Change `confirm-only' value of
Chong Yidong <cyd@stupidchicken.com>
parents:
99232
diff
changeset
|
767 ;; by test-completion, after confirming her choice. |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
768 (if (or (eq last-command this-command) |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
769 ;; For `confirm-after-completion' we only ask for confirmation |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
770 ;; if trying to exit immediately after typing TAB (this |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
771 ;; catches most minibuffer typos). |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
772 (and (eq minibuffer-completion-confirm 'confirm-after-completion) |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
773 (not (memq last-command minibuffer-confirm-exit-commands)))) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
774 (exit-minibuffer) |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
775 (minibuffer-message "Confirm") |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
776 nil)) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
777 |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
778 (t |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
779 ;; Call do-completion, but ignore errors. |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
780 (case (condition-case nil |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
781 (completion--do-completion) |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
782 (error 1)) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
783 ((#b001 #b011) (exit-minibuffer)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
784 (#b111 (if (not minibuffer-completion-confirm) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
785 (exit-minibuffer) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
786 (minibuffer-message "Confirm") |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
787 nil)) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
788 (t nil)))))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
789 |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
790 (defun completion--try-word-completion (string table predicate point) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
791 (let ((comp (completion-try-completion string table predicate point))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
792 (if (not (consp comp)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
793 comp |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
794 |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
795 ;; If completion finds next char not unique, |
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
796 ;; consider adding a space or a hyphen. |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
797 (when (= (length string) (length (car comp))) |
102958
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
798 ;; Mark the added char with the `completion-word' property, so it |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
799 ;; can be handled specially by completion styles such as |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
800 ;; partial-completion. |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
801 ;; We used to remove `partial-completion' from completion-styles |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
802 ;; instead, but it was too blunt, leading to situations where SPC |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
803 ;; was the only insertable char at point but minibuffer-complete-word |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
804 ;; refused inserting it. |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
805 (let ((exts (mapcar (lambda (str) (propertize str 'completion-try-word t)) |
ca1d2b3eaecc
(completion--try-word-completion): Don't disable
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
102614
diff
changeset
|
806 '(" " "-"))) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
807 (before (substring string 0 point)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
808 (after (substring string point)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
809 tem) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
810 (while (and exts (not (consp tem))) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
811 (setq tem (completion-try-completion |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
812 (concat before (pop exts) after) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
813 table predicate (1+ point)))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
814 (if (consp tem) (setq comp tem)))) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
815 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
816 ;; Completing a single word is actually more difficult than completing |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
817 ;; as much as possible, because we first have to find the "current |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
818 ;; position" in `completion' in order to find the end of the word |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
819 ;; we're completing. Normally, `string' is a prefix of `completion', |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
820 ;; which makes it trivial to find the position, but with fancier |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
821 ;; completion (plus env-var expansion, ...) `completion' might not |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
822 ;; look anything like `string' at all. |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
823 (let* ((comppoint (cdr comp)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
824 (completion (car comp)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
825 (before (substring string 0 point)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
826 (combined (concat before "\n" completion))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
827 ;; Find in completion the longest text that was right before point. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
828 (when (string-match "\\(.+\\)\n.*?\\1" combined) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
829 (let* ((prefix (match-string 1 before)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
830 ;; We used non-greedy match to make `rem' as long as possible. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
831 (rem (substring combined (match-end 0))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
832 ;; Find in the remainder of completion the longest text |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
833 ;; that was right after point. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
834 (after (substring string point)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
835 (suffix (if (string-match "\\`\\(.+\\).*\n.*\\1" |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
836 (concat after "\n" rem)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
837 (match-string 1 after)))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
838 ;; The general idea is to try and guess what text was inserted |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
839 ;; at point by the completion. Problem is: if we guess wrong, |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
840 ;; we may end up treating as "added by completion" text that was |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
841 ;; actually painfully typed by the user. So if we then cut |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
842 ;; after the first word, we may throw away things the |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
843 ;; user wrote. So let's try to be as conservative as possible: |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
844 ;; only cut after the first word, if we're reasonably sure that |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
845 ;; our guess is correct. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
846 ;; Note: a quick survey on emacs-devel seemed to indicate that |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
847 ;; nobody actually cares about the "word-at-a-time" feature of |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
848 ;; minibuffer-complete-word, whose real raison-d'être is that it |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
849 ;; tries to add "-" or " ". One more reason to only cut after |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
850 ;; the first word, if we're really sure we're right. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
851 (when (and (or suffix (zerop (length after))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
852 (string-match (concat |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
853 ;; Make submatch 1 as small as possible |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
854 ;; to reduce the risk of cutting |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
855 ;; valuable text. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
856 ".*" (regexp-quote prefix) "\\(.*?\\)" |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
857 (if suffix (regexp-quote suffix) "\\'")) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
858 completion) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
859 ;; The new point in `completion' should also be just |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
860 ;; before the suffix, otherwise something more complex |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
861 ;; is going on, and we're not sure where we are. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
862 (eq (match-end 1) comppoint) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
863 ;; (match-beginning 1)..comppoint is now the stretch |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
864 ;; of text in `completion' that was completed at point. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
865 (string-match "\\W" completion (match-beginning 1)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
866 ;; Is there really something to cut? |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
867 (> comppoint (match-end 0))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
868 ;; Cut after the first word. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
869 (let ((cutpos (match-end 0))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
870 (setq completion (concat (substring completion 0 cutpos) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
871 (substring completion comppoint))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
872 (setq comppoint cutpos))))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
873 |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
874 (cons completion comppoint))))) |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
875 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
876 |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
877 (defun minibuffer-complete-word () |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
878 "Complete the minibuffer contents at most a single word. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
879 After one word is completed as much as possible, a space or hyphen |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
880 is added, provided that matches some possible completion. |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
881 Return nil if there is no valid completion, else t." |
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
882 (interactive) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
883 (case (completion--do-completion 'completion--try-word-completion) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
884 (#b000 nil) |
104342
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
885 (#b001 (minibuffer-message "Sole completion") |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
886 t) |
104342
867af630a71e
(completion--do-completion): Move point for the #b001 case as well (bug#4176).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104122
diff
changeset
|
887 (#b011 (minibuffer-message "Complete, but not unique") |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
888 t) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
889 (t t))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
890 |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
891 (defface completions-annotations '((t :inherit italic)) |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
892 "Face to use for annotations in the *Completions* buffer.") |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
893 |
106122
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
894 (defcustom completions-format nil |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
895 "Define the appearance and sorting of completions. |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
896 If the value is `vertical', display completions sorted vertically |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
897 in columns in the *Completions* buffer. |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
898 If the value is `horizontal' or nil, display completions sorted |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
899 horizontally in alphabetical order, rather than down the screen." |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
900 :type '(choice (const nil) (const horizontal) (const vertical)) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
901 :group 'minibuffer |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
902 :version "23.2") |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
903 |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
904 (defun completion--insert-strings (strings) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
905 "Insert a list of STRINGS into the current buffer. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
906 Uses columns to keep the listing readable but compact. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
907 It also eliminates runs of equal strings." |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
908 (when (consp strings) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
909 (let* ((length (apply 'max |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
910 (mapcar (lambda (s) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
911 (if (consp s) |
94561
bbc1b1a5633e
(completion--insert-strings): Use string-width rather than length.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94558
diff
changeset
|
912 (+ (string-width (car s)) |
bbc1b1a5633e
(completion--insert-strings): Use string-width rather than length.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94558
diff
changeset
|
913 (string-width (cadr s))) |
bbc1b1a5633e
(completion--insert-strings): Use string-width rather than length.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94558
diff
changeset
|
914 (string-width s))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
915 strings))) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
916 (window (get-buffer-window (current-buffer) 0)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
917 (wwidth (if window (1- (window-width window)) 79)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
918 (columns (min |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
919 ;; At least 2 columns; at least 2 spaces between columns. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
920 (max 2 (/ wwidth (+ 2 length))) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
921 ;; Don't allocate more columns than we can fill. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
922 ;; Windows can't show less than 3 lines anyway. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
923 (max 1 (/ (length strings) 2)))) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
924 (colwidth (/ wwidth columns)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
925 (column 0) |
106122
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
926 (rows (/ (length strings) columns)) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
927 (row 0) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
928 (laststring nil)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
929 ;; The insertion should be "sensible" no matter what choices were made |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
930 ;; for the parameters above. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
931 (dolist (str strings) |
101327
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
932 (unless (equal laststring str) ; Remove (consecutive) duplicates. |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
933 (setq laststring str) |
101327
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
934 (let ((length (if (consp str) |
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
935 (+ (string-width (car str)) |
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
936 (string-width (cadr str))) |
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
937 (string-width str)))) |
106122
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
938 (cond |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
939 ((eq completions-format 'vertical) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
940 ;; Vertical format |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
941 (when (> row rows) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
942 (forward-line (- -1 rows)) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
943 (setq row 0 column (+ column colwidth))) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
944 (when (> column 0) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
945 (end-of-line) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
946 (while (> (current-column) column) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
947 (if (eobp) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
948 (insert "\n") |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
949 (forward-line 1) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
950 (end-of-line))) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
951 (insert " \t") |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
952 (set-text-properties (- (point) 1) (point) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
953 `(display (space :align-to ,column))))) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
954 (t |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
955 ;; Horizontal format |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
956 (unless (bolp) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
957 (if (< wwidth (+ (max colwidth length) column)) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
958 ;; No space for `str' at point, move to next line. |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
959 (progn (insert "\n") (setq column 0)) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
960 (insert " \t") |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
961 ;; Leave the space unpropertized so that in the case we're |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
962 ;; already past the goal column, there is still |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
963 ;; a space displayed. |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
964 (set-text-properties (- (point) 1) (point) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
965 ;; We can't just set tab-width, because |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
966 ;; completion-setup-function will kill all |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
967 ;; local variables :-( |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
968 `(display (space :align-to ,column))) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
969 nil)))) |
101327
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
970 (if (not (consp str)) |
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
971 (put-text-property (point) (progn (insert str) (point)) |
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
972 'mouse-face 'highlight) |
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
973 (put-text-property (point) (progn (insert (car str)) (point)) |
b0eef2ac5a59
(completion--insert-strings): Fix up computation of
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
101162
diff
changeset
|
974 'mouse-face 'highlight) |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
975 (add-text-properties (point) (progn (insert (cadr str)) (point)) |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
976 '(mouse-face nil |
106122
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
977 face completions-annotations))) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
978 (cond |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
979 ((eq completions-format 'vertical) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
980 ;; Vertical format |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
981 (if (> column 0) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
982 (forward-line) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
983 (insert "\n")) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
984 (setq row (1+ row))) |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
985 (t |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
986 ;; Horizontal format |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
987 ;; Next column to align to. |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
988 (setq column (+ column |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
989 ;; Round up to a whole number of columns. |
4ff55285a1c0
(completions-format): New defcustom.
Juri Linkov <juri@jurta.org>
parents:
106109
diff
changeset
|
990 (* colwidth (ceiling length colwidth)))))))))))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
991 |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
992 (defvar completion-common-substring nil) |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
993 (make-obsolete-variable 'completion-common-substring nil "23.1") |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
994 |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
995 (defvar completion-setup-hook nil |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
996 "Normal hook run at the end of setting up a completion list buffer. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
997 When this hook is run, the current buffer is the one in which the |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
998 command to display the completion list buffer was run. |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
999 The completion list buffer is available as the value of `standard-output'. |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1000 See also `display-completion-list'.") |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1001 |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1002 (defface completions-first-difference |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1003 '((t (:inherit bold))) |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1004 "Face put on the first uncommon character in completions in *Completions* buffer." |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1005 :group 'completion) |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1006 |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1007 (defface completions-common-part |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1008 '((t (:inherit default))) |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1009 "Face put on the common prefix substring in completions in *Completions* buffer. |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1010 The idea of `completions-common-part' is that you can use it to |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1011 make the common parts less visible than normal, so that the rest |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1012 of the differing parts is, by contrast, slightly highlighted." |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1013 :group 'completion) |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1014 |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1015 (defun completion-hilit-commonality (completions prefix-len base-size) |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1016 (when completions |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1017 (let ((com-str-len (- prefix-len (or base-size 0)))) |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1018 (nconc |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1019 (mapcar |
94558
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1020 (lambda (elem) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1021 (let ((str |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1022 ;; Don't modify the string itself, but a copy, since the |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1023 ;; the string may be read-only or used for other purposes. |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1024 ;; Furthermore, since `completions' may come from |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1025 ;; display-completion-list, `elem' may be a list. |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1026 (if (consp elem) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1027 (car (setq elem (cons (copy-sequence (car elem)) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1028 (cdr elem)))) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1029 (setq elem (copy-sequence elem))))) |
100929
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1030 (put-text-property 0 |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1031 ;; If completion-boundaries returns incorrect |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1032 ;; values, all-completions may return strings |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1033 ;; that don't contain the prefix. |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1034 (min com-str-len (length str)) |
94558
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1035 'font-lock-face 'completions-common-part |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1036 str) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1037 (if (> (length str) com-str-len) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1038 (put-text-property com-str-len (1+ com-str-len) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1039 'font-lock-face 'completions-first-difference |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1040 str))) |
9802c49152d9
(completion-hilit-commonality): Revert last change:
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94487
diff
changeset
|
1041 elem) |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1042 completions) |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1043 base-size)))) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1044 |
97478
6c4680239c3f
(display-completion-list): Revert last change. Only default base-size
Chong Yidong <cyd@stupidchicken.com>
parents:
97476
diff
changeset
|
1045 (defun display-completion-list (completions &optional common-substring) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1046 "Display the list of completions, COMPLETIONS, using `standard-output'. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1047 Each element may be just a symbol or string |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1048 or may be a list of two strings to be printed as if concatenated. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1049 If it is a list of two strings, the first is the actual completion |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1050 alternative, the second serves as annotation. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1051 `standard-output' must be a buffer. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1052 The actual completion alternatives, as inserted, are given `mouse-face' |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1053 properties of `highlight'. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1054 At the end, this runs the normal hook `completion-setup-hook'. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1055 It can find the completion buffer in `standard-output'. |
97476
354026fc6299
(completion-boundaries): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
97179
diff
changeset
|
1056 |
97544
abca40c62d44
(display-completion-list): Re-state the obsolescence of `common-substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
97478
diff
changeset
|
1057 The obsolete optional arg COMMON-SUBSTRING, if non-nil, should be a string |
97476
354026fc6299
(completion-boundaries): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
97179
diff
changeset
|
1058 specifying a common substring for adding the faces |
354026fc6299
(completion-boundaries): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
97179
diff
changeset
|
1059 `completions-first-difference' and `completions-common-part' to |
97478
6c4680239c3f
(display-completion-list): Revert last change. Only default base-size
Chong Yidong <cyd@stupidchicken.com>
parents:
97476
diff
changeset
|
1060 the completions buffer." |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1061 (if common-substring |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1062 (setq completions (completion-hilit-commonality |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1063 completions (length common-substring) |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1064 ;; We don't know the base-size. |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1065 nil))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1066 (if (not (bufferp standard-output)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1067 ;; This *never* (ever) happens, so there's no point trying to be clever. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1068 (with-temp-buffer |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1069 (let ((standard-output (current-buffer)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1070 (completion-setup-hook nil)) |
97478
6c4680239c3f
(display-completion-list): Revert last change. Only default base-size
Chong Yidong <cyd@stupidchicken.com>
parents:
97476
diff
changeset
|
1071 (display-completion-list completions common-substring)) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1072 (princ (buffer-string))) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1073 |
105601
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1074 (with-current-buffer standard-output |
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1075 (goto-char (point-max)) |
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1076 (if (null completions) |
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1077 (insert "There are no possible completions of what you have typed.") |
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1078 (insert "Possible completions are:\n") |
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1079 (completion--insert-strings completions)))) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1080 |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1081 ;; The hilit used to be applied via completion-setup-hook, so there |
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1082 ;; may still be some code that uses completion-common-substring. |
97476
354026fc6299
(completion-boundaries): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
97179
diff
changeset
|
1083 (with-no-warnings |
354026fc6299
(completion-boundaries): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
97179
diff
changeset
|
1084 (let ((completion-common-substring common-substring)) |
354026fc6299
(completion-boundaries): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
97179
diff
changeset
|
1085 (run-hooks 'completion-setup-hook))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1086 nil) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1087 |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1088 (defvar completion-annotate-function |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1089 nil |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1090 ;; Note: there's a lot of scope as for when to add annotations and |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1091 ;; what annotations to add. E.g. completing-help.el allowed adding |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1092 ;; the first line of docstrings to M-x completion. But there's |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1093 ;; a tension, since such annotations, while useful at times, can |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1094 ;; actually drown the useful information. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1095 ;; So completion-annotate-function should be used parsimoniously, or |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1096 ;; else only used upon a user's request (e.g. we could add a command |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1097 ;; to completion-list-mode to add annotations to the current |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1098 ;; completions). |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1099 "Function to add annotations in the *Completions* buffer. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1100 The function takes a completion and should either return nil, or a string that |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1101 will be displayed next to the completion. The function can access the |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1102 completion table and predicates via `minibuffer-completion-table' and related |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1103 variables.") |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1104 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1105 (defun minibuffer-completion-help () |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1106 "Display a list of possible completions of the current minibuffer contents." |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1107 (interactive) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1108 (message "Making completion list...") |
107858 | 1109 (let* ((non-essential t) |
1110 (start (field-beginning)) | |
105601
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1111 (string (field-string)) |
94211
81b6ecd7be01
(completion-try-completion): Change magic symbol
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94202
diff
changeset
|
1112 (completions (completion-all-completions |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1113 string |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1114 minibuffer-completion-table |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1115 minibuffer-completion-predicate |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1116 (- (point) (field-beginning))))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1117 (message nil) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1118 (if (and completions |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1119 (or (consp (cdr completions)) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1120 (not (equal (car completions) string)))) |
106132
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1121 (let* ((last (last completions)) |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1122 (base-size (cdr last)) |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1123 ;; If the *Completions* buffer is shown in a new |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1124 ;; window, mark it as softly-dedicated, so bury-buffer in |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1125 ;; minibuffer-hide-completions will know whether to |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1126 ;; delete the window or not. |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1127 (display-buffer-mark-dedicated 'soft)) |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1128 (with-output-to-temp-buffer "*Completions*" |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1129 ;; Remove the base-size tail because `sort' requires a properly |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1130 ;; nil-terminated list. |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1131 (when last (setcdr last nil)) |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1132 (setq completions (sort completions 'string-lessp)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1133 (when completion-annotate-function |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1134 (setq completions |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1135 (mapcar (lambda (s) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1136 (let ((ann |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1137 (funcall completion-annotate-function s))) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1138 (if ann (list s ann) s))) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1139 completions))) |
105601
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1140 (with-current-buffer standard-output |
106132
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1141 (set (make-local-variable 'completion-base-position) |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1142 ;; FIXME: We should provide the END part as well, but |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1143 ;; currently completion-all-completions does not give |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1144 ;; us the necessary information. |
57f23ca20a76
* window.el (display-buffer-mark-dedicated): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106122
diff
changeset
|
1145 (list (+ start base-size) nil))) |
105601
68686d39c93a
Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105597
diff
changeset
|
1146 (display-completion-list completions))) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1147 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1148 ;; If there are no completions, or if the current input is already the |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1149 ;; only possible completion, then hide (previous&stale) completions. |
105969
6a8befbb8e39
(minibuffer-completion-help): Use minibuffer-hide-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105950
diff
changeset
|
1150 (minibuffer-hide-completions) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1151 (ding) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1152 (minibuffer-message |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1153 (if completions "Sole completion" "No completions"))) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1154 nil)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1155 |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1156 (defun minibuffer-hide-completions () |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1157 "Get rid of an out-of-date *Completions* buffer." |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1158 ;; FIXME: We could/should use minibuffer-scroll-window here, but it |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1159 ;; can also point to the minibuffer-parent-window, so it's a bit tricky. |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1160 (let ((win (get-buffer-window "*Completions*" 0))) |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1161 (if win (with-selected-window win (bury-buffer))))) |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1162 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1163 (defun exit-minibuffer () |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1164 "Terminate this minibuffer argument." |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1165 (interactive) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1166 ;; If the command that uses this has made modifications in the minibuffer, |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1167 ;; we don't want them to cause deactivation of the mark in the original |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1168 ;; buffer. |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1169 ;; A better solution would be to make deactivate-mark buffer-local |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1170 ;; (or to turn it into a list of buffers, ...), but in the mean time, |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1171 ;; this should do the trick in most cases. |
93937
dfe13eac745b
* minibuffer.el (minibuffer): Move group from cus-edit.el.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93885
diff
changeset
|
1172 (setq deactivate-mark nil) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1173 (throw 'exit nil)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1174 |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1175 (defun self-insert-and-exit () |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1176 "Terminate minibuffer input." |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1177 (interactive) |
101010
4efc7ca085ce
Replace last-command-char with last-command-event.
Glenn Morris <rgm@gnu.org>
parents:
100929
diff
changeset
|
1178 (if (characterp last-command-event) |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1179 (call-interactively 'self-insert-command) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1180 (ding)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1181 (exit-minibuffer)) |
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
1182 |
106109
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1183 (defvar completion-in-region-functions nil |
107514
408aeb71a781
* lisp/minibuffer.el (completion-in-region-functions): Fix docstring typos.
Juanma Barranquero <lekktu@gmail.com>
parents:
107250
diff
changeset
|
1184 "Wrapper hook around `completion-in-region'. |
106109
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1185 The functions on this special hook are called with 5 arguments: |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1186 NEXT-FUN START END COLLECTION PREDICATE. |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1187 NEXT-FUN is a function of four arguments (START END COLLECTION PREDICATE) |
107517
ed16fdd2685a
Fix typos in docstrings.
Juanma Barranquero <lekktu@gmail.com>
parents:
107514
diff
changeset
|
1188 that performs the default operation. The other four arguments are like |
107514
408aeb71a781
* lisp/minibuffer.el (completion-in-region-functions): Fix docstring typos.
Juanma Barranquero <lekktu@gmail.com>
parents:
107250
diff
changeset
|
1189 the ones passed to `completion-in-region'. The functions on this hook |
106109
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1190 are expected to perform completion on START..END using COLLECTION |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1191 and PREDICATE, either by calling NEXT-FUN or by doing it themselves.") |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1192 |
106109
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1193 (defun completion-in-region (start end collection &optional predicate) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1194 "Complete the text between START and END using COLLECTION. |
106452
4543cbad36da
(completion-in-region): Improve docstring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106413
diff
changeset
|
1195 Return nil if there is no valid completion, else t. |
106109
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1196 Point needs to be somewhere between START and END." |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1197 (assert (<= start (point)) (<= (point) end)) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1198 ;; FIXME: undisplay the *Completions* buffer once the completion is done. |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1199 (with-wrapper-hook |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1200 completion-in-region-functions (start end collection predicate) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1201 (let ((minibuffer-completion-table collection) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1202 (minibuffer-completion-predicate predicate) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1203 (ol (make-overlay start end nil nil t))) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1204 (overlay-put ol 'field 'completion) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1205 (unwind-protect |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1206 (call-interactively 'minibuffer-complete) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105969
diff
changeset
|
1207 (delete-overlay ol))))) |
95575
d34a432d5863
* keymap.c (Vminibuffer_local_filename_must_match_map):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95426
diff
changeset
|
1208 |
108166
15deb8699a13
* minibuffer.el (tags-completion-at-point-function): New function.
Chong Yidong <cyd@stupidchicken.com>
parents:
108159
diff
changeset
|
1209 (defvar completion-at-point-functions '(tags-completion-at-point-function) |
106482
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1210 "Special hook to find the completion table for the thing at point. |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1211 It is called without any argument and should return either nil, |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1212 or a function of no argument to perform completion (discouraged), |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1213 or a list of the form (START END COLLECTION &rest PROPS) where |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1214 START and END delimit the entity to complete and should include point, |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1215 COLLECTION is the completion table to use to complete it, and |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1216 PROPS is a property list for additional information. |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1217 Currently supported properties are: |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1218 `:predicate' a predicate that completion candidates need to satisfy. |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1219 `:annotation-function' the value to use for `completion-annotate-function'.") |
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1220 |
108375 | 1221 (defun completion-at-point (&optional arg) |
108159
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1222 "Perform completion on the text around point. |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1223 The completion method is determined by `completion-at-point-functions'. |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1224 |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1225 With a prefix argument, this command does completion within |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1226 the collection of symbols listed in the index of the manual for the |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1227 language you are using." |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1228 (interactive "P") |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1229 (if arg |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1230 (info-complete-symbol) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1231 (let ((res (run-hook-with-args-until-success |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1232 'completion-at-point-functions))) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1233 (cond |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1234 ((functionp res) (funcall res)) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1235 (res |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1236 (let* ((plist (nthcdr 3 res)) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1237 (start (nth 0 res)) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1238 (end (nth 1 res)) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1239 (completion-annotate-function |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1240 (or (plist-get plist :annotation-function) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1241 completion-annotate-function))) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1242 (completion-in-region start end (nth 2 res) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1243 (plist-get plist :predicate)))))))) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1244 |
108375 | 1245 (define-obsolete-function-alias 'complete-symbol 'completion-at-point "24.1") |
106482
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1246 |
106545
82c7a7ac0c67
(minibuffer-local-must-match-filename-map): Re-instate the varalias that was
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106482
diff
changeset
|
1247 ;;; Key bindings. |
82c7a7ac0c67
(minibuffer-local-must-match-filename-map): Re-instate the varalias that was
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106482
diff
changeset
|
1248 |
82c7a7ac0c67
(minibuffer-local-must-match-filename-map): Re-instate the varalias that was
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106482
diff
changeset
|
1249 (define-obsolete-variable-alias 'minibuffer-local-must-match-filename-map |
82c7a7ac0c67
(minibuffer-local-must-match-filename-map): Re-instate the varalias that was
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106482
diff
changeset
|
1250 'minibuffer-local-filename-must-match-map "23.1") |
106482
806e9f7990d8
* minibuffer.el (completion-at-point-functions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106453
diff
changeset
|
1251 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1252 (let ((map minibuffer-local-map)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1253 (define-key map "\C-g" 'abort-recursive-edit) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1254 (define-key map "\r" 'exit-minibuffer) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1255 (define-key map "\n" 'exit-minibuffer)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1256 |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1257 (let ((map minibuffer-local-completion-map)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1258 (define-key map "\t" 'minibuffer-complete) |
95172
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
1259 ;; M-TAB is already abused for many other purposes, so we should find |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
1260 ;; another binding for it. |
894bae45bf1b
(completion-all-sorted-completions): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95145
diff
changeset
|
1261 ;; (define-key map "\e\t" 'minibuffer-force-complete) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1262 (define-key map " " 'minibuffer-complete-word) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1263 (define-key map "?" 'minibuffer-completion-help)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1264 |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1265 (let ((map minibuffer-local-must-match-map)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1266 (define-key map "\r" 'minibuffer-complete-and-exit) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1267 (define-key map "\n" 'minibuffer-complete-and-exit)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1268 |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1269 (let ((map minibuffer-local-filename-completion-map)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1270 (define-key map " " nil)) |
95575
d34a432d5863
* keymap.c (Vminibuffer_local_filename_must_match_map):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95426
diff
changeset
|
1271 (let ((map minibuffer-local-filename-must-match-map)) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1272 (define-key map " " nil)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1273 |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1274 (let ((map minibuffer-local-ns-map)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1275 (define-key map " " 'exit-minibuffer) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1276 (define-key map "\t" 'exit-minibuffer) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1277 (define-key map "?" 'self-insert-and-exit)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1278 |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1279 ;;; Completion tables. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1280 |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1281 (defun minibuffer--double-dollars (str) |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1282 (replace-regexp-in-string "\\$" "$$" str)) |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1283 |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1284 (defun completion--make-envvar-table () |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1285 (mapcar (lambda (enventry) |
101162
64a6da0f9aa2
* minibuffer.el (minibuffer-message): Fix regexp so it doesn't exclude
Juanma Barranquero <lekktu@gmail.com>
parents:
101010
diff
changeset
|
1286 (substring enventry 0 (string-match-p "=" enventry))) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1287 process-environment)) |
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1288 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1289 (defconst completion--embedded-envvar-re |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1290 (concat "\\(?:^\\|[^$]\\(?:\\$\\$\\)*\\)" |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1291 "$\\([[:alnum:]_]*\\|{\\([^}]*\\)\\)\\'")) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1292 |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1293 (defun completion--embedded-envvar-table (string pred action) |
105733
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1294 "Completion table for envvars embedded in a string. |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1295 The envvar syntax (and escaping) rules followed by this table are the |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1296 same as `substitute-in-file-name'." |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1297 ;; We ignore `pred', because the predicates passed to us via |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1298 ;; read-file-name-internal are not 100% correct and fail here: |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1299 ;; e.g. we get predicates like file-directory-p there, whereas the filename |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1300 ;; completed needs to be passed through substitute-in-file-name before it |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1301 ;; can be passed to file-directory-p. |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1302 (when (string-match completion--embedded-envvar-re string) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1303 (let* ((beg (or (match-beginning 2) (match-beginning 1))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1304 (table (completion--make-envvar-table)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1305 (prefix (substring string 0 beg))) |
105733
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1306 (cond |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1307 ((eq action 'lambda) |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1308 ;; This table is expected to be used in conjunction with some |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1309 ;; other table that provides the "main" completion. Let the |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1310 ;; other table handle the test-completion case. |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1311 nil) |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1312 ((eq (car-safe action) 'boundaries) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1313 ;; Only return boundaries if there's something to complete, |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1314 ;; since otherwise when we're used in |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1315 ;; completion-table-in-turn, we could return boundaries and |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1316 ;; let some subsequent table return a list of completions. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1317 ;; FIXME: Maybe it should rather be fixed in |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1318 ;; completion-table-in-turn instead, but it's difficult to |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1319 ;; do it efficiently there. |
105733
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1320 (when (try-completion (substring string beg) table nil) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1321 ;; Compute the boundaries of the subfield to which this |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1322 ;; completion applies. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1323 (let ((suffix (cdr action))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1324 (list* 'boundaries |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1325 (or (match-beginning 2) (match-beginning 1)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1326 (when (string-match "[^[:alnum:]_]" suffix) |
105733
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1327 (match-beginning 0)))))) |
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1328 (t |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1329 (if (eq (aref string (1- beg)) ?{) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1330 (setq table (apply-partially 'completion-table-with-terminator |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1331 "}" table))) |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1332 ;; Even if file-name completion is case-insensitive, we want |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1333 ;; envvar completion to be case-sensitive. |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1334 (let ((completion-ignore-case nil)) |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1335 (completion-table-with-context |
105733
1528571f6bfd
(completion--embedded-envvar-table): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105711
diff
changeset
|
1336 prefix table (substring string beg) nil action))))))) |
94055
ec343c7600a2
(completion--embedded-envvar-table, read-file-name-internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
94017
diff
changeset
|
1337 |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1338 (defun completion-file-name-table (string pred action) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1339 "Completion table for file names." |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1340 (ignore-errors |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1341 (cond |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1342 ((eq (car-safe action) 'boundaries) |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1343 (let ((start (length (file-name-directory string))) |
101162
64a6da0f9aa2
* minibuffer.el (minibuffer-message): Fix regexp so it doesn't exclude
Juanma Barranquero <lekktu@gmail.com>
parents:
101010
diff
changeset
|
1344 (end (string-match-p "/" (cdr action)))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1345 (list* 'boundaries start end))) |
95426
92edde3e7af6
(completion-table-dynamic): Doc fix.
Juanma Barranquero <lekktu@gmail.com>
parents:
95394
diff
changeset
|
1346 |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1347 ((eq action 'lambda) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1348 (if (zerop (length string)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1349 nil ;Not sure why it's here, but it probably doesn't harm. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1350 (funcall (or pred 'file-exists-p) string))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1351 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1352 (t |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1353 (let* ((name (file-name-nondirectory string)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1354 (specdir (file-name-directory string)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1355 (realdir (or specdir default-directory))) |
94055
ec343c7600a2
(completion--embedded-envvar-table, read-file-name-internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
94017
diff
changeset
|
1356 |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1357 (cond |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1358 ((null action) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1359 (let ((comp (file-name-completion name realdir pred))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1360 (if (stringp comp) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1361 (concat specdir comp) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1362 comp))) |
94055
ec343c7600a2
(completion--embedded-envvar-table, read-file-name-internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
94017
diff
changeset
|
1363 |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1364 ((eq action t) |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1365 (let ((all (file-name-all-completions name realdir))) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1366 |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1367 ;; Check the predicate, if necessary. |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1368 (unless (memq pred '(nil file-exists-p)) |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1369 (let ((comp ()) |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1370 (pred |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1371 (if (eq pred 'file-directory-p) |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1372 ;; Brute-force speed up for directory checking: |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1373 ;; Discard strings which don't end in a slash. |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1374 (lambda (s) |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1375 (let ((len (length s))) |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1376 (and (> len 0) (eq (aref s (1- len)) ?/)))) |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1377 ;; Must do it the hard (and slow) way. |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1378 pred))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1379 (let ((default-directory (expand-file-name realdir))) |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1380 (dolist (tem all) |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1381 (if (funcall pred tem) (push tem comp)))) |
94062
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1382 (setq all (nreverse comp)))) |
9fefa536be58
* minibuffer.el (completion-all-completion-with-base-size): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94055
diff
changeset
|
1383 |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1384 all)))))))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1385 |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1386 (defvar read-file-name-predicate nil |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1387 "Current predicate used by `read-file-name-internal'.") |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1388 (make-obsolete-variable 'read-file-name-predicate |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1389 "use the regular PRED argument" "23.2") |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1390 |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1391 (defun completion--file-name-table (string pred action) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1392 "Internal subroutine for `read-file-name'. Do not call this. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1393 This is a completion table for file names, like `completion-file-name-table' |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1394 except that it passes the file name through `substitute-in-file-name'." |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1395 (cond |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1396 ((eq (car-safe action) 'boundaries) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1397 ;; For the boundaries, we can't really delegate to |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1398 ;; completion-file-name-table and then fix them up, because it |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1399 ;; would require us to track the relationship between `str' and |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1400 ;; `string', which is difficult. And in any case, if |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1401 ;; substitute-in-file-name turns "fo-$TO-ba" into "fo-o/b-ba", there's |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1402 ;; no way for us to return proper boundaries info, because the |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1403 ;; boundary is not (yet) in `string'. |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
1404 ;; FIXME: Actually there is a way to return correct boundaries info, |
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
1405 ;; at the condition of modifying the all-completions return accordingly. |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1406 (let ((start (length (file-name-directory string))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1407 (end (string-match-p "/" (cdr action)))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1408 (list* 'boundaries start end))) |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1409 |
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1410 (t |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1411 (let* ((default-directory |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1412 (if (stringp pred) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1413 ;; It used to be that `pred' was abused to pass `dir' |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1414 ;; as an argument. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1415 (prog1 (file-name-as-directory (expand-file-name pred)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1416 (setq pred nil)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1417 default-directory)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1418 (str (condition-case nil |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1419 (substitute-in-file-name string) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1420 (error string))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1421 (comp (completion-file-name-table |
108159
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1422 str |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1423 (with-no-warnings (or pred read-file-name-predicate)) |
56d11bda8235
Unify complete-symbol with completion-at-point.
Chong Yidong <cyd@stupidchicken.com>
parents:
107983
diff
changeset
|
1424 action))) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1425 |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1426 (cond |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1427 ((stringp comp) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1428 ;; Requote the $s before returning the completion. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1429 (minibuffer--double-dollars comp)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1430 ((and (null action) comp |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1431 ;; Requote the $s before checking for changes. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1432 (setq str (minibuffer--double-dollars str)) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1433 (not (string-equal string str))) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1434 ;; If there's no real completion, but substitute-in-file-name |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1435 ;; changed the string, then return the new string. |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1436 str) |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1437 (t comp)))))) |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1438 |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1439 (defalias 'read-file-name-internal |
94055
ec343c7600a2
(completion--embedded-envvar-table, read-file-name-internal):
Juanma Barranquero <lekktu@gmail.com>
parents:
94017
diff
changeset
|
1440 (completion-table-in-turn 'completion--embedded-envvar-table |
94077
28e2f73174d6
(completion-table-with-terminator): Those completions
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94069
diff
changeset
|
1441 'completion--file-name-table) |
94013
bd1b8b62427b
* minibuffer.el (complete-with-action, lazy-completion-table):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93945
diff
changeset
|
1442 "Internal subroutine for `read-file-name'. Do not call this.") |
93945
76ebfa5df8a2
* minibuffer.el (minibuffer--double-dollars, read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
93944
diff
changeset
|
1443 |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1444 (defvar read-file-name-function nil |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1445 "If this is non-nil, `read-file-name' does its work by calling this function.") |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1446 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1447 (defcustom read-file-name-completion-ignore-case |
97179
e99e1b5c726e
(read-file-name-completion-ignore-case): Add cygwin to the list.
Chong Yidong <cyd@stupidchicken.com>
parents:
97142
diff
changeset
|
1448 (if (memq system-type '(ms-dos windows-nt darwin cygwin)) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1449 t nil) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1450 "Non-nil means when reading a file name completion ignores case." |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1451 :group 'minibuffer |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1452 :type 'boolean |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1453 :version "22.1") |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1454 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1455 (defcustom insert-default-directory t |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1456 "Non-nil means when reading a filename start with default dir in minibuffer. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1457 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1458 When the initial minibuffer contents show a name of a file or a directory, |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1459 typing RETURN without editing the initial contents is equivalent to typing |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1460 the default file name. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1461 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1462 If this variable is non-nil, the minibuffer contents are always |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1463 initially non-empty, and typing RETURN without editing will fetch the |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1464 default name, if one is provided. Note however that this default name |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1465 is not necessarily the same as initial contents inserted in the minibuffer, |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1466 if the initial contents is just the default directory. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1467 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1468 If this variable is nil, the minibuffer often starts out empty. In |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1469 that case you may have to explicitly fetch the next history element to |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1470 request the default name; typing RETURN without editing will leave |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1471 the minibuffer empty. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1472 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1473 For some commands, exiting with an empty minibuffer has a special meaning, |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1474 such as making the current buffer visit no file in the case of |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1475 `set-visited-file-name'." |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1476 :group 'minibuffer |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1477 :type 'boolean) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1478 |
94315
755dd4bba830
(x-file-dialog): Declare as function.
Glenn Morris <rgm@gnu.org>
parents:
94304
diff
changeset
|
1479 ;; Not always defined, but only called if next-read-file-uses-dialog-p says so. |
755dd4bba830
(x-file-dialog): Declare as function.
Glenn Morris <rgm@gnu.org>
parents:
94304
diff
changeset
|
1480 (declare-function x-file-dialog "xfns.c" |
755dd4bba830
(x-file-dialog): Declare as function.
Glenn Morris <rgm@gnu.org>
parents:
94304
diff
changeset
|
1481 (prompt dir &optional default-filename mustmatch only-dir-p)) |
755dd4bba830
(x-file-dialog): Declare as function.
Glenn Morris <rgm@gnu.org>
parents:
94304
diff
changeset
|
1482 |
106239
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1483 (defun read-file-name-defaults (&optional dir initial) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1484 (let ((default |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1485 (cond |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1486 ;; With non-nil `initial', use `dir' as the first default. |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1487 ;; Essentially, this mean reversing the normal order of the |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1488 ;; current directory name and the current file name, i.e. |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1489 ;; 1. with normal file reading: |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1490 ;; 1.1. initial input is the current directory |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1491 ;; 1.2. the first default is the current file name |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1492 ;; 2. with non-nil `initial' (e.g. for `find-alternate-file'): |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1493 ;; 2.2. initial input is the current file name |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1494 ;; 2.1. the first default is the current directory |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1495 (initial (abbreviate-file-name dir)) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1496 ;; In file buffers, try to get the current file name |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1497 (buffer-file-name |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1498 (abbreviate-file-name buffer-file-name)))) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1499 (file-name-at-point |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1500 (run-hook-with-args-until-success 'file-name-at-point-functions))) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1501 (when file-name-at-point |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1502 (setq default (delete-dups |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1503 (delete "" (delq nil (list file-name-at-point default)))))) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1504 ;; Append new defaults to the end of existing `minibuffer-default'. |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1505 (append |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1506 (if (listp minibuffer-default) minibuffer-default (list minibuffer-default)) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1507 (if (listp default) default (list default))))) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1508 |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1509 (defun read-file-name (prompt &optional dir default-filename mustmatch initial predicate) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1510 "Read file name, prompting with PROMPT and completing in directory DIR. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1511 Value is not expanded---you must call `expand-file-name' yourself. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1512 Default name to DEFAULT-FILENAME if user exits the minibuffer with |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1513 the same non-empty string that was inserted by this function. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1514 (If DEFAULT-FILENAME is omitted, the visited file name is used, |
105930
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1515 except that if INITIAL is specified, that combined with DIR is used. |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1516 If DEFAULT-FILENAME is a list of file names, the first file name is used.) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1517 If the user exits with an empty minibuffer, this function returns |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1518 an empty string. (This can only happen if the user erased the |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1519 pre-inserted contents or if `insert-default-directory' is nil.) |
102601
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1520 |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1521 Fourth arg MUSTMATCH can take the following values: |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1522 - nil means that the user can exit with any input. |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1523 - t means that the user is not allowed to exit unless |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1524 the input is (or completes to) an existing file. |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1525 - `confirm' means that the user can exit with any input, but she needs |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1526 to confirm her choice if the input is not an existing file. |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1527 - `confirm-after-completion' means that the user can exit with any |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1528 input, but she needs to confirm her choice if she called |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1529 `minibuffer-complete' right before `minibuffer-complete-and-exit' |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1530 and the input is not an existing file. |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1531 - anything else behaves like t except that typing RET does not exit if it |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1532 does non-null completion. |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1533 |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1534 Fifth arg INITIAL specifies text to start with. |
102601
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1535 |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1536 If optional sixth arg PREDICATE is non-nil, possible completions and |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1537 the resulting file name must satisfy (funcall PREDICATE NAME). |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1538 DIR should be an absolute directory name. It defaults to the value of |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1539 `default-directory'. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1540 |
102601
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1541 If this command was invoked with the mouse, use a graphical file |
68c67342e3bf
(read-file-name): Doc fix.
Chong Yidong <cyd@stupidchicken.com>
parents:
102579
diff
changeset
|
1542 dialog if `use-dialog-box' is non-nil, and the window system or X |
105824
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1543 toolkit in use provides a file dialog box, and DIR is not a |
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1544 remote file. For graphical file dialogs, any the special values |
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1545 of MUSTMATCH; `confirm' and `confirm-after-completion' are |
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1546 treated as equivalent to nil. |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1547 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1548 See also `read-file-name-completion-ignore-case' |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1549 and `read-file-name-function'." |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1550 (unless dir (setq dir default-directory)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1551 (unless (file-name-absolute-p dir) (setq dir (expand-file-name dir))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1552 (unless default-filename |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1553 (setq default-filename (if initial (expand-file-name initial dir) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1554 buffer-file-name))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1555 ;; If dir starts with user's homedir, change that to ~. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1556 (setq dir (abbreviate-file-name dir)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1557 ;; Likewise for default-filename. |
94301
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1558 (if default-filename |
105930
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1559 (setq default-filename |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1560 (if (consp default-filename) |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1561 (mapcar 'abbreviate-file-name default-filename) |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1562 (abbreviate-file-name default-filename)))) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1563 (let ((insdef (cond |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1564 ((and insert-default-directory (stringp dir)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1565 (if initial |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1566 (cons (minibuffer--double-dollars (concat dir initial)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1567 (length (minibuffer--double-dollars dir))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1568 (minibuffer--double-dollars dir))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1569 (initial (cons (minibuffer--double-dollars initial) 0))))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1570 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1571 (if read-file-name-function |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1572 (funcall read-file-name-function |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1573 prompt dir default-filename mustmatch initial predicate) |
94301
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1574 (let ((completion-ignore-case read-file-name-completion-ignore-case) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1575 (minibuffer-completing-file-name t) |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1576 (pred (or predicate 'file-exists-p)) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1577 (add-to-history nil)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1578 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1579 (let* ((val |
105824
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1580 (if (or (not (next-read-file-uses-dialog-p)) |
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1581 ;; Graphical file dialogs can't handle remote |
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1582 ;; files (Bug#99). |
06f1348e3279
* minibuffer.el (read-file-name): Don't use file dialogs for
Chong Yidong <cyd@stupidchicken.com>
parents:
105763
diff
changeset
|
1583 (file-remote-p dir)) |
94301
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1584 ;; We used to pass `dir' to `read-file-name-internal' by |
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1585 ;; abusing the `predicate' argument. It's better to |
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1586 ;; just use `default-directory', but in order to avoid |
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1587 ;; changing `default-directory' in the current buffer, |
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1588 ;; we don't let-bind it. |
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1589 (lexical-let ((dir (file-name-as-directory |
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1590 (expand-file-name dir)))) |
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1591 (minibuffer-with-setup-hook |
106239
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1592 (lambda () |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1593 (setq default-directory dir) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1594 ;; When the first default in `minibuffer-default' |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1595 ;; duplicates initial input `insdef', |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1596 ;; reset `minibuffer-default' to nil. |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1597 (when (equal (or (car-safe insdef) insdef) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1598 (or (car-safe minibuffer-default) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1599 minibuffer-default)) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1600 (setq minibuffer-default |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1601 (cdr-safe minibuffer-default))) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1602 ;; On the first request on `M-n' fill |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1603 ;; `minibuffer-default' with a list of defaults |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1604 ;; relevant for file-name reading. |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1605 (set (make-local-variable 'minibuffer-default-add-function) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1606 (lambda () |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1607 (with-current-buffer |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1608 (window-buffer (minibuffer-selected-window)) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
1609 (read-file-name-defaults dir initial))))) |
94301
9060af7294b9
(read-file-name): Don't let-bind default-directory.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94300
diff
changeset
|
1610 (completing-read prompt 'read-file-name-internal |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1611 pred mustmatch insdef |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1612 'file-name-history default-filename))) |
102455
03ed2dba14f6
(read-file-name): Only split dir name when
Jason Rumney <jasonr@gnu.org>
parents:
101999
diff
changeset
|
1613 ;; If DEFAULT-FILENAME not supplied and DIR contains |
03ed2dba14f6
(read-file-name): Only split dir name when
Jason Rumney <jasonr@gnu.org>
parents:
101999
diff
changeset
|
1614 ;; a file name, split it. |
104122
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1615 (let ((file (file-name-nondirectory dir)) |
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1616 ;; When using a dialog, revert to nil and non-nil |
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1617 ;; interpretation of mustmatch. confirm options |
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1618 ;; need to be interpreted as nil, otherwise |
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1619 ;; it is impossible to create new files using |
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1620 ;; dialogs with the default settings. |
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1621 (dialog-mustmatch |
105697
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1622 (not (memq mustmatch |
136cf2d23c90
* minibuffer.el (completion-table-with-terminator): Properly implement
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105664
diff
changeset
|
1623 '(nil confirm confirm-after-completion))))) |
102455
03ed2dba14f6
(read-file-name): Only split dir name when
Jason Rumney <jasonr@gnu.org>
parents:
101999
diff
changeset
|
1624 (when (and (not default-filename) |
03ed2dba14f6
(read-file-name): Only split dir name when
Jason Rumney <jasonr@gnu.org>
parents:
101999
diff
changeset
|
1625 (not (zerop (length file)))) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1626 (setq default-filename file) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1627 (setq dir (file-name-directory dir))) |
105930
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1628 (when default-filename |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1629 (setq default-filename |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1630 (expand-file-name (if (consp default-filename) |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1631 (car default-filename) |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1632 default-filename) |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1633 dir))) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1634 (setq add-to-history t) |
104122
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1635 (x-file-dialog prompt dir default-filename |
9fb3df55079f
(read-file-name): Treat confirm options to
Jason Rumney <jasonr@gnu.org>
parents:
102958
diff
changeset
|
1636 dialog-mustmatch |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1637 (eq predicate 'file-directory-p))))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1638 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1639 (replace-in-history (eq (car-safe file-name-history) val))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1640 ;; If completing-read returned the inserted default string itself |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1641 ;; (rather than a new string with the same contents), |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1642 ;; it has to mean that the user typed RET with the minibuffer empty. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1643 ;; In that case, we really want to return "" |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1644 ;; so that commands such as set-visited-file-name can distinguish. |
105930
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1645 (when (consp default-filename) |
45b3f4e55e6e
(read-file-name): Support a list of default values
Juri Linkov <juri@jurta.org>
parents:
105824
diff
changeset
|
1646 (setq default-filename (car default-filename))) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1647 (when (eq val default-filename) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1648 ;; In this case, completing-read has not added an element |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1649 ;; to the history. Maybe we should. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1650 (if (not replace-in-history) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1651 (setq add-to-history t)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1652 (setq val "")) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1653 (unless val (error "No file name specified")) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1654 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1655 (if (and default-filename |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1656 (string-equal val (if (consp insdef) (car insdef) insdef))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1657 (setq val default-filename)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1658 (setq val (substitute-in-file-name val)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1659 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1660 (if replace-in-history |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1661 ;; Replace what Fcompleting_read added to the history |
105664
6a6fcf3e8e4d
* minibuffer.el (read-file-name): Check for repeat before putting
Chong Yidong <cyd@stupidchicken.com>
parents:
105601
diff
changeset
|
1662 ;; with what we will actually return. As an exception, |
6a6fcf3e8e4d
* minibuffer.el (read-file-name): Check for repeat before putting
Chong Yidong <cyd@stupidchicken.com>
parents:
105601
diff
changeset
|
1663 ;; if that's the same as the second item in |
6a6fcf3e8e4d
* minibuffer.el (read-file-name): Check for repeat before putting
Chong Yidong <cyd@stupidchicken.com>
parents:
105601
diff
changeset
|
1664 ;; file-name-history, it's really a repeat (Bug#4657). |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1665 (let ((val1 (minibuffer--double-dollars val))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1666 (if history-delete-duplicates |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1667 (setcdr file-name-history |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1668 (delete val1 (cdr file-name-history)))) |
105664
6a6fcf3e8e4d
* minibuffer.el (read-file-name): Check for repeat before putting
Chong Yidong <cyd@stupidchicken.com>
parents:
105601
diff
changeset
|
1669 (if (string= val1 (cadr file-name-history)) |
6a6fcf3e8e4d
* minibuffer.el (read-file-name): Check for repeat before putting
Chong Yidong <cyd@stupidchicken.com>
parents:
105601
diff
changeset
|
1670 (pop file-name-history) |
6a6fcf3e8e4d
* minibuffer.el (read-file-name): Check for repeat before putting
Chong Yidong <cyd@stupidchicken.com>
parents:
105601
diff
changeset
|
1671 (setcar file-name-history val1))) |
94300
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1672 (if add-to-history |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1673 ;; Add the value to the history--but not if it matches |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1674 ;; the last value already there. |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1675 (let ((val1 (minibuffer--double-dollars val))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1676 (unless (and (consp file-name-history) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1677 (equal (car file-name-history) val1)) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1678 (setq file-name-history |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1679 (cons val1 |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1680 (if history-delete-duplicates |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1681 (delete val1 file-name-history) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1682 file-name-history))))))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1683 val))))) |
b47239d57d36
* lisp/minibuffer.el (read-file-name-function, read-file-name-predicate)
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94247
diff
changeset
|
1684 |
94247
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1685 (defun internal-complete-buffer-except (&optional buffer) |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1686 "Perform completion on all buffers excluding BUFFER. |
101999
efada72951fb
* minibuffer.el (internal-complete-buffer-except): Doc fix. (Bug#2315)
Juanma Barranquero <lekktu@gmail.com>
parents:
101327
diff
changeset
|
1687 BUFFER nil or omitted means use the current buffer. |
94247
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1688 Like `internal-complete-buffer', but removes BUFFER from the completion list." |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1689 (lexical-let ((except (if (stringp buffer) buffer (buffer-name buffer)))) |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1690 (apply-partially 'completion-table-with-predicate |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1691 'internal-complete-buffer |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1692 (lambda (name) |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1693 (not (equal (if (consp name) (car name) name) except))) |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1694 nil))) |
57c8f6a6456a
(internal-complete-buffer-except): New function.
Juri Linkov <juri@jurta.org>
parents:
94242
diff
changeset
|
1695 |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1696 ;;; Old-style completion, used in Emacs-21 and Emacs-22. |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1697 |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1698 (defun completion-emacs21-try-completion (string table pred point) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1699 (let ((completion (try-completion string table pred))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1700 (if (stringp completion) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1701 (cons completion (length completion)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1702 completion))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1703 |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1704 (defun completion-emacs21-all-completions (string table pred point) |
94464
66b02cd7b956
* minibuffer.el (completion-common-substring): Mark obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94427
diff
changeset
|
1705 (completion-hilit-commonality |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1706 (all-completions string table pred) |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1707 (length string) |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1708 (car (completion-boundaries string table pred "")))) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1709 |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1710 (defun completion-emacs22-try-completion (string table pred point) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1711 (let ((suffix (substring string point)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1712 (completion (try-completion (substring string 0 point) table pred))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1713 (if (not (stringp completion)) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1714 completion |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1715 ;; Merge a trailing / in completion with a / after point. |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1716 ;; We used to only do it for word completion, but it seems to make |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1717 ;; sense for all completions. |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1718 ;; Actually, claiming this feature was part of Emacs-22 completion |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1719 ;; is pushing it a bit: it was only done in minibuffer-completion-word, |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1720 ;; which was (by default) not bound during file completion, where such |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1721 ;; slashes are most likely to occur. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1722 (if (and (not (zerop (length completion))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1723 (eq ?/ (aref completion (1- (length completion)))) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1724 (not (zerop (length suffix))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1725 (eq ?/ (aref suffix 0))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1726 ;; This leaves point after the / . |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1727 (setq suffix (substring suffix 1))) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1728 (cons (concat completion suffix) (length completion))))) |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1729 |
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1730 (defun completion-emacs22-all-completions (string table pred point) |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1731 (let ((beforepoint (substring string 0 point))) |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1732 (completion-hilit-commonality |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1733 (all-completions beforepoint table pred) |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1734 point |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1735 (car (completion-boundaries beforepoint table pred ""))))) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1736 |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1737 ;;; Basic completion. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1738 |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1739 (defun completion--merge-suffix (completion point suffix) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1740 "Merge end of COMPLETION with beginning of SUFFIX. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1741 Simple generalization of the \"merge trailing /\" done in Emacs-22. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1742 Return the new suffix." |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1743 (if (and (not (zerop (length suffix))) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1744 (string-match "\\(.+\\)\n\\1" (concat completion "\n" suffix) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1745 ;; Make sure we don't compress things to less |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1746 ;; than we started with. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1747 point) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1748 ;; Just make sure we didn't match some other \n. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1749 (eq (match-end 1) (length completion))) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1750 (substring suffix (- (match-end 1) (match-beginning 1))) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1751 ;; Nothing to merge. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1752 suffix)) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1753 |
107461
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1754 (defun completion-basic--pattern (beforepoint afterpoint bounds) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1755 (delete |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1756 "" (list (substring beforepoint (car bounds)) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1757 'point |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1758 (substring afterpoint 0 (cdr bounds))))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1759 |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1760 (defun completion-basic-try-completion (string table pred point) |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1761 (let* ((beforepoint (substring string 0 point)) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1762 (afterpoint (substring string point)) |
96294
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1763 (bounds (completion-boundaries beforepoint table pred afterpoint))) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1764 (if (zerop (cdr bounds)) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1765 ;; `try-completion' may return a subtly different result |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1766 ;; than `all+merge', so try to use it whenever possible. |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1767 (let ((completion (try-completion beforepoint table pred))) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1768 (if (not (stringp completion)) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1769 completion |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1770 (cons |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1771 (concat completion |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1772 (completion--merge-suffix completion point afterpoint)) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1773 (length completion)))) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1774 (let* ((suffix (substring afterpoint (cdr bounds))) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1775 (prefix (substring beforepoint 0 (car bounds))) |
107461
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1776 (pattern (completion-basic--pattern |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1777 beforepoint afterpoint bounds)) |
96294
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1778 (all (completion-pcm--all-completions prefix pattern table pred))) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1779 (if minibuffer-completing-file-name |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1780 (setq all (completion-pcm--filename-try-filter all))) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1781 (completion-pcm--merge-try pattern all prefix suffix))))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1782 |
96294
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1783 (defun completion-basic-all-completions (string table pred point) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1784 (let* ((beforepoint (substring string 0 point)) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1785 (afterpoint (substring string point)) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1786 (bounds (completion-boundaries beforepoint table pred afterpoint)) |
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1787 (prefix (substring beforepoint 0 (car bounds))) |
107461
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
1788 (pattern (completion-basic--pattern beforepoint afterpoint bounds)) |
96294
f12e581d977f
(completion-basic-try-completion): Use the text after
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95799
diff
changeset
|
1789 (all (completion-pcm--all-completions prefix pattern table pred))) |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1790 (completion-hilit-commonality all point (car bounds)))) |
94304
bc48ced5cf89
(completion-try-completion): Add `point' argument. Change return value.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94301
diff
changeset
|
1791 |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1792 ;;; Partial-completion-mode style completion. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1793 |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1794 (defvar completion-pcm--delim-wild-regex nil |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1795 "Regular expression matching delimiters controlling the partial-completion. |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1796 Typically, this regular expression simply matches a delimiter, meaning |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1797 that completion can add something at (match-beginning 0), but if it has |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1798 a submatch 1, then completion can add something at (match-end 1). |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1799 This is used when the delimiter needs to be of size zero (e.g. the transition |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1800 from lowercase to uppercase characters).") |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1801 |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1802 (defun completion-pcm--prepare-delim-re (delims) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1803 (setq completion-pcm--delim-wild-regex (concat "[" delims "*]"))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1804 |
106453
eaa5eba6d613
(minibuffer-complete-and-exit): Don't replace the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106452
diff
changeset
|
1805 (defcustom completion-pcm-word-delimiters "-_./: " |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1806 "A string of characters treated as word delimiters for completion. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1807 Some arcane rules: |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1808 If `]' is in this string, it must come first. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1809 If `^' is in this string, it must not come first. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1810 If `-' is in this string, it must come first or right after `]'. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1811 In other words, if S is this string, then `[S]' must be a valid Emacs regular |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1812 expression (not containing character ranges like `a-z')." |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1813 :set (lambda (symbol value) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1814 (set-default symbol value) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1815 ;; Refresh other vars. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1816 (completion-pcm--prepare-delim-re value)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1817 :initialize 'custom-initialize-reset |
94375
f8b940834bbb
(completion-pcm-word-delimiters): Add :group.
Juanma Barranquero <lekktu@gmail.com>
parents:
94352
diff
changeset
|
1818 :group 'minibuffer |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1819 :type 'string) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1820 |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1821 (defcustom completion-pcm-complete-word-inserts-delimiters nil |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1822 "Treat the SPC or - inserted by `minibuffer-complete-word' as delimiters. |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1823 Those chars are treated as delimiters iff this variable is non-nil. |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1824 I.e. if non-nil, M-x SPC will just insert a \"-\" in the minibuffer, whereas |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1825 if nil, it will list all possible commands in *Completions* because none of |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1826 the commands start with a \"-\" or a SPC." |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1827 :type 'boolean) |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1828 |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1829 (defun completion-pcm--pattern-trivial-p (pattern) |
100929
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1830 (and (stringp (car pattern)) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1831 ;; It can be followed by `point' and "" and still be trivial. |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1832 (let ((trivial t)) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1833 (dolist (elem (cdr pattern)) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1834 (unless (member elem '(point "")) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1835 (setq trivial nil))) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1836 trivial))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1837 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1838 (defun completion-pcm--string->pattern (string &optional point) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1839 "Split STRING into a pattern. |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1840 A pattern is a list where each element is either a string |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1841 or a symbol chosen among `any', `star', `point', `prefix'." |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1842 (if (and point (< point (length string))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1843 (let ((prefix (substring string 0 point)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1844 (suffix (substring string point))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1845 (append (completion-pcm--string->pattern prefix) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1846 '(point) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1847 (completion-pcm--string->pattern suffix))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1848 (let ((pattern nil) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1849 (p 0) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1850 (p0 0)) |
94375
f8b940834bbb
(completion-pcm-word-delimiters): Add :group.
Juanma Barranquero <lekktu@gmail.com>
parents:
94352
diff
changeset
|
1851 |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1852 (while (and (setq p (string-match completion-pcm--delim-wild-regex |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1853 string p)) |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1854 (or completion-pcm-complete-word-inserts-delimiters |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1855 ;; If the char was added by minibuffer-complete-word, |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1856 ;; then don't treat it as a delimiter, otherwise |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1857 ;; "M-x SPC" ends up inserting a "-" rather than listing |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1858 ;; all completions. |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1859 (not (get-text-property p 'completion-try-word string)))) |
104344
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1860 ;; Usually, completion-pcm--delim-wild-regex matches a delimiter, |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1861 ;; meaning that something can be added *before* it, but it can also |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1862 ;; match a prefix and postfix, in which case something can be added |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1863 ;; in-between (e.g. match [[:lower:]][[:upper:]]). |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1864 ;; This is determined by the presence of a submatch-1 which delimits |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1865 ;; the prefix. |
ffa2f09da5b2
(minibuffer-hide-completions): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104342
diff
changeset
|
1866 (if (match-end 1) (setq p (match-end 1))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1867 (push (substring string p0 p) pattern) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1868 (if (eq (aref string p) ?*) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1869 (progn |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1870 (push 'star pattern) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1871 (setq p0 (1+ p))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1872 (push 'any pattern) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1873 (setq p0 p)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1874 (incf p)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1875 |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1876 ;; An empty string might be erroneously added at the beginning. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1877 ;; It should be avoided properly, but it's so easy to remove it here. |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1878 (delete "" (nreverse (cons (substring string p0) pattern)))))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1879 |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1880 (defun completion-pcm--pattern->regex (pattern &optional group) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1881 (let ((re |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1882 (concat "\\`" |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1883 (mapconcat |
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1884 (lambda (x) |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1885 (cond |
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
1886 ((stringp x) (regexp-quote x)) |
108486
7b8ec1ad0223
* minibuffer.el (completion-pcm--pattern->regex): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108378
diff
changeset
|
1887 ((if (consp group) (memq x group) group) "\\(.*?\\)") |
7b8ec1ad0223
* minibuffer.el (completion-pcm--pattern->regex): Fix last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108378
diff
changeset
|
1888 (t ".*?"))) |
104719
8f0f04f98654
(minibuffer-message): If the current buffer is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104344
diff
changeset
|
1889 pattern |
97966
52f84cb577bb
(completion-pcm--pattern->regex): Undo last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
97934
diff
changeset
|
1890 "")))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1891 ;; Avoid pathological backtracking. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1892 (while (string-match "\\.\\*\\?\\(?:\\\\[()]\\)*\\(\\.\\*\\?\\)" re) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1893 (setq re (replace-match "" t t re 1))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1894 re)) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1895 |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1896 (defun completion-pcm--all-completions (prefix pattern table pred) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1897 "Find all completions for PATTERN in TABLE obeying PRED. |
94375
f8b940834bbb
(completion-pcm-word-delimiters): Add :group.
Juanma Barranquero <lekktu@gmail.com>
parents:
94352
diff
changeset
|
1898 PATTERN is as returned by `completion-pcm--string->pattern'." |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1899 ;; (assert (= (car (completion-boundaries prefix table pred "")) |
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1900 ;; (length prefix))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1901 ;; Find an initial list of possible completions. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1902 (if (completion-pcm--pattern-trivial-p pattern) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1903 |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1904 ;; Minibuffer contains no delimiters -- simple case! |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1905 (all-completions (concat prefix (car pattern)) table pred) |
94375
f8b940834bbb
(completion-pcm-word-delimiters): Add :group.
Juanma Barranquero <lekktu@gmail.com>
parents:
94352
diff
changeset
|
1906 |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1907 ;; Use all-completions to do an initial cull. This is a big win, |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1908 ;; since all-completions is written in C! |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1909 (let* (;; Convert search pattern to a standard regular expression. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1910 (regex (completion-pcm--pattern->regex pattern)) |
97966
52f84cb577bb
(completion-pcm--pattern->regex): Undo last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
97934
diff
changeset
|
1911 (case-fold-search completion-ignore-case) |
52f84cb577bb
(completion-pcm--pattern->regex): Undo last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
97934
diff
changeset
|
1912 (completion-regexp-list (cons regex completion-regexp-list)) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1913 (compl (all-completions |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1914 (concat prefix (if (stringp (car pattern)) (car pattern) "")) |
100623
5a144164af93
(completion-all-completions-with-base-size): Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100052
diff
changeset
|
1915 table pred))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1916 (if (not (functionp table)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1917 ;; The internal functions already obeyed completion-regexp-list. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1918 compl |
97966
52f84cb577bb
(completion-pcm--pattern->regex): Undo last change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
97934
diff
changeset
|
1919 (let ((poss ())) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1920 (dolist (c compl) |
101162
64a6da0f9aa2
* minibuffer.el (minibuffer-message): Fix regexp so it doesn't exclude
Juanma Barranquero <lekktu@gmail.com>
parents:
101010
diff
changeset
|
1921 (when (string-match-p regex c) (push c poss))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1922 poss))))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
1923 |
94465
e2562e0fe05e
(completion-hilit-commonality): Remove leftover code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94464
diff
changeset
|
1924 (defun completion-pcm--hilit-commonality (pattern completions) |
e2562e0fe05e
(completion-hilit-commonality): Remove leftover code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94464
diff
changeset
|
1925 (when completions |
e2562e0fe05e
(completion-hilit-commonality): Remove leftover code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94464
diff
changeset
|
1926 (let* ((re (completion-pcm--pattern->regex pattern '(point))) |
100929
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1927 (case-fold-search completion-ignore-case)) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1928 (mapcar |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1929 (lambda (str) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1930 ;; Don't modify the string itself. |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1931 (setq str (copy-sequence str)) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1932 (unless (string-match re str) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1933 (error "Internal error: %s does not match %s" re str)) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1934 (let ((pos (or (match-beginning 1) (match-end 0)))) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1935 (put-text-property 0 pos |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1936 'font-lock-face 'completions-common-part |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1937 str) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1938 (if (> (length str) pos) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1939 (put-text-property pos (1+ pos) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1940 'font-lock-face 'completions-first-difference |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1941 str))) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1942 str) |
2677429036c3
(completion-hilit-commonality): Don't presume
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
100908
diff
changeset
|
1943 completions)))) |
94465
e2562e0fe05e
(completion-hilit-commonality): Remove leftover code.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94464
diff
changeset
|
1944 |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1945 (defun completion-pcm--find-all-completions (string table pred point |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1946 &optional filter) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1947 "Find all completions for STRING at POINT in TABLE, satisfying PRED. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1948 POINT is a position inside STRING. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1949 FILTER is a function applied to the return value, that can be used, e.g. to |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1950 filter out additional entries (because TABLE migth not obey PRED)." |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1951 (unless filter (setq filter 'identity)) |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1952 (let* ((beforepoint (substring string 0 point)) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1953 (afterpoint (substring string point)) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1954 (bounds (completion-boundaries beforepoint table pred afterpoint)) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1955 (prefix (substring beforepoint 0 (car bounds))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1956 (suffix (substring afterpoint (cdr bounds))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1957 firsterror) |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1958 (setq string (substring string (car bounds) (+ point (cdr bounds)))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1959 (let* ((relpoint (- point (car bounds))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1960 (pattern (completion-pcm--string->pattern string relpoint)) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1961 (all (condition-case err |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1962 (funcall filter |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1963 (completion-pcm--all-completions |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1964 prefix pattern table pred)) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1965 (error (unless firsterror (setq firsterror err)) nil)))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1966 (when (and (null all) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1967 (> (car bounds) 0) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1968 (null (ignore-errors (try-completion prefix table pred)))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1969 ;; The prefix has no completions at all, so we should try and fix |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1970 ;; that first. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1971 (let ((substring (substring prefix 0 -1))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1972 (destructuring-bind (subpat suball subprefix subsuffix) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1973 (completion-pcm--find-all-completions |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
1974 substring table pred (length substring) filter) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1975 (let ((sep (aref prefix (1- (length prefix)))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1976 ;; Text that goes between the new submatches and the |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1977 ;; completion substring. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1978 (between nil)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1979 ;; Eliminate submatches that don't end with the separator. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1980 (dolist (submatch (prog1 suball (setq suball ()))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1981 (when (eq sep (aref submatch (1- (length submatch)))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1982 (push submatch suball))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1983 (when suball |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1984 ;; Update the boundaries and corresponding pattern. |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1985 ;; We assume that all submatches result in the same boundaries |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1986 ;; since we wouldn't know how to merge them otherwise anyway. |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1987 ;; FIXME: COMPLETE REWRITE!!! |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1988 (let* ((newbeforepoint |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1989 (concat subprefix (car suball) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1990 (substring string 0 relpoint))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1991 (leftbound (+ (length subprefix) (length (car suball)))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1992 (newbounds (completion-boundaries |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1993 newbeforepoint table pred afterpoint))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1994 (unless (or (and (eq (cdr bounds) (cdr newbounds)) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1995 (eq (car newbounds) leftbound)) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1996 ;; Refuse new boundaries if they step over |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1997 ;; the submatch. |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
1998 (< (car newbounds) leftbound)) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
1999 ;; The new completed prefix does change the boundaries |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2000 ;; of the completed substring. |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2001 (setq suffix (substring afterpoint (cdr newbounds))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2002 (setq string |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2003 (concat (substring newbeforepoint (car newbounds)) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2004 (substring afterpoint 0 (cdr newbounds)))) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2005 (setq between (substring newbeforepoint leftbound |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2006 (car newbounds))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2007 (setq pattern (completion-pcm--string->pattern |
95228
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2008 string |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2009 (- (length newbeforepoint) |
451f4028c096
* minibuffer.el (completion-boundaries): Change calling convention, so
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95192
diff
changeset
|
2010 (car newbounds))))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2011 (dolist (submatch suball) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2012 (setq all (nconc (mapcar |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2013 (lambda (s) (concat submatch between s)) |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2014 (funcall filter |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2015 (completion-pcm--all-completions |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2016 (concat subprefix submatch between) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2017 pattern table pred))) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2018 all))) |
95192
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2019 ;; FIXME: This can come in handy for try-completion, |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2020 ;; but isn't right for all-completions, since it lists |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2021 ;; invalid completions. |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2022 ;; (unless all |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2023 ;; ;; Even though we found expansions in the prefix, none |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2024 ;; ;; leads to a valid completion. |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2025 ;; ;; Let's keep the expansions, tho. |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2026 ;; (dolist (submatch suball) |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2027 ;; (push (concat submatch between newsubstring) all))) |
042486c3318c
(completion-pcm--find-all-completions): Don't add pseudo-completions.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95172
diff
changeset
|
2028 )) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2029 (setq pattern (append subpat (list 'any (string sep)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2030 (if between (list between)) pattern)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2031 (setq prefix subprefix))))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2032 (if (and (null all) firsterror) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2033 (signal (car firsterror) (cdr firsterror)) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2034 (list pattern all prefix suffix))))) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2035 |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2036 (defun completion-pcm-all-completions (string table pred point) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2037 (destructuring-bind (pattern all &optional prefix suffix) |
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2038 (completion-pcm--find-all-completions string table pred point) |
95394
119c6508d4f8
(completion-pcm-all-completions): Add the base-size.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95228
diff
changeset
|
2039 (when all |
119c6508d4f8
(completion-pcm-all-completions): Add the base-size.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95228
diff
changeset
|
2040 (nconc (completion-pcm--hilit-commonality pattern all) |
119c6508d4f8
(completion-pcm-all-completions): Add the base-size.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95228
diff
changeset
|
2041 (length prefix))))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2042 |
108251
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2043 (defun completion--sreverse (str) |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2044 "Like `reverse' but for a string STR rather than a list." |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2045 (apply 'string (nreverse (mapcar 'identity str)))) |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2046 |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2047 (defun completion--common-suffix (strs) |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2048 "Return the common suffix of the strings STRS." |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2049 (completion--sreverse |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2050 (try-completion |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2051 "" |
108296
d46fdf06e110
* files.el (auto-save-mode): Move to simple.el to fix bootstrap.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108281
diff
changeset
|
2052 (mapcar 'completion--sreverse strs)))) |
108251
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2053 |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2054 (defun completion-pcm--merge-completions (strs pattern) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2055 "Extract the commonality in STRS, with the help of PATTERN." |
105597
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2056 ;; When completing while ignoring case, we want to try and avoid |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2057 ;; completing "fo" to "foO" when completing against "FOO" (bug#4219). |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2058 ;; So we try and make sure that the string we return is all made up |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2059 ;; of text from the completions rather than part from the |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2060 ;; completions and part from the input. |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2061 ;; FIXME: This reduces the problems of inconsistent capitalization |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2062 ;; but it doesn't fully fix it: we may still end up completing |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2063 ;; "fo-ba" to "foo-BAR" or "FOO-bar" when completing against |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2064 ;; '("foo-barr" "FOO-BARD"). |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2065 (cond |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2066 ((null (cdr strs)) (list (car strs))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2067 (t |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2068 (let ((re (completion-pcm--pattern->regex pattern 'group)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2069 (ccs ())) ;Chopped completions. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2070 |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2071 ;; First chop each string into the parts corresponding to each |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2072 ;; non-constant element of `pattern', using regexp-matching. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2073 (let ((case-fold-search completion-ignore-case)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2074 (dolist (str strs) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2075 (unless (string-match re str) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2076 (error "Internal error: %s doesn't match %s" str re)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2077 (let ((chopped ()) |
105597
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2078 (last 0) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2079 (i 1) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2080 next) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2081 (while (setq next (match-end i)) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2082 (push (substring str last next) chopped) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2083 (setq last next) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2084 (setq i (1+ i))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2085 ;; Add the text corresponding to the implicit trailing `any'. |
105597
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2086 (push (substring str last) chopped) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2087 (push (nreverse chopped) ccs)))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2088 |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2089 ;; Then for each of those non-constant elements, extract the |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2090 ;; commonality between them. |
105597
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2091 (let ((res ()) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2092 (fixed "")) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2093 ;; Make the implicit trailing `any' explicit. |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2094 (dolist (elem (append pattern '(any))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2095 (if (stringp elem) |
105597
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2096 (setq fixed (concat fixed elem)) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2097 (let ((comps ())) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2098 (dolist (cc (prog1 ccs (setq ccs nil))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2099 (push (car cc) comps) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2100 (push (cdr cc) ccs)) |
105597
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2101 ;; Might improve the likelihood to avoid choosing |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2102 ;; different capitalizations in different parts. |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2103 ;; In practice, it doesn't seem to make any difference. |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2104 (setq ccs (nreverse ccs)) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2105 (let* ((prefix (try-completion fixed comps)) |
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2106 (unique (or (and (eq prefix t) (setq prefix fixed)) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2107 (eq t (try-completion prefix comps))))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2108 (unless (equal prefix "") (push prefix res)) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2109 ;; If there's only one completion, `elem' is not useful |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2110 ;; any more: it can only match the empty string. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2111 ;; FIXME: in some cases, it may be necessary to turn an |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2112 ;; `any' into a `star' because the surrounding context has |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2113 ;; changed such that string->pattern wouldn't add an `any' |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2114 ;; here any more. |
108251
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2115 (unless unique |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2116 (push elem res) |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
2117 (when (memq elem '(star point prefix)) |
108251
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2118 ;; Extract common suffix additionally to common prefix. |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
2119 ;; Only do it for `point', `star', and `prefix' since for |
108251
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2120 ;; `any' it could lead to a merged completion that |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2121 ;; doesn't itself match the candidates. |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2122 (let ((suffix (completion--common-suffix comps))) |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2123 (assert (stringp suffix)) |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2124 (unless (equal suffix "") |
275d802c8570
Extract common suffix for * in partial-completion.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108179
diff
changeset
|
2125 (push suffix res))))) |
105597
117859152fa5
(completion-pcm--merge-completions): Make sure the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105589
diff
changeset
|
2126 (setq fixed ""))))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2127 ;; We return it in reverse order. |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2128 res))))) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2129 |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2130 (defun completion-pcm--pattern->string (pattern) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2131 (mapconcat (lambda (x) (cond |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2132 ((stringp x) x) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2133 ((eq x 'star) "*") |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
2134 (t ""))) ;any, point, prefix. |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2135 pattern |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2136 "")) |
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2137 |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2138 ;; We want to provide the functionality of `try', but we use `all' |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2139 ;; and then merge it. In most cases, this works perfectly, but |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2140 ;; if the completion table doesn't consider the same completions in |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2141 ;; `try' as in `all', then we have a problem. The most common such |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2142 ;; case is for filename completion where completion-ignored-extensions |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2143 ;; is only obeyed by the `try' code. We paper over the difference |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2144 ;; here. Note that it is not quite right either: if the completion |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2145 ;; table uses completion-table-in-turn, this filtering may take place |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2146 ;; too late to correctly fallback from the first to the |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2147 ;; second alternative. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2148 (defun completion-pcm--filename-try-filter (all) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2149 "Filter to adjust `all' file completion to the behavior of `try'." |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2150 (when all |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2151 (let ((try ()) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2152 (re (concat "\\(?:\\`\\.\\.?/\\|" |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2153 (regexp-opt completion-ignored-extensions) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2154 "\\)\\'"))) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2155 (dolist (f all) |
101162
64a6da0f9aa2
* minibuffer.el (minibuffer-message): Fix regexp so it doesn't exclude
Juanma Barranquero <lekktu@gmail.com>
parents:
101010
diff
changeset
|
2156 (unless (string-match-p re f) (push f try))) |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2157 (or try all)))) |
101162
64a6da0f9aa2
* minibuffer.el (minibuffer-message): Fix regexp so it doesn't exclude
Juanma Barranquero <lekktu@gmail.com>
parents:
101010
diff
changeset
|
2158 |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2159 |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2160 (defun completion-pcm--merge-try (pattern all prefix suffix) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2161 (cond |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2162 ((not (consp all)) all) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2163 ((and (not (consp (cdr all))) ;Only one completion. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2164 ;; Ignore completion-ignore-case here. |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2165 (equal (completion-pcm--pattern->string pattern) (car all))) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2166 t) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2167 (t |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2168 (let* ((mergedpat (completion-pcm--merge-completions all pattern)) |
94486
ca90422b8114
(completion--do-completion): Move point even if the completion makes no change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94465
diff
changeset
|
2169 ;; `mergedpat' is in reverse order. Place new point (by |
ca90422b8114
(completion--do-completion): Move point even if the completion makes no change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94465
diff
changeset
|
2170 ;; order of preference) either at the old point, or at |
ca90422b8114
(completion--do-completion): Move point even if the completion makes no change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94465
diff
changeset
|
2171 ;; the last place where there's something to choose, or |
ca90422b8114
(completion--do-completion): Move point even if the completion makes no change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94465
diff
changeset
|
2172 ;; at the very end. |
106413
ab53cadac0b6
(completion-pcm--merge-try): Also consider placing point after a star, if
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106239
diff
changeset
|
2173 (pointpat (or (memq 'point mergedpat) |
ab53cadac0b6
(completion-pcm--merge-try): Also consider placing point after a star, if
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106239
diff
changeset
|
2174 (memq 'any mergedpat) |
ab53cadac0b6
(completion-pcm--merge-try): Also consider placing point after a star, if
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106239
diff
changeset
|
2175 (memq 'star mergedpat) |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
2176 ;; Not `prefix'. |
94487
432e68e359fa
(completion-pcm-try-completion): Typo.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94486
diff
changeset
|
2177 mergedpat)) |
94486
ca90422b8114
(completion--do-completion): Move point even if the completion makes no change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94465
diff
changeset
|
2178 ;; New pos from the start. |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2179 (newpos (length (completion-pcm--pattern->string pointpat))) |
94486
ca90422b8114
(completion--do-completion): Move point even if the completion makes no change.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94465
diff
changeset
|
2180 ;; Do it afterwards because it changes `pointpat' by sideeffect. |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2181 (merged (completion-pcm--pattern->string (nreverse mergedpat)))) |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2182 |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2183 (setq suffix (completion--merge-suffix merged newpos suffix)) |
95145
096cfec41046
(completion-boundaries): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94736
diff
changeset
|
2184 (cons (concat prefix merged suffix) (+ newpos (length prefix))))))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2185 |
95799
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2186 (defun completion-pcm-try-completion (string table pred point) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2187 (destructuring-bind (pattern all prefix suffix) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2188 (completion-pcm--find-all-completions |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2189 string table pred point |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2190 (if minibuffer-completing-file-name |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2191 'completion-pcm--filename-try-filter)) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2192 (completion-pcm--merge-try pattern all prefix suffix))) |
b0653ad2932d
(completion--merge-suffix): New function.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
95671
diff
changeset
|
2193 |
107461
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2194 ;;; Substring completion |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2195 ;; Mostly derived from the code of `basic' completion. |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2196 |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2197 (defun completion-substring--all-completions (string table pred point) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2198 (let* ((beforepoint (substring string 0 point)) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2199 (afterpoint (substring string point)) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2200 (bounds (completion-boundaries beforepoint table pred afterpoint)) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2201 (suffix (substring afterpoint (cdr bounds))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2202 (prefix (substring beforepoint 0 (car bounds))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2203 (basic-pattern (completion-basic--pattern |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2204 beforepoint afterpoint bounds)) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2205 (pattern (if (not (stringp (car basic-pattern))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2206 basic-pattern |
108378
addaf0e91db3
* minibuffer.el (completion-pcm-complete-word-inserts-delimiters):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108375
diff
changeset
|
2207 (cons 'prefix basic-pattern))) |
107461
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2208 (all (completion-pcm--all-completions prefix pattern table pred))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2209 (list all pattern prefix suffix (car bounds)))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2210 |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2211 (defun completion-substring-try-completion (string table pred point) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2212 (destructuring-bind (all pattern prefix suffix carbounds) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2213 (completion-substring--all-completions string table pred point) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2214 (if minibuffer-completing-file-name |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2215 (setq all (completion-pcm--filename-try-filter all))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2216 (completion-pcm--merge-try pattern all prefix suffix))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2217 |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2218 (defun completion-substring-all-completions (string table pred point) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2219 (destructuring-bind (all pattern prefix suffix carbounds) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2220 (completion-substring--all-completions string table pred point) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2221 (when all |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2222 (nconc (completion-pcm--hilit-commonality pattern all) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2223 (length prefix))))) |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2224 |
7cf379c501e1
Add a new completion style `substring'.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107250
diff
changeset
|
2225 ;; Initials completion |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2226 ;; Complete /ums to /usr/monnier/src or lch to list-command-history. |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2227 |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2228 (defun completion-initials-expand (str table pred) |
107089
d9f5c24a36cb
Make `initials' completion work for /hh -> /home/horn again (bug#5524).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106815
diff
changeset
|
2229 (let ((bounds (completion-boundaries str table pred ""))) |
d9f5c24a36cb
Make `initials' completion work for /hh -> /home/horn again (bug#5524).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106815
diff
changeset
|
2230 (unless (or (zerop (length str)) |
d9f5c24a36cb
Make `initials' completion work for /hh -> /home/horn again (bug#5524).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106815
diff
changeset
|
2231 ;; Only check within the boundaries, since the |
d9f5c24a36cb
Make `initials' completion work for /hh -> /home/horn again (bug#5524).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106815
diff
changeset
|
2232 ;; boundary char (e.g. /) might be in delim-regexp. |
d9f5c24a36cb
Make `initials' completion work for /hh -> /home/horn again (bug#5524).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106815
diff
changeset
|
2233 (string-match completion-pcm--delim-wild-regex str |
d9f5c24a36cb
Make `initials' completion work for /hh -> /home/horn again (bug#5524).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106815
diff
changeset
|
2234 (car bounds))) |
104785
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2235 (if (zerop (car bounds)) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2236 (mapconcat 'string str "-") |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2237 ;; If there's a boundary, it's trickier. The main use-case |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2238 ;; we consider here is file-name completion. We'd like |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2239 ;; to expand ~/eee to ~/e/e/e and /eee to /e/e/e. |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2240 ;; But at the same time, we don't want /usr/share/ae to expand |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2241 ;; to /usr/share/a/e just because we mistyped "ae" for "ar", |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2242 ;; so we probably don't want initials to touch anything that |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2243 ;; looks like /usr/share/foo. As a heuristic, we just check that |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2244 ;; the text before the boundary char is at most 1 char. |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2245 ;; This allows both ~/eee and /eee and not much more. |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2246 ;; FIXME: It sadly also disallows the use of ~/eee when that's |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2247 ;; embedded within something else (e.g. "(~/eee" in Info node |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2248 ;; completion or "ancestor:/eee" in bzr-revision completion). |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2249 (when (< (car bounds) 3) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2250 (let ((sep (substring str (1- (car bounds)) (car bounds)))) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2251 ;; FIXME: the above string-match checks the whole string, whereas |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2252 ;; we end up only caring about the after-boundary part. |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2253 (concat (substring str 0 (car bounds)) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2254 (mapconcat 'string (substring str (car bounds)) sep)))))))) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2255 |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2256 (defun completion-initials-all-completions (string table pred point) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2257 (let ((newstr (completion-initials-expand string table pred))) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2258 (when newstr |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2259 (completion-pcm-all-completions newstr table pred (length newstr))))) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2260 |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2261 (defun completion-initials-try-completion (string table pred point) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2262 (let ((newstr (completion-initials-expand string table pred))) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2263 (when newstr |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2264 (completion-pcm-try-completion newstr table pred (length newstr))))) |
7c703efbce29
(completion-try-completion, completion-all-completions):
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
104719
diff
changeset
|
2265 |
106239
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2266 |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2267 ;; Miscellaneous |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2268 |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2269 (defun minibuffer-insert-file-name-at-point () |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2270 "Get a file name at point in original buffer and insert it to minibuffer." |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2271 (interactive) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2272 (let ((file-name-at-point |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2273 (with-current-buffer (window-buffer (minibuffer-selected-window)) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2274 (run-hook-with-args-until-success 'file-name-at-point-functions)))) |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2275 (when file-name-at-point |
0ac473df1bd1
Provide additional default values (file name at point or at the
Juri Linkov <juri@jurta.org>
parents:
106132
diff
changeset
|
2276 (insert file-name-at-point)))) |
94352
add0e6cf4336
(completion-table-with-context): Fix `pred' for the
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
94315
diff
changeset
|
2277 |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
2278 (provide 'minibuffer) |
94144 | 2279 |
2280 ;; arch-tag: ef8a0a15-1080-4790-a754-04017c02f08f | |
93885
6c6216b3b878
* lisp/minibuffer.el: New file.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
diff
changeset
|
2281 ;;; minibuffer.el ends here |