Mercurial > emacs
annotate lisp/pcomplete.el @ 110410:f2e111723c3a
Merge changes made in Gnus trunk.
Reimplement nnimap, and do tweaks to the rest of the code to support that.
* gnus-int.el (gnus-finish-retrieve-group-infos)
(gnus-retrieve-group-data-early): New functions.
* gnus-range.el (gnus-range-nconcat): New function.
* gnus-start.el (gnus-get-unread-articles): Support early retrieval of
data.
(gnus-read-active-for-groups): Support finishing the early retrieval of
data.
* gnus-sum.el (gnus-summary-move-article): Pass the move-to group name
if the move is internal, so that nnimap can do fast internal moves.
* gnus.el (gnus-article-special-mark-lists): Add uid/active tuples, for
nnimap usage.
* nnimap.el: Rewritten.
* nnmail.el (nnmail-inhibit-default-split-group): New internal variable
to allow the mail splitting to not return a default group. This is
useful for nnimap, which will leave unmatched mail in the inbox.
* utf7.el (utf7-encode): Autoload.
Implement shell connection.
* nnimap.el (nnimap-open-shell-stream): New function.
(nnimap-open-connection): Use it.
Get the number of lines by using BODYSTRUCTURE.
(nnimap-transform-headers): Get the number of lines in each message.
(nnimap-retrieve-headers): Query for BODYSTRUCTURE so that we get the
number of lines.
Not all servers return UIDNEXT. Work past this problem.
Remove junk from end of file.
Fix typo in "bogus" section.
Make capabilties be case-insensitive.
Require cl when compiling.
Don't bug out if the LIST command doesn't have any parameters.
2010-09-17 Knut Anders Hatlen <kahatlen@gmail.com> (tiny change)
* nnimap.el (nnimap-get-groups): Don't bug out if the LIST command
doesn't have any parameters.
(mm-text-html-renderer): Document gnus-article-html.
2010-09-17 Julien Danjou <julien@danjou.info> (tiny fix)
* mm-decode.el (mm-text-html-renderer): Document gnus-article-html.
* dgnushack.el: Define netrc-credentials.
If the user doesn't have a /etc/services, supply some sensible port defaults.
Have `unseen-or-unread' select an unread unseen article first.
(nntp-open-server): Return whether the open was successful or not.
Throughout all files, replace (save-excursion (set-buffer ...)) with (with-current-buffer ... ).
Save result so that it doesn't say "failed" all the time.
Add ~/.authinfo to the default, since that's probably most useful for users.
Don't use the "finish" method when we're reading from the agent.
Add some more nnimap-relevant agent stuff to nnagent.el.
* nnimap.el (nnimap-with-process-buffer): Removed.
Revert one line that was changed by mistake in the last checkin.
(nnimap-open-connection): Don't error out when we can't make a connection
nnimap-related changes to avoid bugging out if we can't contact a server.
* gnus-start.el (gnus-get-unread-articles): Don't try to scan groups
from methods that are denied.
* nnimap.el (nnimap-possibly-change-group): Return nil if we can't log
in.
(nnimap-finish-retrieve-group-infos): Make sure we're not waiting for
nothing.
* gnus-sum.el (gnus-select-newsgroup): Indent.
author | Katsumi Yamaoka <yamaoka@jpl.org> |
---|---|
date | Sat, 18 Sep 2010 10:02:19 +0000 |
parents | d835100c3e8b |
children | 417b1e4d63cd |
rev | line source |
---|---|
38436
b174db545cfd
Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents:
35588
diff
changeset
|
1 ;;; pcomplete.el --- programmable completion |
29876 | 2 |
64762
41bb365f41c4
Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents:
64091
diff
changeset
|
3 ;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 |
106815 | 4 ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. |
29876 | 5 |
6 ;; Author: John Wiegley <johnw@gnu.org> | |
32502
de05ca05f4ff
(pcomplete) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents:
32451
diff
changeset
|
7 ;; Keywords: processes abbrev |
29876 | 8 |
9 ;; This file is part of GNU Emacs. | |
10 | |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
11 ;; GNU Emacs is free software: you can redistribute it and/or modify |
29876 | 12 ;; it under the terms of the GNU General Public License as published by |
94678
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
13 ;; the Free Software Foundation, either version 3 of the License, or |
ee5932bf781d
Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents:
93975
diff
changeset
|
14 ;; (at your option) any later version. |
29876 | 15 |
16 ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 ;; GNU General Public License for more details. | |
20 | |
21 ;; 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:
93975
diff
changeset
|
22 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
29876 | 23 |
24 ;;; Commentary: | |
25 | |
26 ;; This module provides a programmable completion facility using | |
27 ;; "completion functions". Each completion function is responsible | |
28 ;; for producing a list of possible completions relevant to the current | |
29 ;; argument position. | |
30 ;; | |
31 ;; To use pcomplete with shell-mode, for example, you will need the | |
32 ;; following in your .emacs file: | |
33 ;; | |
34 ;; (add-hook 'shell-mode-hook 'pcomplete-shell-setup) | |
35 ;; | |
36 ;; Most of the code below simply provides support mechanisms for | |
37 ;; writing completion functions. Completion functions themselves are | |
38 ;; very easy to write. They have few requirements beyond those of | |
39 ;; regular Lisp functions. | |
40 ;; | |
41 ;; Consider the following example, which will complete against | |
42 ;; filenames for the first two arguments, and directories for all | |
43 ;; remaining arguments: | |
44 ;; | |
45 ;; (defun pcomplete/my-command () | |
46 ;; (pcomplete-here (pcomplete-entries)) | |
47 ;; (pcomplete-here (pcomplete-entries)) | |
48 ;; (while (pcomplete-here (pcomplete-dirs)))) | |
49 ;; | |
50 ;; Here are the requirements for completion functions: | |
51 ;; | |
52 ;; @ They must be called "pcomplete/MAJOR-MODE/NAME", or | |
53 ;; "pcomplete/NAME". This is how they are looked up, using the NAME | |
54 ;; specified in the command argument (the argument in first | |
55 ;; position). | |
56 ;; | |
57 ;; @ They must be callable with no arguments. | |
58 ;; | |
59 ;; @ Their return value is ignored. If they actually return normally, | |
60 ;; it means no completions were available. | |
61 ;; | |
62 ;; @ In order to provide completions, they must throw the tag | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
63 ;; `pcomplete-completions'. The value must be a completion table |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
64 ;; (i.e. a table that can be passed to try-completion and friends) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
65 ;; for the final argument. |
29876 | 66 ;; |
67 ;; @ To simplify completion function logic, the tag `pcompleted' may | |
68 ;; be thrown with a value of nil in order to abort the function. It | |
69 ;; means that there were no completions available. | |
70 ;; | |
71 ;; When a completion function is called, the variable `pcomplete-args' | |
72 ;; is in scope, and contains all of the arguments specified on the | |
73 ;; command line. The variable `pcomplete-last' is the index of the | |
74 ;; last argument in that list. | |
75 ;; | |
76 ;; The variable `pcomplete-index' is used by the completion code to | |
77 ;; know which argument the completion function is currently examining. | |
78 ;; It always begins at 1, meaning the first argument after the command | |
79 ;; name. | |
80 ;; | |
81 ;; To facilitate writing completion logic, a special macro, | |
82 ;; `pcomplete-here', has been provided which does several things: | |
83 ;; | |
84 ;; 1. It will throw `pcompleted' (with a value of nil) whenever | |
85 ;; `pcomplete-index' exceeds `pcomplete-last'. | |
86 ;; | |
87 ;; 2. It will increment `pcomplete-index' if the final argument has | |
88 ;; not been reached yet. | |
89 ;; | |
90 ;; 3. It will evaluate the form passed to it, and throw the result | |
91 ;; using the `pcomplete-completions' tag, if it is called when | |
92 ;; `pcomplete-index' is pointing to the final argument. | |
93 ;; | |
94 ;; Sometimes a completion function will want to vary the possible | |
95 ;; completions for an argument based on the previous one. To | |
96 ;; facilitate tests like this, the function `pcomplete-test' and | |
97 ;; `pcomplete-match' are provided. Called with one argument, they | |
98 ;; test the value of the previous command argument. Otherwise, a | |
99 ;; relative index may be given as an optional second argument, where 0 | |
100 ;; refers to the current argument, 1 the previous, 2 the one before | |
101 ;; that, etc. The symbols `first' and `last' specify absolute | |
102 ;; offsets. | |
103 ;; | |
104 ;; Here is an example which will only complete against directories for | |
105 ;; the second argument if the first argument is also a directory: | |
106 ;; | |
107 ;; (defun pcomplete/example () | |
108 ;; (pcomplete-here (pcomplete-entries)) | |
109 ;; (if (pcomplete-test 'file-directory-p) | |
110 ;; (pcomplete-here (pcomplete-dirs)) | |
111 ;; (pcomplete-here (pcomplete-entries)))) | |
112 ;; | |
113 ;; For generating completion lists based on directory contents, see | |
114 ;; the functions `pcomplete-entries', `pcomplete-dirs', | |
115 ;; `pcomplete-executables' and `pcomplete-all-entries'. | |
116 ;; | |
117 ;; Consult the documentation for `pcomplete-here' for information | |
118 ;; about its other arguments. | |
119 | |
120 ;;; Code: | |
121 | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
122 (eval-when-compile (require 'cl)) |
29876 | 123 |
124 (defgroup pcomplete nil | |
125 "Programmable completion." | |
32502
de05ca05f4ff
(pcomplete) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents:
32451
diff
changeset
|
126 :version "21.1" |
29876 | 127 :group 'processes) |
128 | |
129 ;;; User Variables: | |
130 | |
131 (defcustom pcomplete-file-ignore nil | |
100171 | 132 "A regexp of filenames to be disregarded during file completion." |
35588 | 133 :type '(choice regexp (const :tag "None" nil)) |
29876 | 134 :group 'pcomplete) |
135 | |
136 (defcustom pcomplete-dir-ignore nil | |
100171 | 137 "A regexp of names to be disregarded during directory completion." |
35588 | 138 :type '(choice regexp (const :tag "None" nil)) |
29876 | 139 :group 'pcomplete) |
140 | |
49549
99be3a1e2589
Cygwin support patch.
Juanma Barranquero <lekktu@gmail.com>
parents:
49131
diff
changeset
|
141 (defcustom pcomplete-ignore-case (memq system-type '(ms-dos windows-nt cygwin)) |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
142 ;; FIXME: the doc mentions file-name completion, but the code |
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
143 ;; seems to apply it to all completions. |
100171 | 144 "If non-nil, ignore case when doing filename completion." |
29876 | 145 :type 'boolean |
146 :group 'pcomplete) | |
147 | |
148 (defcustom pcomplete-autolist nil | |
100171 | 149 "If non-nil, automatically list possibilities on partial completion. |
29876 | 150 This mirrors the optional behavior of tcsh." |
151 :type 'boolean | |
152 :group 'pcomplete) | |
153 | |
57745
d1fa1cbd6c4d
(pcomplete-entries): Don't use directory-sep-char.
Richard M. Stallman <rms@gnu.org>
parents:
57701
diff
changeset
|
154 (defcustom pcomplete-suffix-list (list ?/ ?:) |
100171 | 155 "A list of characters which constitute a proper suffix." |
29876 | 156 :type '(repeat character) |
157 :group 'pcomplete) | |
158 | |
159 (defcustom pcomplete-recexact nil | |
100171 | 160 "If non-nil, use shortest completion if characters cannot be added. |
29876 | 161 This mirrors the optional behavior of tcsh. |
162 | |
163 A non-nil value is useful if `pcomplete-autolist' is non-nil too." | |
164 :type 'boolean | |
165 :group 'pcomplete) | |
166 | |
167 (defcustom pcomplete-arg-quote-list nil | |
100171 | 168 "List of characters to quote when completing an argument." |
29876 | 169 :type '(choice (repeat character) |
170 (const :tag "Don't quote" nil)) | |
171 :group 'pcomplete) | |
172 | |
173 (defcustom pcomplete-quote-arg-hook nil | |
100171 | 174 "A hook which is run to quote a character within a filename. |
29876 | 175 Each function is passed both the filename to be quoted, and the index |
176 to be considered. If the function wishes to provide an alternate | |
177 quoted form, it need only return the replacement string. If no | |
178 function provides a replacement, quoting shall proceed as normal, | |
179 using a backslash to quote any character which is a member of | |
180 `pcomplete-arg-quote-list'." | |
181 :type 'hook | |
182 :group 'pcomplete) | |
183 | |
184 (defcustom pcomplete-man-function 'man | |
100171 | 185 "A function to that will be called to display a manual page. |
29876 | 186 It will be passed the name of the command to document." |
187 :type 'function | |
188 :group 'pcomplete) | |
189 | |
190 (defcustom pcomplete-compare-entry-function 'string-lessp | |
100171 | 191 "This function is used to order file entries for completion. |
29876 | 192 The behavior of most all shells is to sort alphabetically." |
193 :type '(radio (function-item string-lessp) | |
194 (function-item file-newer-than-file-p) | |
195 (function :tag "Other")) | |
196 :group 'pcomplete) | |
197 | |
198 (defcustom pcomplete-help nil | |
100171 | 199 "A string or function (or nil) used for context-sensitive help. |
29876 | 200 If a string, it should name an Info node that will be jumped to. |
201 If non-nil, it must a sexp that will be evaluated, and whose | |
202 result will be shown in the minibuffer. | |
203 If nil, the function `pcomplete-man-function' will be called with the | |
204 current command argument." | |
205 :type '(choice string sexp (const :tag "Use man page" nil)) | |
206 :group 'pcomplete) | |
207 | |
208 (defcustom pcomplete-expand-before-complete nil | |
100171 | 209 "If non-nil, expand the current argument before completing it. |
29876 | 210 This means that typing something such as '$HOME/bi' followed by |
211 \\[pcomplete-argument] will cause the variable reference to be | |
212 resolved first, and the resultant value that will be completed against | |
213 to be inserted in the buffer. Note that exactly what gets expanded | |
214 and how is entirely up to the behavior of the | |
215 `pcomplete-parse-arguments-function'." | |
216 :type 'boolean | |
217 :group 'pcomplete) | |
218 | |
219 (defcustom pcomplete-parse-arguments-function | |
220 'pcomplete-parse-buffer-arguments | |
100171 | 221 "A function to call to parse the current line's arguments. |
29876 | 222 It should be called with no parameters, and with point at the position |
223 of the argument that is to be completed. | |
224 | |
225 It must either return nil, or a cons cell of the form: | |
226 | |
227 ((ARG...) (BEG-POS...)) | |
228 | |
229 The two lists must be identical in length. The first gives the final | |
230 value of each command line argument (which need not match the textual | |
231 representation of that argument), and BEG-POS gives the beginning | |
232 position of each argument, as it is seen by the user. The establishes | |
233 a relationship between the fully resolved value of the argument, and | |
234 the textual representation of the argument." | |
235 :type 'function | |
236 :group 'pcomplete) | |
237 | |
238 (defcustom pcomplete-cycle-completions t | |
100171 | 239 "If non-nil, hitting the TAB key cycles through the completion list. |
29876 | 240 Typical Emacs behavior is to complete as much as possible, then pause |
241 waiting for further input. Then if TAB is hit again, show a list of | |
242 possible completions. When `pcomplete-cycle-completions' is non-nil, | |
243 it acts more like zsh or 4nt, showing the first maximal match first, | |
244 followed by any further matches on each subsequent pressing of the TAB | |
245 key. \\[pcomplete-list] is the key to press if the user wants to see | |
246 the list of possible completions." | |
247 :type 'boolean | |
248 :group 'pcomplete) | |
249 | |
250 (defcustom pcomplete-cycle-cutoff-length 5 | |
100171 | 251 "If the number of completions is greater than this, don't cycle. |
29876 | 252 This variable is a compromise between the traditional Emacs style of |
253 completion, and the \"cycling\" style. Basically, if there are more | |
254 than this number of completions possible, don't automatically pick the | |
255 first one and then expect the user to press TAB to cycle through them. | |
256 Typically, when there are a large number of completion possibilities, | |
257 the user wants to see them in a list buffer so that they can know what | |
258 options are available. But if the list is small, it means the user | |
259 has already entered enough input to disambiguate most of the | |
260 possibilities, and therefore they are probably most interested in | |
261 cycling through the candidates. Set this value to nil if you want | |
262 cycling to always be enabled." | |
263 :type '(choice integer (const :tag "Always cycle" nil)) | |
264 :group 'pcomplete) | |
265 | |
266 (defcustom pcomplete-restore-window-delay 1 | |
100171 | 267 "The number of seconds to wait before restoring completion windows. |
29876 | 268 Once the completion window has been displayed, if the user then goes |
269 on to type something else, that completion window will be removed from | |
270 the display (actually, the original window configuration before it was | |
271 displayed will be restored), after this many seconds of idle time. If | |
272 set to nil, completion windows will be left on second until the user | |
273 removes them manually. If set to 0, they will disappear immediately | |
274 after the user enters a key other than TAB." | |
275 :type '(choice integer (const :tag "Never restore" nil)) | |
276 :group 'pcomplete) | |
277 | |
278 (defcustom pcomplete-try-first-hook nil | |
100171 | 279 "A list of functions which are called before completing an argument. |
29876 | 280 This can be used, for example, for completing things which might apply |
281 to all arguments, such as variable names after a $." | |
282 :type 'hook | |
283 :group 'pcomplete) | |
284 | |
86234
860a7a8e779e
* progmodes/octave-mod.el (inferior-octave-send-list-and-digest):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
86202
diff
changeset
|
285 (defsubst pcomplete-executables (&optional regexp) |
860a7a8e779e
* progmodes/octave-mod.el (inferior-octave-send-list-and-digest):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
86202
diff
changeset
|
286 "Complete amongst a list of directories and executables." |
860a7a8e779e
* progmodes/octave-mod.el (inferior-octave-send-list-and-digest):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
86202
diff
changeset
|
287 (pcomplete-entries regexp 'file-executable-p)) |
860a7a8e779e
* progmodes/octave-mod.el (inferior-octave-send-list-and-digest):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
86202
diff
changeset
|
288 |
29876 | 289 (defcustom pcomplete-command-completion-function |
290 (function | |
291 (lambda () | |
292 (pcomplete-here (pcomplete-executables)))) | |
100171 | 293 "Function called for completing the initial command argument." |
29876 | 294 :type 'function |
295 :group 'pcomplete) | |
296 | |
297 (defcustom pcomplete-command-name-function 'pcomplete-command-name | |
100171 | 298 "Function called for determining the current command name." |
29876 | 299 :type 'function |
300 :group 'pcomplete) | |
301 | |
302 (defcustom pcomplete-default-completion-function | |
303 (function | |
304 (lambda () | |
305 (while (pcomplete-here (pcomplete-entries))))) | |
100171 | 306 "Function called when no completion rule can be found. |
29876 | 307 This function is used to generate completions for every argument." |
308 :type 'function | |
309 :group 'pcomplete) | |
310 | |
31241 | 311 (defcustom pcomplete-use-paring t |
100171 | 312 "If t, pare alternatives that have already been used. |
31241 | 313 If nil, you will always see the completion set of possible options, no |
314 matter which of those options have already been used in previous | |
315 command arguments." | |
316 :type 'boolean | |
317 :group 'pcomplete) | |
318 | |
49131
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
319 (defcustom pcomplete-termination-string " " |
100171 | 320 "A string that is inserted after any completion or expansion. |
49131
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
321 This is usually a space character, useful when completing lists of |
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
322 words separated by spaces. However, if your list uses a different |
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
323 separator character, or if the completion occurs in a word that is |
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
324 already terminated by a character, this variable should be locally |
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
325 modified to be an empty string, or the desired separation string." |
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
326 :type 'string |
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
327 :group 'pcomplete) |
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
328 |
29876 | 329 ;;; Internal Variables: |
330 | |
331 ;; for cycling completion support | |
332 (defvar pcomplete-current-completions nil) | |
333 (defvar pcomplete-last-completion-length) | |
334 (defvar pcomplete-last-completion-stub) | |
335 (defvar pcomplete-last-completion-raw) | |
336 (defvar pcomplete-last-window-config nil) | |
337 (defvar pcomplete-window-restore-timer nil) | |
338 | |
339 (make-variable-buffer-local 'pcomplete-current-completions) | |
340 (make-variable-buffer-local 'pcomplete-last-completion-length) | |
341 (make-variable-buffer-local 'pcomplete-last-completion-stub) | |
342 (make-variable-buffer-local 'pcomplete-last-completion-raw) | |
343 (make-variable-buffer-local 'pcomplete-last-window-config) | |
344 (make-variable-buffer-local 'pcomplete-window-restore-timer) | |
345 | |
346 ;; used for altering pcomplete's behavior. These global variables | |
347 ;; should always be nil. | |
348 (defvar pcomplete-show-help nil) | |
349 (defvar pcomplete-show-list nil) | |
350 (defvar pcomplete-expand-only-p nil) | |
351 | |
352 ;;; User Functions: | |
353 | |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
354 ;;; Alternative front-end using the standard completion facilities. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
355 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
356 ;; The way pcomplete-parse-arguments, pcomplete-stub, and |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
357 ;; pcomplete-quote-argument work only works because of some deep |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
358 ;; hypothesis about the way the completion work. Basically, it makes |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
359 ;; it pretty much impossible to have completion other than |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
360 ;; prefix-completion. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
361 ;; |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
362 ;; pcomplete--common-quoted-suffix and pcomplete--table-subvert try to |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
363 ;; work around this difficulty with heuristics, but it's |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
364 ;; really a hack. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
365 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
366 (defvar pcomplete-unquote-argument-function nil) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
367 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
368 (defun pcomplete-unquote-argument (s) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
369 (cond |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
370 (pcomplete-unquote-argument-function |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
371 (funcall pcomplete-unquote-argument-function s)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
372 ((null pcomplete-arg-quote-list) s) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
373 (t |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
374 (replace-regexp-in-string "\\\\\\(.\\)" "\\1" s t)))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
375 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
376 (defun pcomplete--common-suffix (s1 s2) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
377 (assert (not (or (string-match "\n" s1) (string-match "\n" s2)))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
378 ;; Since S2 is expected to be the "unquoted/expanded" version of S1, |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
379 ;; there shouldn't be any case difference, even if the completion is |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
380 ;; case-insensitive. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
381 (let ((case-fold-search nil)) ;; pcomplete-ignore-case |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
382 (string-match ".*?\\(.*\\)\n.*\\1\\'" (concat s1 "\n" s2)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
383 (- (match-end 1) (match-beginning 1)))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
384 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
385 (defun pcomplete--common-quoted-suffix (s1 s2) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
386 "Find the common suffix between S1 and S2 where S1 is the expanded S2. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
387 S1 is expected to be the unquoted and expanded version of S1. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
388 Returns (PS1 . PS2), i.e. the shortest prefixes of S1 and S2, such that |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
389 S1 = (concat PS1 SS1) and S2 = (concat PS2 SS2) and |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
390 SS1 = (unquote SS2)." |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
391 (let* ((cs (pcomplete--common-suffix s1 s2)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
392 (ss1 (substring s1 (- (length s1) cs))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
393 (qss1 (pcomplete-quote-argument ss1)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
394 qc) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
395 (if (and (not (equal ss1 qss1)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
396 (setq qc (pcomplete-quote-argument (substring ss1 0 1))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
397 (eq t (compare-strings s2 (- (length s2) cs (length qc) -1) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
398 (- (length s2) cs -1) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
399 qc nil nil))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
400 ;; The difference found is just that one char is quoted in S2 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
401 ;; but not in S1, keep looking before this difference. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
402 (pcomplete--common-quoted-suffix |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
403 (substring s1 0 (- (length s1) cs)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
404 (substring s2 0 (- (length s2) cs (length qc) -1))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
405 (cons (substring s1 0 (- (length s1) cs)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
406 (substring s2 0 (- (length s2) cs)))))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
407 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
408 (defun pcomplete--table-subvert (table s1 s2 string pred action) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
409 "Completion table that replaces the prefix S1 with S2 in STRING. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
410 When TABLE, S1 and S2 are provided by `apply-partially', the result |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
411 is a completion table which completes strings of the form (concat S1 S) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
412 in the same way as TABLE completes strings of the form (concat S2 S)." |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
413 (let* ((str (if (eq t (compare-strings string 0 (length s1) s1 nil nil |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
414 completion-ignore-case)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
415 (concat s2 (pcomplete-unquote-argument |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
416 (substring string (length s1)))))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
417 (res (if str (complete-with-action action table str pred)))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
418 (when res |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
419 (cond |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
420 ((and (eq (car-safe action) 'boundaries)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
421 (let ((beg (or (and (eq (car-safe res) 'boundaries) (cadr res)) 0))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
422 (list* 'boundaries |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
423 (max (length s1) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
424 ;; FIXME: Adjust because of quoting/unquoting. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
425 (+ beg (- (length s1) (length s2)))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
426 (and (eq (car-safe res) 'boundaries) (cddr res))))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
427 ((stringp res) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
428 (if (eq t (compare-strings res 0 (length s2) s2 nil nil |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
429 completion-ignore-case)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
430 (concat s1 (pcomplete-quote-argument |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
431 (substring res (length s2)))))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
432 ((eq action t) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
433 (let ((bounds (completion-boundaries str table pred ""))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
434 (if (>= (car bounds) (length s2)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
435 res |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
436 (let ((re (concat "\\`" |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
437 (regexp-quote (substring s2 (car bounds)))))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
438 (delq nil |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
439 (mapcar (lambda (c) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
440 (if (string-match re c) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
441 (substring c (match-end 0)))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
442 res)))))))))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
443 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
444 ;; I don't think such commands are usable before first setting up buffer-local |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
445 ;; variables to parse args, so there's no point autoloading it. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
446 ;; ;;;###autoload |
108587
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
447 (defun pcomplete-completions-at-point () |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
448 "Provide standard completion using pcomplete's completion tables. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
449 Same as `pcomplete' but using the standard completion UI." |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
450 ;; FIXME: it only completes the text before point, whereas the |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
451 ;; standard UI may also consider text after point. |
108587
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
452 ;; FIXME: the `pcomplete' UI may be used internally during |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
453 ;; pcomplete-completions and then throw to `pcompleted', thus |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
454 ;; imposing the pcomplete UI over the standard UI. |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
455 (catch 'pcompleted |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
456 (let* ((pcomplete-stub) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
457 pcomplete-seen pcomplete-norm-func |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
458 pcomplete-args pcomplete-last pcomplete-index |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
459 (pcomplete-autolist pcomplete-autolist) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
460 (pcomplete-suffix-list pcomplete-suffix-list) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
461 ;; Apparently the vars above are global vars modified by |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
462 ;; side-effects, whereas pcomplete-completions is the core |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
463 ;; function that finds the chunk of text to complete |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
464 ;; (returned indirectly in pcomplete-stub) and the set of |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
465 ;; possible completions. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
466 (completions (pcomplete-completions)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
467 ;; Usually there's some close connection between pcomplete-stub |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
468 ;; and the text before point. But depending on what |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
469 ;; pcomplete-parse-arguments-function does, that connection |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
470 ;; might not be that close. E.g. in eshell, |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
471 ;; pcomplete-parse-arguments-function expands envvars. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
472 ;; |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
473 ;; Since we use minibuffer-complete, which doesn't know |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
474 ;; pcomplete-stub and works from the buffer's text instead, |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
475 ;; we need to trick minibuffer-complete, into using |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
476 ;; pcomplete-stub without its knowledge. To that end, we |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
477 ;; use pcomplete--table-subvert to construct a completion |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
478 ;; table which expects strings using a prefix from the |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
479 ;; buffer's text but internally uses the corresponding |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
480 ;; prefix from pcomplete-stub. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
481 (beg (max (- (point) (length pcomplete-stub)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
482 (pcomplete-begin))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
483 (buftext (buffer-substring beg (point))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
484 (table |
106359
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
485 (cond |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
486 ((null completions) nil) |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
487 ((not (equal pcomplete-stub buftext)) |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
488 ;; This isn't always strictly right (e.g. if |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
489 ;; FOO="toto/$FOO", then completion of /$FOO/bar may |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
490 ;; result in something incorrect), but given the lack of |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
491 ;; any other info, it's about as good as it gets, and in |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
492 ;; practice it should work just fine (fingers crossed). |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
493 (let ((prefixes (pcomplete--common-quoted-suffix |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
494 pcomplete-stub buftext))) |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
495 (apply-partially |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
496 'pcomplete--table-subvert |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
497 completions |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
498 (cdr prefixes) (car prefixes)))) |
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
499 (t |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
500 (lexical-let ((completions completions)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
501 (lambda (string pred action) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
502 (let ((res (complete-with-action |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
503 action completions string pred))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
504 (if (stringp res) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
505 (pcomplete-quote-argument res) |
106359
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
506 res))))))) |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
507 (pred |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
508 ;; pare it down, if applicable |
106359
fceba9857bee
(pcomplete-std-complete): Don't try to complete past the last element.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106298
diff
changeset
|
509 (when (and table pcomplete-use-paring pcomplete-seen) |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
510 (setq pcomplete-seen |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
511 (mapcar (lambda (f) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
512 (funcall pcomplete-norm-func |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
513 (directory-file-name f))) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
514 pcomplete-seen)) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
515 (lambda (f) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
516 (not (member |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
517 (funcall pcomplete-norm-func |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
518 (directory-file-name f)) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
519 pcomplete-seen)))))) |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
520 |
108587
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
521 (list |
106109
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
522 beg (point) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
523 ;; Add a space at the end of completion. Use a terminator-regexp |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
524 ;; that never matches since the terminator cannot appear |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
525 ;; within the completion field anyway. |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
526 (if (zerop (length pcomplete-termination-string)) |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
527 table |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
528 (apply-partially 'completion-table-with-terminator |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
529 (cons pcomplete-termination-string |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
530 "\\`a\\`") |
42ca82b4620b
* abbrev.el (abbrev-with-wrapper-hook): (re)move...
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105788
diff
changeset
|
531 table)) |
108587
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
532 :predicate pred)))) |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
533 |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
534 ;; I don't think such commands are usable before first setting up buffer-local |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
535 ;; variables to parse args, so there's no point autoloading it. |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
536 ;; ;;;###autoload |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
537 (defun pcomplete-std-complete () |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
538 (let ((completion-at-point-functions '(pcomplete-completions-at-point))) |
17dd83b6f6d9
* pcomplete.el (pcomplete-completions-at-point): New function,
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
107844
diff
changeset
|
539 (completion-at-point))) |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
540 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
541 ;;; Pcomplete's native UI. |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
542 |
29876 | 543 ;;;###autoload |
57701
28c08e3b5530
(pcomplete): Instead of interactive-p,
Richard M. Stallman <rms@gnu.org>
parents:
55205
diff
changeset
|
544 (defun pcomplete (&optional interactively) |
29876 | 545 "Support extensible programmable completion. |
546 To use this function, just bind the TAB key to it, or add it to your | |
547 completion functions list (it should occur fairly early in the list)." | |
57701
28c08e3b5530
(pcomplete): Instead of interactive-p,
Richard M. Stallman <rms@gnu.org>
parents:
55205
diff
changeset
|
548 (interactive "p") |
28c08e3b5530
(pcomplete): Instead of interactive-p,
Richard M. Stallman <rms@gnu.org>
parents:
55205
diff
changeset
|
549 (if (and interactively |
29876 | 550 pcomplete-cycle-completions |
551 pcomplete-current-completions | |
552 (memq last-command '(pcomplete | |
553 pcomplete-expand-and-complete | |
554 pcomplete-reverse))) | |
555 (progn | |
108765
d835100c3e8b
Replace Lisp calls to delete-backward-char by delete-char.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108587
diff
changeset
|
556 (delete-char (- pcomplete-last-completion-length)) |
29876 | 557 (if (eq this-command 'pcomplete-reverse) |
558 (progn | |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
559 (push (car (last pcomplete-current-completions)) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
560 pcomplete-current-completions) |
29876 | 561 (setcdr (last pcomplete-current-completions 2) nil)) |
562 (nconc pcomplete-current-completions | |
563 (list (car pcomplete-current-completions))) | |
564 (setq pcomplete-current-completions | |
565 (cdr pcomplete-current-completions))) | |
566 (pcomplete-insert-entry pcomplete-last-completion-stub | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
567 (car pcomplete-current-completions) |
29876 | 568 nil pcomplete-last-completion-raw)) |
569 (setq pcomplete-current-completions nil | |
570 pcomplete-last-completion-raw nil) | |
571 (catch 'pcompleted | |
572 (let* ((pcomplete-stub) | |
573 pcomplete-seen pcomplete-norm-func | |
574 pcomplete-args pcomplete-last pcomplete-index | |
575 (pcomplete-autolist pcomplete-autolist) | |
576 (pcomplete-suffix-list pcomplete-suffix-list) | |
577 (completions (pcomplete-completions)) | |
578 (result (pcomplete-do-complete pcomplete-stub completions))) | |
579 (and result | |
580 (not (eq (car result) 'listed)) | |
581 (cdr result) | |
582 (pcomplete-insert-entry pcomplete-stub (cdr result) | |
583 (memq (car result) | |
584 '(sole shortest)) | |
585 pcomplete-last-completion-raw)))))) | |
586 | |
587 ;;;###autoload | |
588 (defun pcomplete-reverse () | |
589 "If cycling completion is in use, cycle backwards." | |
590 (interactive) | |
591 (call-interactively 'pcomplete)) | |
592 | |
593 ;;;###autoload | |
594 (defun pcomplete-expand-and-complete () | |
595 "Expand the textual value of the current argument. | |
596 This will modify the current buffer." | |
597 (interactive) | |
598 (let ((pcomplete-expand-before-complete t)) | |
599 (pcomplete))) | |
600 | |
601 ;;;###autoload | |
602 (defun pcomplete-continue () | |
603 "Complete without reference to any cycling completions." | |
604 (interactive) | |
605 (setq pcomplete-current-completions nil | |
606 pcomplete-last-completion-raw nil) | |
607 (call-interactively 'pcomplete)) | |
608 | |
609 ;;;###autoload | |
610 (defun pcomplete-expand () | |
611 "Expand the textual value of the current argument. | |
612 This will modify the current buffer." | |
613 (interactive) | |
614 (let ((pcomplete-expand-before-complete t) | |
615 (pcomplete-expand-only-p t)) | |
616 (pcomplete) | |
617 (when (and pcomplete-current-completions | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
618 (> (length pcomplete-current-completions) 0)) ;?? |
108765
d835100c3e8b
Replace Lisp calls to delete-backward-char by delete-char.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108587
diff
changeset
|
619 (delete-char (- pcomplete-last-completion-length)) |
29876 | 620 (while pcomplete-current-completions |
621 (unless (pcomplete-insert-entry | |
622 "" (car pcomplete-current-completions) t | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
623 pcomplete-last-completion-raw) |
49131
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
624 (insert-and-inherit pcomplete-termination-string)) |
29876 | 625 (setq pcomplete-current-completions |
626 (cdr pcomplete-current-completions)))))) | |
627 | |
628 ;;;###autoload | |
629 (defun pcomplete-help () | |
630 "Display any help information relative to the current argument." | |
631 (interactive) | |
632 (let ((pcomplete-show-help t)) | |
633 (pcomplete))) | |
634 | |
635 ;;;###autoload | |
636 (defun pcomplete-list () | |
637 "Show the list of possible completions for the current argument." | |
638 (interactive) | |
639 (when (and pcomplete-cycle-completions | |
640 pcomplete-current-completions | |
641 (eq last-command 'pcomplete-argument)) | |
108765
d835100c3e8b
Replace Lisp calls to delete-backward-char by delete-char.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108587
diff
changeset
|
642 (delete-char (- pcomplete-last-completion-length)) |
29876 | 643 (setq pcomplete-current-completions nil |
644 pcomplete-last-completion-raw nil)) | |
645 (let ((pcomplete-show-list t)) | |
646 (pcomplete))) | |
647 | |
648 ;;; Internal Functions: | |
649 | |
650 ;; argument handling | |
651 | |
652 ;; for the sake of the bye-compiler, when compiling other files that | |
653 ;; contain completion functions | |
654 (defvar pcomplete-args nil) | |
655 (defvar pcomplete-begins nil) | |
656 (defvar pcomplete-last nil) | |
657 (defvar pcomplete-index nil) | |
658 (defvar pcomplete-stub nil) | |
659 (defvar pcomplete-seen nil) | |
660 (defvar pcomplete-norm-func nil) | |
661 | |
662 (defun pcomplete-arg (&optional index offset) | |
663 "Return the textual content of the INDEXth argument. | |
664 INDEX is based from the current processing position. If INDEX is | |
665 positive, values returned are closer to the command argument; if | |
666 negative, they are closer to the last argument. If the INDEX is | |
667 outside of the argument list, nil is returned. The default value for | |
668 INDEX is 0, meaning the current argument being examined. | |
669 | |
670 The special indices `first' and `last' may be used to access those | |
671 parts of the list. | |
672 | |
673 The OFFSET argument is added to/taken away from the index that will be | |
674 used. This is really only useful with `first' and `last', for | |
675 accessing absolute argument positions." | |
676 (setq index | |
677 (if (eq index 'first) | |
678 0 | |
679 (if (eq index 'last) | |
680 pcomplete-last | |
681 (- pcomplete-index (or index 0))))) | |
682 (if offset | |
683 (setq index (+ index offset))) | |
684 (nth index pcomplete-args)) | |
685 | |
686 (defun pcomplete-begin (&optional index offset) | |
687 "Return the beginning position of the INDEXth argument. | |
688 See the documentation for `pcomplete-arg'." | |
689 (setq index | |
690 (if (eq index 'first) | |
691 0 | |
692 (if (eq index 'last) | |
693 pcomplete-last | |
694 (- pcomplete-index (or index 0))))) | |
695 (if offset | |
696 (setq index (+ index offset))) | |
697 (nth index pcomplete-begins)) | |
698 | |
699 (defsubst pcomplete-actual-arg (&optional index offset) | |
700 "Return the actual text representation of the last argument. | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
701 This is different from `pcomplete-arg', which returns the textual value |
29876 | 702 that the last argument evaluated to. This function returns what the |
703 user actually typed in." | |
704 (buffer-substring (pcomplete-begin index offset) (point))) | |
705 | |
706 (defsubst pcomplete-next-arg () | |
707 "Move the various pointers to the next argument." | |
708 (setq pcomplete-index (1+ pcomplete-index) | |
709 pcomplete-stub (pcomplete-arg)) | |
710 (if (> pcomplete-index pcomplete-last) | |
711 (progn | |
712 (message "No completions") | |
713 (throw 'pcompleted nil)))) | |
714 | |
715 (defun pcomplete-command-name () | |
716 "Return the command name of the first argument." | |
717 (file-name-nondirectory (pcomplete-arg 'first))) | |
718 | |
719 (defun pcomplete-match (regexp &optional index offset start) | |
720 "Like `string-match', but on the current completion argument." | |
721 (let ((arg (pcomplete-arg (or index 1) offset))) | |
722 (if arg | |
723 (string-match regexp arg start) | |
724 (throw 'pcompleted nil)))) | |
725 | |
726 (defun pcomplete-match-string (which &optional index offset) | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
727 "Like `match-string', but on the current completion argument." |
29876 | 728 (let ((arg (pcomplete-arg (or index 1) offset))) |
729 (if arg | |
730 (match-string which arg) | |
731 (throw 'pcompleted nil)))) | |
732 | |
733 (defalias 'pcomplete-match-beginning 'match-beginning) | |
734 (defalias 'pcomplete-match-end 'match-end) | |
735 | |
736 (defsubst pcomplete--test (pred arg) | |
737 "Perform a programmable completion predicate match." | |
738 (and pred | |
739 (cond ((eq pred t) t) | |
740 ((functionp pred) | |
741 (funcall pred arg)) | |
742 ((stringp pred) | |
743 (string-match (concat "^" pred "$") arg))) | |
744 pred)) | |
745 | |
746 (defun pcomplete-test (predicates &optional index offset) | |
747 "Predicates to test the current programmable argument with." | |
748 (let ((arg (pcomplete-arg (or index 1) offset))) | |
749 (unless (null predicates) | |
750 (if (not (listp predicates)) | |
751 (pcomplete--test predicates arg) | |
752 (let ((pred predicates) | |
753 found) | |
754 (while (and pred (not found)) | |
755 (setq found (pcomplete--test (car pred) arg) | |
756 pred (cdr pred))) | |
757 found))))) | |
758 | |
759 (defun pcomplete-parse-buffer-arguments () | |
760 "Parse whitespace separated arguments in the current region." | |
761 (let ((begin (point-min)) | |
762 (end (point-max)) | |
763 begins args) | |
764 (save-excursion | |
765 (goto-char begin) | |
766 (while (< (point) end) | |
767 (skip-chars-forward " \t\n") | |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
768 (push (point) begins) |
29876 | 769 (skip-chars-forward "^ \t\n") |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
770 (push (buffer-substring-no-properties |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
771 (car begins) (point)) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
772 args)) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
773 (cons (nreverse args) (nreverse begins))))) |
29876 | 774 |
775 ;;;###autoload | |
776 (defun pcomplete-comint-setup (completef-sym) | |
777 "Setup a comint buffer to use pcomplete. | |
778 COMPLETEF-SYM should be the symbol where the | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
779 dynamic-complete-functions are kept. For comint mode itself, |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
780 this is `comint-dynamic-complete-functions'." |
29876 | 781 (set (make-local-variable 'pcomplete-parse-arguments-function) |
782 'pcomplete-parse-comint-arguments) | |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
783 (set (make-local-variable completef-sym) |
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
784 (copy-sequence (symbol-value completef-sym))) |
103870
a75fa842931b
* pcomplete.el (pcomplete-comint-setup): Check for
Chong Yidong <cyd@stupidchicken.com>
parents:
100908
diff
changeset
|
785 (let* ((funs (symbol-value completef-sym)) |
105788
fedd4c047ce7
(pcomplete-comint-setup): If there's a choice, replace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105764
diff
changeset
|
786 (elem (or (memq 'shell-dynamic-complete-filename funs) |
fedd4c047ce7
(pcomplete-comint-setup): If there's a choice, replace
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105764
diff
changeset
|
787 (memq 'comint-dynamic-complete-filename funs)))) |
29876 | 788 (if elem |
789 (setcar elem 'pcomplete) | |
46769
8bb6a2e5d6bd
(pcomplete-comint-setup): Use `add-to-list', to prevent adding the
John Wiegley <johnw@newartisans.com>
parents:
46762
diff
changeset
|
790 (add-to-list completef-sym 'pcomplete)))) |
29876 | 791 |
792 ;;;###autoload | |
793 (defun pcomplete-shell-setup () | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
794 "Setup `shell-mode' to use pcomplete." |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
795 ;; FIXME: insufficient |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
796 (pcomplete-comint-setup 'comint-dynamic-complete-functions)) |
29876 | 797 |
86234
860a7a8e779e
* progmodes/octave-mod.el (inferior-octave-send-list-and-digest):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
86202
diff
changeset
|
798 (declare-function comint-bol "comint" (&optional arg)) |
860a7a8e779e
* progmodes/octave-mod.el (inferior-octave-send-list-and-digest):
Dan Nicolaescu <dann@ics.uci.edu>
parents:
86202
diff
changeset
|
799 |
29876 | 800 (defun pcomplete-parse-comint-arguments () |
801 "Parse whitespace separated arguments in the current region." | |
802 (let ((begin (save-excursion (comint-bol nil) (point))) | |
803 (end (point)) | |
804 begins args) | |
805 (save-excursion | |
806 (goto-char begin) | |
807 (while (< (point) end) | |
808 (skip-chars-forward " \t\n") | |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
809 (push (point) begins) |
29876 | 810 (let ((skip t)) |
811 (while skip | |
812 (skip-chars-forward "^ \t\n") | |
813 (if (eq (char-before) ?\\) | |
814 (skip-chars-forward " \t\n") | |
815 (setq skip nil)))) | |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
816 (push (buffer-substring-no-properties (car begins) (point)) |
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
817 args)) |
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
818 (cons (nreverse args) (nreverse begins))))) |
29876 | 819 |
820 (defun pcomplete-parse-arguments (&optional expand-p) | |
821 "Parse the command line arguments. Most completions need this info." | |
822 (let ((results (funcall pcomplete-parse-arguments-function))) | |
823 (when results | |
824 (setq pcomplete-args (or (car results) (list "")) | |
825 pcomplete-begins (or (cdr results) (list (point))) | |
826 pcomplete-last (1- (length pcomplete-args)) | |
827 pcomplete-index 0 | |
828 pcomplete-stub (pcomplete-arg 'last)) | |
829 (let ((begin (pcomplete-begin 'last))) | |
830 (if (and pcomplete-cycle-completions | |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
831 (listp pcomplete-stub) ;?? |
29876 | 832 (not pcomplete-expand-only-p)) |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
833 (let* ((completions pcomplete-stub) ;?? |
29876 | 834 (common-stub (car completions)) |
835 (c completions) | |
836 (len (length common-stub))) | |
837 (while (and c (> len 0)) | |
838 (while (and (> len 0) | |
839 (not (string= | |
840 (substring common-stub 0 len) | |
841 (substring (car c) 0 | |
842 (min (length (car c)) | |
843 len))))) | |
844 (setq len (1- len))) | |
845 (setq c (cdr c))) | |
846 (setq pcomplete-stub (substring common-stub 0 len) | |
847 pcomplete-autolist t) | |
848 (when (and begin (not pcomplete-show-list)) | |
849 (delete-region begin (point)) | |
850 (pcomplete-insert-entry "" pcomplete-stub)) | |
851 (throw 'pcomplete-completions completions)) | |
852 (when expand-p | |
853 (if (stringp pcomplete-stub) | |
854 (when begin | |
855 (delete-region begin (point)) | |
856 (insert-and-inherit pcomplete-stub)) | |
857 (if (and (listp pcomplete-stub) | |
858 pcomplete-expand-only-p) | |
859 ;; this is for the benefit of `pcomplete-expand' | |
860 (setq pcomplete-last-completion-length (- (point) begin) | |
861 pcomplete-current-completions pcomplete-stub) | |
862 (error "Cannot expand argument")))) | |
863 (if pcomplete-expand-only-p | |
864 (throw 'pcompleted t) | |
865 pcomplete-args)))))) | |
866 | |
867 (defun pcomplete-quote-argument (filename) | |
868 "Return FILENAME with magic characters quoted. | |
869 Magic characters are those in `pcomplete-arg-quote-list'." | |
870 (if (null pcomplete-arg-quote-list) | |
871 filename | |
105762
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
872 (let ((index 0)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
873 (mapconcat (lambda (c) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
874 (prog1 |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
875 (or (run-hook-with-args-until-success |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
876 'pcomplete-quote-arg-hook filename index) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
877 (when (memq c pcomplete-arg-quote-list) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
878 (string "\\" c)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
879 (char-to-string c)) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
880 (setq index (1+ index)))) |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
881 filename |
5f2c736569a0
(pcomplete-unquote-argument-function): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105727
diff
changeset
|
882 "")))) |
29876 | 883 |
884 ;; file-system completion lists | |
885 | |
886 (defsubst pcomplete-dirs-or-entries (&optional regexp predicate) | |
887 "Return either directories, or qualified entries." | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
888 ;; FIXME: pcomplete-entries doesn't return a list any more. |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
889 (pcomplete-entries |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
890 nil |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
891 (lexical-let ((re regexp) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
892 (pred predicate)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
893 (lambda (f) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
894 (or (file-directory-p f) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
895 (and (if (not re) t (string-match re f)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
896 (if (not pred) t (funcall pred f)))))))) |
29876 | 897 |
898 (defun pcomplete-entries (&optional regexp predicate) | |
899 "Complete against a list of directory candidates. | |
900 If REGEXP is non-nil, it is a regular expression used to refine the | |
901 match (files not matching the REGEXP will be excluded). | |
902 If PREDICATE is non-nil, it will also be used to refine the match | |
903 \(files for which the PREDICATE returns nil will be excluded). | |
46762
85cd02534241
(pcomplete-entries): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents:
43827
diff
changeset
|
904 If no directory information can be extracted from the completed |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
905 component, `default-directory' is used as the basis for completion." |
106298
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
906 (let* ((name (substitute-env-vars pcomplete-stub)) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
907 (completion-ignore-case pcomplete-ignore-case) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
908 (default-directory (expand-file-name |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
909 (or (file-name-directory name) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
910 default-directory))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
911 above-cutoff) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
912 (setq name (file-name-nondirectory name) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
913 pcomplete-stub name) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
914 (let ((completions |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
915 (file-name-all-completions name default-directory))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
916 (if regexp |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
917 (setq completions |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
918 (pcomplete-pare-list |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
919 completions nil |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
920 (function |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
921 (lambda (file) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
922 (not (string-match regexp file))))))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
923 (if predicate |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
924 (setq completions |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
925 (pcomplete-pare-list |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
926 completions nil |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
927 (function |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
928 (lambda (file) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
929 (not (funcall predicate file))))))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
930 (if (or pcomplete-file-ignore pcomplete-dir-ignore) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
931 (setq completions |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
932 (pcomplete-pare-list |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
933 completions nil |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
934 (function |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
935 (lambda (file) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
936 (if (eq (aref file (1- (length file))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
937 ?/) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
938 (and pcomplete-dir-ignore |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
939 (string-match pcomplete-dir-ignore file)) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
940 (and pcomplete-file-ignore |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
941 (string-match pcomplete-file-ignore file)))))))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
942 (setq above-cutoff (and pcomplete-cycle-cutoff-length |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
943 (> (length completions) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
944 pcomplete-cycle-cutoff-length))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
945 (sort completions |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
946 (function |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
947 (lambda (l r) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
948 ;; for the purposes of comparison, remove the |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
949 ;; trailing slash from directory names. |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
950 ;; Otherwise, "foo.old/" will come before "foo/", |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
951 ;; since . is earlier in the ASCII alphabet than |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
952 ;; / |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
953 (let ((left (if (eq (aref l (1- (length l))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
954 ?/) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
955 (substring l 0 (1- (length l))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
956 l)) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
957 (right (if (eq (aref r (1- (length r))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
958 ?/) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
959 (substring r 0 (1- (length r))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
960 r))) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
961 (if above-cutoff |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
962 (string-lessp left right) |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
963 (funcall pcomplete-compare-entry-function |
3a4157b5e536
* eshell/em-prompt.el (eshell-prompt-function): Abbreviate pwd, since
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106109
diff
changeset
|
964 left right))))))))) |
29876 | 965 |
966 (defsubst pcomplete-all-entries (&optional regexp predicate) | |
967 "Like `pcomplete-entries', but doesn't ignore any entries." | |
968 (let (pcomplete-file-ignore | |
969 pcomplete-dir-ignore) | |
970 (pcomplete-entries regexp predicate))) | |
971 | |
972 (defsubst pcomplete-dirs (&optional regexp) | |
973 "Complete amongst a list of directories." | |
974 (pcomplete-entries regexp 'file-directory-p)) | |
975 | |
976 ;; generation of completion lists | |
977 | |
978 (defun pcomplete-find-completion-function (command) | |
979 "Find the completion function to call for the given COMMAND." | |
980 (let ((sym (intern-soft | |
981 (concat "pcomplete/" (symbol-name major-mode) "/" command)))) | |
982 (unless sym | |
983 (setq sym (intern-soft (concat "pcomplete/" command)))) | |
984 (and sym (fboundp sym) sym))) | |
985 | |
986 (defun pcomplete-completions () | |
987 "Return a list of completions for the current argument position." | |
988 (catch 'pcomplete-completions | |
989 (when (pcomplete-parse-arguments pcomplete-expand-before-complete) | |
990 (if (= pcomplete-index pcomplete-last) | |
991 (funcall pcomplete-command-completion-function) | |
992 (let ((sym (or (pcomplete-find-completion-function | |
993 (funcall pcomplete-command-name-function)) | |
994 pcomplete-default-completion-function))) | |
995 (ignore | |
996 (pcomplete-next-arg) | |
997 (funcall sym))))))) | |
998 | |
999 (defun pcomplete-opt (options &optional prefix no-ganging args-follow) | |
1000 "Complete a set of OPTIONS, each beginning with PREFIX (?- by default). | |
1001 PREFIX may be t, in which case no PREFIX character is necessary. | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1002 If NO-GANGING is non-nil, each option is separate (-xy is not allowed). |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1003 If ARGS-FOLLOW is non-nil, then options which take arguments may have |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1004 the argument appear after a ganged set of options. This is how tar |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1005 behaves, for example." |
29876 | 1006 (if (and (= pcomplete-index pcomplete-last) |
1007 (string= (pcomplete-arg) "-")) | |
1008 (let ((len (length options)) | |
1009 (index 0) | |
1010 char choices) | |
1011 (while (< index len) | |
1012 (setq char (aref options index)) | |
1013 (if (eq char ?\() | |
1014 (let ((result (read-from-string options index))) | |
1015 (setq index (cdr result))) | |
1016 (unless (memq char '(?/ ?* ?? ?.)) | |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
1017 (push (char-to-string char) choices)) |
29876 | 1018 (setq index (1+ index)))) |
1019 (throw 'pcomplete-completions | |
1020 (mapcar | |
1021 (function | |
1022 (lambda (opt) | |
1023 (concat "-" opt))) | |
1024 (pcomplete-uniqify-list choices)))) | |
1025 (let ((arg (pcomplete-arg))) | |
1026 (when (and (> (length arg) 1) | |
1027 (stringp arg) | |
1028 (eq (aref arg 0) (or prefix ?-))) | |
1029 (pcomplete-next-arg) | |
1030 (let ((char (aref arg 1)) | |
1031 (len (length options)) | |
1032 (index 0) | |
1033 opt-char arg-char result) | |
1034 (while (< (1+ index) len) | |
1035 (setq opt-char (aref options index) | |
1036 arg-char (aref options (1+ index))) | |
1037 (if (eq arg-char ?\() | |
1038 (setq result | |
1039 (read-from-string options (1+ index)) | |
1040 index (cdr result) | |
1041 result (car result)) | |
1042 (setq result nil)) | |
1043 (when (and (eq char opt-char) | |
1044 (memq arg-char '(?\( ?/ ?* ?? ?.))) | |
1045 (if (< pcomplete-index pcomplete-last) | |
1046 (pcomplete-next-arg) | |
1047 (throw 'pcomplete-completions | |
1048 (cond ((eq arg-char ?/) (pcomplete-dirs)) | |
1049 ((eq arg-char ?*) (pcomplete-executables)) | |
1050 ((eq arg-char ??) nil) | |
1051 ((eq arg-char ?.) (pcomplete-entries)) | |
1052 ((eq arg-char ?\() (eval result)))))) | |
1053 (setq index (1+ index)))))))) | |
1054 | |
1055 (defun pcomplete--here (&optional form stub paring form-only) | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1056 "Complete against the current argument, if at the end. |
29876 | 1057 See the documentation for `pcomplete-here'." |
1058 (if (< pcomplete-index pcomplete-last) | |
1059 (progn | |
1060 (if (eq paring 0) | |
1061 (setq pcomplete-seen nil) | |
1062 (unless (eq paring t) | |
1063 (let ((arg (pcomplete-arg))) | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1064 (when (stringp arg) |
105764
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
1065 (push (if paring |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
1066 (funcall paring arg) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
1067 (file-truename arg)) |
a5db863758a8
(pcomplete-std-complete): Obey pcomplete-use-paring.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105762
diff
changeset
|
1068 pcomplete-seen))))) |
29876 | 1069 (pcomplete-next-arg) |
1070 t) | |
1071 (when pcomplete-show-help | |
1072 (pcomplete--help) | |
1073 (throw 'pcompleted t)) | |
1074 (if stub | |
1075 (setq pcomplete-stub stub)) | |
1076 (if (or (eq paring t) (eq paring 0)) | |
1077 (setq pcomplete-seen nil) | |
1078 (setq pcomplete-norm-func (or paring 'file-truename))) | |
1079 (unless form-only | |
1080 (run-hooks 'pcomplete-try-first-hook)) | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1081 (throw 'pcomplete-completions |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1082 (if (functionp form) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1083 (funcall form) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1084 ;; Old calling convention, might still be used by files |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1085 ;; byte-compiled with the older code. |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1086 (eval form))))) |
29876 | 1087 |
1088 (defmacro pcomplete-here (&optional form stub paring form-only) | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1089 "Complete against the current argument, if at the end. |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1090 If completion is to be done here, evaluate FORM to generate the completion |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1091 table which will be used for completion purposes. If STUB is a |
29876 | 1092 string, use it as the completion stub instead of the default (which is |
1093 the entire text of the current argument). | |
1094 | |
1095 For an example of when you might want to use STUB: if the current | |
1096 argument text is 'long-path-name/', you don't want the completions | |
1097 list display to be cluttered by 'long-path-name/' appearing at the | |
1098 beginning of every alternative. Not only does this make things less | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1099 intelligible, but it is also inefficient. Yet, if the completion list |
29876 | 1100 does not begin with this string for every entry, the current argument |
1101 won't complete correctly. | |
1102 | |
1103 The solution is to specify a relative stub. It allows you to | |
1104 substitute a different argument from the current argument, almost | |
1105 always for the sake of efficiency. | |
1106 | |
1107 If PARING is nil, this argument will be pared against previous | |
1108 arguments using the function `file-truename' to normalize them. | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1109 PARING may be a function, in which case that function is used for |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1110 normalization. If PARING is t, the argument dealt with by this |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1111 call will not participate in argument paring. If it is the |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1112 integer 0, all previous arguments that have been seen will be |
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1113 cleared. |
29876 | 1114 |
1115 If FORM-ONLY is non-nil, only the result of FORM will be used to | |
1116 generate the completions list. This means that the hook | |
1117 `pcomplete-try-first-hook' will not be run." | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1118 (declare (debug t)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1119 `(pcomplete--here (lambda () ,form) ,stub ,paring ,form-only)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1120 |
29876 | 1121 |
1122 (defmacro pcomplete-here* (&optional form stub form-only) | |
1123 "An alternate form which does not participate in argument paring." | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1124 (declare (debug t)) |
107844
17333bba44b4
* pcomplete.el (pcomplete-here*): Fix mistaken change (bug#5935).
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
106815
diff
changeset
|
1125 `(pcomplete-here ,form ,stub t ,form-only)) |
29876 | 1126 |
1127 ;; display support | |
1128 | |
1129 (defun pcomplete-restore-windows () | |
1130 "If the only window change was due to Completions, restore things." | |
1131 (if pcomplete-last-window-config | |
1132 (let* ((cbuf (get-buffer "*Completions*")) | |
1133 (cwin (and cbuf (get-buffer-window cbuf)))) | |
81389
4e4dec192190
(pcomplete-restore-windows): Remove redundant check.
Juanma Barranquero <lekktu@gmail.com>
parents:
77053
diff
changeset
|
1134 (when (window-live-p cwin) |
29876 | 1135 (bury-buffer cbuf) |
1136 (set-window-configuration pcomplete-last-window-config)))) | |
1137 (setq pcomplete-last-window-config nil | |
1138 pcomplete-window-restore-timer nil)) | |
1139 | |
1140 ;; Abstractions so that the code below will work for both Emacs 20 and | |
1141 ;; XEmacs 21 | |
1142 | |
86202
794e428cd497
* eshell/esh-util.el (eshell-under-xemacs-p): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
82140
diff
changeset
|
1143 (defalias 'pcomplete-event-matches-key-specifier-p |
794e428cd497
* eshell/esh-util.el (eshell-under-xemacs-p): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
82140
diff
changeset
|
1144 (if (featurep 'xemacs) |
794e428cd497
* eshell/esh-util.el (eshell-under-xemacs-p): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
82140
diff
changeset
|
1145 'event-matches-key-specifier-p |
794e428cd497
* eshell/esh-util.el (eshell-under-xemacs-p): Remove.
Dan Nicolaescu <dann@ics.uci.edu>
parents:
82140
diff
changeset
|
1146 'eq)) |
29876 | 1147 |
77053
6231e179c4db
(pcomplete-read-event): One single definition, and not a defsubst.
Richard M. Stallman <rms@gnu.org>
parents:
77015
diff
changeset
|
1148 (defun pcomplete-read-event (&optional prompt) |
6231e179c4db
(pcomplete-read-event): One single definition, and not a defsubst.
Richard M. Stallman <rms@gnu.org>
parents:
77015
diff
changeset
|
1149 (if (fboundp 'read-event) |
6231e179c4db
(pcomplete-read-event): One single definition, and not a defsubst.
Richard M. Stallman <rms@gnu.org>
parents:
77015
diff
changeset
|
1150 (read-event prompt) |
29876 | 1151 (aref (read-key-sequence prompt) 0))) |
1152 | |
1153 (defun pcomplete-show-completions (completions) | |
1154 "List in help buffer sorted COMPLETIONS. | |
1155 Typing SPC flushes the help buffer." | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1156 (when pcomplete-window-restore-timer |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1157 (cancel-timer pcomplete-window-restore-timer) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1158 (setq pcomplete-window-restore-timer nil)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1159 (unless pcomplete-last-window-config |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1160 (setq pcomplete-last-window-config (current-window-configuration))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1161 (with-output-to-temp-buffer "*Completions*" |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1162 (display-completion-list completions)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1163 (message "Hit space to flush") |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1164 (let (event) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1165 (prog1 |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1166 (catch 'done |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1167 (while (with-current-buffer (get-buffer "*Completions*") |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1168 (setq event (pcomplete-read-event))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1169 (cond |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1170 ((pcomplete-event-matches-key-specifier-p event ?\s) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1171 (set-window-configuration pcomplete-last-window-config) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1172 (setq pcomplete-last-window-config nil) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1173 (throw 'done nil)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1174 ((or (pcomplete-event-matches-key-specifier-p event 'tab) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1175 ;; Needed on a terminal |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1176 (pcomplete-event-matches-key-specifier-p event 9)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1177 (let ((win (or (get-buffer-window "*Completions*" 0) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1178 (display-buffer "*Completions*" |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1179 'not-this-window)))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1180 (with-selected-window win |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1181 (if (pos-visible-in-window-p (point-max)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1182 (goto-char (point-min)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1183 (scroll-up)))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1184 (message "")) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1185 (t |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1186 (setq unread-command-events (list event)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1187 (throw 'done nil))))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1188 (if (and pcomplete-last-window-config |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1189 pcomplete-restore-window-delay) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1190 (setq pcomplete-window-restore-timer |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1191 (run-with-timer pcomplete-restore-window-delay nil |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1192 'pcomplete-restore-windows)))))) |
29876 | 1193 |
1194 ;; insert completion at point | |
1195 | |
1196 (defun pcomplete-insert-entry (stub entry &optional addsuffix raw-p) | |
1197 "Insert a completion entry at point. | |
1198 Returns non-nil if a space was appended at the end." | |
1199 (let ((here (point))) | |
1200 (if (not pcomplete-ignore-case) | |
1201 (insert-and-inherit (if raw-p | |
1202 (substring entry (length stub)) | |
1203 (pcomplete-quote-argument | |
1204 (substring entry (length stub))))) | |
1205 ;; the stub is not quoted at this time, so to determine the | |
1206 ;; length of what should be in the buffer, we must quote it | |
105727
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
1207 ;; FIXME: Here we presume that quoting `stub' gives us the exact |
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
1208 ;; text in the buffer before point, which is not guaranteed; |
65c5d19965b2
(pcomplete-common-suffix, pcomplete-table-subvert): New funs.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
105709
diff
changeset
|
1209 ;; e.g. it is not the case in eshell when completing ${FOO}tm[TAB]. |
108765
d835100c3e8b
Replace Lisp calls to delete-backward-char by delete-char.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
108587
diff
changeset
|
1210 (delete-char (- (length (pcomplete-quote-argument stub)))) |
29876 | 1211 ;; if there is already a backslash present to handle the first |
1212 ;; character, don't bother quoting it | |
1213 (when (eq (char-before) ?\\) | |
1214 (insert-and-inherit (substring entry 0 1)) | |
1215 (setq entry (substring entry 1))) | |
1216 (insert-and-inherit (if raw-p | |
1217 entry | |
1218 (pcomplete-quote-argument entry)))) | |
1219 (let (space-added) | |
1220 (when (and (not (memq (char-before) pcomplete-suffix-list)) | |
1221 addsuffix) | |
49131
c814bafa1987
(pcomplete-termination-string): Added a variable for modifying the
John Wiegley <johnw@newartisans.com>
parents:
46818
diff
changeset
|
1222 (insert-and-inherit pcomplete-termination-string) |
29876 | 1223 (setq space-added t)) |
1224 (setq pcomplete-last-completion-length (- (point) here) | |
1225 pcomplete-last-completion-stub stub) | |
1226 space-added))) | |
1227 | |
1228 ;; selection of completions | |
1229 | |
1230 (defun pcomplete-do-complete (stub completions) | |
1231 "Dynamically complete at point using STUB and COMPLETIONS. | |
1232 This is basically just a wrapper for `pcomplete-stub' which does some | |
1233 extra checking, and munging of the COMPLETIONS list." | |
1234 (unless (stringp stub) | |
1235 (message "Cannot complete argument") | |
1236 (throw 'pcompleted nil)) | |
1237 (if (null completions) | |
1238 (ignore | |
1239 (if (and stub (> (length stub) 0)) | |
1240 (message "No completions of %s" stub) | |
1241 (message "No completions"))) | |
1242 ;; pare it down, if applicable | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1243 (when (and pcomplete-use-paring pcomplete-seen) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1244 (setq pcomplete-seen |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1245 (mapcar 'directory-file-name pcomplete-seen)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1246 (dolist (p pcomplete-seen) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1247 (add-to-list 'pcomplete-seen |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1248 (funcall pcomplete-norm-func p))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1249 (setq completions |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1250 (apply-partially 'completion-table-with-predicate |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1251 completions |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1252 (lambda (f) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1253 (not (member |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1254 (funcall pcomplete-norm-func |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1255 (directory-file-name f)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1256 pcomplete-seen))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1257 'strict))) |
29876 | 1258 ;; OK, we've got a list of completions. |
1259 (if pcomplete-show-list | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1260 ;; FIXME: pay attention to boundaries. |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1261 (pcomplete-show-completions (all-completions stub completions)) |
29876 | 1262 (pcomplete-stub stub completions)))) |
1263 | |
1264 (defun pcomplete-stub (stub candidates &optional cycle-p) | |
1265 "Dynamically complete STUB from CANDIDATES list. | |
1266 This function inserts completion characters at point by completing | |
1267 STUB from the strings in CANDIDATES. A completions listing may be | |
1268 shown in a help buffer if completion is ambiguous. | |
1269 | |
1270 Returns nil if no completion was inserted. | |
1271 Returns `sole' if completed with the only completion match. | |
1272 Returns `shortest' if completed with the shortest of the matches. | |
1273 Returns `partial' if completed as far as possible with the matches. | |
1274 Returns `listed' if a completion listing was shown. | |
1275 | |
1276 See also `pcomplete-filename'." | |
1277 (let* ((completion-ignore-case pcomplete-ignore-case) | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1278 (completions (all-completions stub candidates)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1279 (entry (try-completion stub candidates)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1280 result) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1281 (cond |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1282 ((null entry) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1283 (if (and stub (> (length stub) 0)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1284 (message "No completions of %s" stub) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1285 (message "No completions"))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1286 ((eq entry t) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1287 (setq entry stub) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1288 (message "Sole completion") |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1289 (setq result 'sole)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1290 ((= 1 (length completions)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1291 (setq result 'sole)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1292 ((and pcomplete-cycle-completions |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1293 (or cycle-p |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1294 (not pcomplete-cycle-cutoff-length) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1295 (<= (length completions) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1296 pcomplete-cycle-cutoff-length))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1297 (let ((bound (car (completion-boundaries stub candidates nil "")))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1298 (unless (zerop bound) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1299 (setq completions (mapcar (lambda (c) (concat (substring stub 0 bound) c)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1300 completions))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1301 (setq entry (car completions) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1302 pcomplete-current-completions completions))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1303 ((and pcomplete-recexact |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1304 (string-equal stub entry) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1305 (member entry completions)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1306 ;; It's not unique, but user wants shortest match. |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1307 (message "Completed shortest") |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1308 (setq result 'shortest)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1309 ((or pcomplete-autolist |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1310 (string-equal stub entry)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1311 ;; It's not unique, list possible completions. |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1312 ;; FIXME: pay attention to boundaries. |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1313 (pcomplete-show-completions completions) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1314 (setq result 'listed)) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1315 (t |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1316 (message "Partially completed") |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1317 (setq result 'partial))) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1318 (cons result entry))) |
29876 | 1319 |
1320 ;; context sensitive help | |
1321 | |
1322 (defun pcomplete--help () | |
1323 "Produce context-sensitive help for the current argument. | |
55105
7438df87d96a
(pcomplete-opt, pcomplete-actual-arg, pcomplete-match-string,
Juanma Barranquero <lekktu@gmail.com>
parents:
52401
diff
changeset
|
1324 If specific documentation can't be given, be generic." |
29876 | 1325 (if (and pcomplete-help |
1326 (or (and (stringp pcomplete-help) | |
1327 (fboundp 'Info-goto-node)) | |
1328 (listp pcomplete-help))) | |
1329 (if (listp pcomplete-help) | |
65582
4d1085b02d64
Message format spec fixes (1)
Deepak Goel <deego@gnufans.org>
parents:
64762
diff
changeset
|
1330 (message "%s" (eval pcomplete-help)) |
29876 | 1331 (save-window-excursion (info)) |
1332 (switch-to-buffer-other-window "*info*") | |
1333 (funcall (symbol-function 'Info-goto-node) pcomplete-help)) | |
1334 (if pcomplete-man-function | |
1335 (let ((cmd (funcall pcomplete-command-name-function))) | |
1336 (if (and cmd (> (length cmd) 0)) | |
1337 (funcall pcomplete-man-function cmd))) | |
1338 (message "No context-sensitive help available")))) | |
1339 | |
1340 ;; general utilities | |
1341 | |
1342 (defun pcomplete-pare-list (l r &optional pred) | |
1343 "Destructively remove from list L all elements matching any in list R. | |
1344 Test is done using `equal'. | |
1345 If PRED is non-nil, it is a function used for further removal. | |
1346 Returns the resultant list." | |
1347 (while (and l (or (and r (member (car l) r)) | |
1348 (and pred | |
1349 (funcall pred (car l))))) | |
1350 (setq l (cdr l))) | |
1351 (let ((m l)) | |
1352 (while m | |
1353 (while (and (cdr m) | |
1354 (or (and r (member (cadr m) r)) | |
1355 (and pred | |
1356 (funcall pred (cadr m))))) | |
1357 (setcdr m (cddr m))) | |
1358 (setq m (cdr m)))) | |
1359 l) | |
1360 | |
1361 (defun pcomplete-uniqify-list (l) | |
1362 "Sort and remove multiples in L." | |
1363 (setq l (sort l 'string-lessp)) | |
1364 (let ((m l)) | |
1365 (while m | |
1366 (while (and (cdr m) | |
1367 (string= (car m) | |
1368 (cadr m))) | |
1369 (setcdr m (cddr m))) | |
1370 (setq m (cdr m)))) | |
1371 l) | |
1372 | |
1373 (defun pcomplete-process-result (cmd &rest args) | |
1374 "Call CMD using `call-process' and return the simplest result." | |
1375 (with-temp-buffer | |
1376 (apply 'call-process cmd nil t nil args) | |
1377 (skip-chars-backward "\n") | |
1378 (buffer-substring (point-min) (point)))) | |
1379 | |
1380 ;; create a set of aliases which allow completion functions to be not | |
1381 ;; quite so verbose | |
1382 | |
105709
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1383 ;;; jww (1999-10-20): are these a good idea? |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1384 ;; (defalias 'pc-here 'pcomplete-here) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1385 ;; (defalias 'pc-test 'pcomplete-test) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1386 ;; (defalias 'pc-opt 'pcomplete-opt) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1387 ;; (defalias 'pc-match 'pcomplete-match) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1388 ;; (defalias 'pc-match-string 'pcomplete-match-string) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1389 ;; (defalias 'pc-match-beginning 'pcomplete-match-beginning) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1390 ;; (defalias 'pc-match-end 'pcomplete-match-end) |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1391 |
e044a3c6a7e6
Allow the use of completion-tables.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
103870
diff
changeset
|
1392 (provide 'pcomplete) |
29876 | 1393 |
93975
1e3a407766b9
Fix up comment convention on the arch-tag lines.
Stefan Monnier <monnier@iro.umontreal.ca>
parents:
87649
diff
changeset
|
1394 ;; arch-tag: ae32ef2d-dbed-4244-8b0f-cf5a2a3b07a4 |
29876 | 1395 ;;; pcomplete.el ends here |