annotate lisp/pcomplete.el @ 110456:8d106071e2c8

Use tool-bar-position in menu Options/Show. * menu-bar.el (menu-bar-set-tool-bar-position): customize-set-variable tool-bar-position. Don't modify frame parameters here.
author Jan D. <jan.h.d@swipnet.se>
date Tue, 21 Sep 2010 09:31:01 +0200
parents d835100c3e8b
children 417b1e4d63cd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
1d1d5d9bd884 Add 2010 to copyright years.
Glenn Morris <rgm@gnu.org>
parents: 106359
diff changeset
4 ;; 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
5
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
8
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
9 ;; This file is part of GNU Emacs.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
15
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
16 ;; GNU Emacs is distributed in the hope that it will be useful,
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
17 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
18 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
19 ;; GNU General Public License for more details.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
20
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
23
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
24 ;;; Commentary:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
25
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
26 ;; This module provides a programmable completion facility using
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
27 ;; "completion functions". Each completion function is responsible
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
28 ;; for producing a list of possible completions relevant to the current
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
29 ;; argument position.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
30 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
31 ;; To use pcomplete with shell-mode, for example, you will need the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
32 ;; following in your .emacs file:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
33 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
34 ;; (add-hook 'shell-mode-hook 'pcomplete-shell-setup)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
35 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
36 ;; Most of the code below simply provides support mechanisms for
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
37 ;; writing completion functions. Completion functions themselves are
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
38 ;; very easy to write. They have few requirements beyond those of
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
39 ;; regular Lisp functions.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
40 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
41 ;; Consider the following example, which will complete against
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
42 ;; filenames for the first two arguments, and directories for all
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
43 ;; remaining arguments:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
44 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
45 ;; (defun pcomplete/my-command ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
46 ;; (pcomplete-here (pcomplete-entries))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
47 ;; (pcomplete-here (pcomplete-entries))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
48 ;; (while (pcomplete-here (pcomplete-dirs))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
49 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
50 ;; Here are the requirements for completion functions:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
51 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
52 ;; @ They must be called "pcomplete/MAJOR-MODE/NAME", or
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
53 ;; "pcomplete/NAME". This is how they are looked up, using the NAME
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
54 ;; specified in the command argument (the argument in first
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
55 ;; position).
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
56 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
57 ;; @ They must be callable with no arguments.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
58 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
59 ;; @ Their return value is ignored. If they actually return normally,
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
60 ;; it means no completions were available.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
61 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
66 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
67 ;; @ To simplify completion function logic, the tag `pcompleted' may
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
68 ;; be thrown with a value of nil in order to abort the function. It
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
69 ;; means that there were no completions available.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
70 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
71 ;; When a completion function is called, the variable `pcomplete-args'
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
72 ;; is in scope, and contains all of the arguments specified on the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
73 ;; command line. The variable `pcomplete-last' is the index of the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
74 ;; last argument in that list.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
75 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
76 ;; The variable `pcomplete-index' is used by the completion code to
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
77 ;; know which argument the completion function is currently examining.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
78 ;; It always begins at 1, meaning the first argument after the command
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
79 ;; name.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
80 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
81 ;; To facilitate writing completion logic, a special macro,
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
82 ;; `pcomplete-here', has been provided which does several things:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
83 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
84 ;; 1. It will throw `pcompleted' (with a value of nil) whenever
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
85 ;; `pcomplete-index' exceeds `pcomplete-last'.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
86 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
87 ;; 2. It will increment `pcomplete-index' if the final argument has
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
88 ;; not been reached yet.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
89 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
90 ;; 3. It will evaluate the form passed to it, and throw the result
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
91 ;; using the `pcomplete-completions' tag, if it is called when
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
92 ;; `pcomplete-index' is pointing to the final argument.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
93 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
94 ;; Sometimes a completion function will want to vary the possible
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
95 ;; completions for an argument based on the previous one. To
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
96 ;; facilitate tests like this, the function `pcomplete-test' and
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
97 ;; `pcomplete-match' are provided. Called with one argument, they
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
98 ;; test the value of the previous command argument. Otherwise, a
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
99 ;; relative index may be given as an optional second argument, where 0
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
100 ;; refers to the current argument, 1 the previous, 2 the one before
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
101 ;; that, etc. The symbols `first' and `last' specify absolute
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
102 ;; offsets.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
103 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
104 ;; Here is an example which will only complete against directories for
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
105 ;; the second argument if the first argument is also a directory:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
106 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
107 ;; (defun pcomplete/example ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
108 ;; (pcomplete-here (pcomplete-entries))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
109 ;; (if (pcomplete-test 'file-directory-p)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
110 ;; (pcomplete-here (pcomplete-dirs))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
111 ;; (pcomplete-here (pcomplete-entries))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
112 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
113 ;; For generating completion lists based on directory contents, see
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
114 ;; the functions `pcomplete-entries', `pcomplete-dirs',
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
115 ;; `pcomplete-executables' and `pcomplete-all-entries'.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
116 ;;
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
117 ;; Consult the documentation for `pcomplete-here' for information
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
118 ;; about its other arguments.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
119
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
120 ;;; Code:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
123
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
124 (defgroup pcomplete nil
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
125 "Programmable completion."
32502
de05ca05f4ff (pcomplete) <defgroup>: Add :version.
Dave Love <fx@gnu.org>
parents: 32451
diff changeset
126 :version "21.1"
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
127 :group 'processes)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
128
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
129 ;;; User Variables:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
130
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
131 (defcustom pcomplete-file-ignore nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
132 "A regexp of filenames to be disregarded during file completion."
35588
31904bdf4350 See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 32502
diff changeset
133 :type '(choice regexp (const :tag "None" nil))
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
134 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
135
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
136 (defcustom pcomplete-dir-ignore nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
137 "A regexp of names to be disregarded during directory completion."
35588
31904bdf4350 See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 32502
diff changeset
138 :type '(choice regexp (const :tag "None" nil))
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
139 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
144 "If non-nil, ignore case when doing filename completion."
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
145 :type 'boolean
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
146 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
147
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
148 (defcustom pcomplete-autolist nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
149 "If non-nil, automatically list possibilities on partial completion.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
150 This mirrors the optional behavior of tcsh."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
151 :type 'boolean
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
152 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
155 "A list of characters which constitute a proper suffix."
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
156 :type '(repeat character)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
157 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
158
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
159 (defcustom pcomplete-recexact nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
160 "If non-nil, use shortest completion if characters cannot be added.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
161 This mirrors the optional behavior of tcsh.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
162
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
163 A non-nil value is useful if `pcomplete-autolist' is non-nil too."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
164 :type 'boolean
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
165 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
166
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
167 (defcustom pcomplete-arg-quote-list nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
168 "List of characters to quote when completing an argument."
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
169 :type '(choice (repeat character)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
170 (const :tag "Don't quote" nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
171 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
172
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
173 (defcustom pcomplete-quote-arg-hook nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
174 "A hook which is run to quote a character within a filename.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
175 Each function is passed both the filename to be quoted, and the index
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
176 to be considered. If the function wishes to provide an alternate
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
177 quoted form, it need only return the replacement string. If no
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
178 function provides a replacement, quoting shall proceed as normal,
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
179 using a backslash to quote any character which is a member of
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
180 `pcomplete-arg-quote-list'."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
181 :type 'hook
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
182 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
183
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
184 (defcustom pcomplete-man-function 'man
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
185 "A function to that will be called to display a manual page.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
186 It will be passed the name of the command to document."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
187 :type 'function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
188 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
189
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
190 (defcustom pcomplete-compare-entry-function 'string-lessp
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
191 "This function is used to order file entries for completion.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
192 The behavior of most all shells is to sort alphabetically."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
193 :type '(radio (function-item string-lessp)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
194 (function-item file-newer-than-file-p)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
195 (function :tag "Other"))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
196 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
197
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
198 (defcustom pcomplete-help nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
199 "A string or function (or nil) used for context-sensitive help.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
200 If a string, it should name an Info node that will be jumped to.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
201 If non-nil, it must a sexp that will be evaluated, and whose
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
202 result will be shown in the minibuffer.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
203 If nil, the function `pcomplete-man-function' will be called with the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
204 current command argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
205 :type '(choice string sexp (const :tag "Use man page" nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
206 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
207
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
208 (defcustom pcomplete-expand-before-complete nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
209 "If non-nil, expand the current argument before completing it.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
210 This means that typing something such as '$HOME/bi' followed by
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
211 \\[pcomplete-argument] will cause the variable reference to be
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
212 resolved first, and the resultant value that will be completed against
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
213 to be inserted in the buffer. Note that exactly what gets expanded
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
214 and how is entirely up to the behavior of the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
215 `pcomplete-parse-arguments-function'."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
216 :type 'boolean
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
217 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
218
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
219 (defcustom pcomplete-parse-arguments-function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
220 'pcomplete-parse-buffer-arguments
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
221 "A function to call to parse the current line's arguments.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
222 It should be called with no parameters, and with point at the position
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
223 of the argument that is to be completed.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
224
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
225 It must either return nil, or a cons cell of the form:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
226
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
227 ((ARG...) (BEG-POS...))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
228
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
229 The two lists must be identical in length. The first gives the final
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
230 value of each command line argument (which need not match the textual
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
231 representation of that argument), and BEG-POS gives the beginning
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
232 position of each argument, as it is seen by the user. The establishes
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
233 a relationship between the fully resolved value of the argument, and
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
234 the textual representation of the argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
235 :type 'function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
236 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
237
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
238 (defcustom pcomplete-cycle-completions t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
239 "If non-nil, hitting the TAB key cycles through the completion list.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
240 Typical Emacs behavior is to complete as much as possible, then pause
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
241 waiting for further input. Then if TAB is hit again, show a list of
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
242 possible completions. When `pcomplete-cycle-completions' is non-nil,
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
243 it acts more like zsh or 4nt, showing the first maximal match first,
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
244 followed by any further matches on each subsequent pressing of the TAB
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
245 key. \\[pcomplete-list] is the key to press if the user wants to see
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
246 the list of possible completions."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
247 :type 'boolean
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
248 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
249
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
250 (defcustom pcomplete-cycle-cutoff-length 5
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
251 "If the number of completions is greater than this, don't cycle.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
252 This variable is a compromise between the traditional Emacs style of
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
253 completion, and the \"cycling\" style. Basically, if there are more
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
254 than this number of completions possible, don't automatically pick the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
255 first one and then expect the user to press TAB to cycle through them.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
256 Typically, when there are a large number of completion possibilities,
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
257 the user wants to see them in a list buffer so that they can know what
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
258 options are available. But if the list is small, it means the user
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
259 has already entered enough input to disambiguate most of the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
260 possibilities, and therefore they are probably most interested in
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
261 cycling through the candidates. Set this value to nil if you want
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
262 cycling to always be enabled."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
263 :type '(choice integer (const :tag "Always cycle" nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
264 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
265
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
266 (defcustom pcomplete-restore-window-delay 1
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
267 "The number of seconds to wait before restoring completion windows.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
268 Once the completion window has been displayed, if the user then goes
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
269 on to type something else, that completion window will be removed from
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
270 the display (actually, the original window configuration before it was
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
271 displayed will be restored), after this many seconds of idle time. If
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
272 set to nil, completion windows will be left on second until the user
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
273 removes them manually. If set to 0, they will disappear immediately
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
274 after the user enters a key other than TAB."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
275 :type '(choice integer (const :tag "Never restore" nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
276 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
277
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
278 (defcustom pcomplete-try-first-hook nil
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
279 "A list of functions which are called before completing an argument.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
280 This can be used, for example, for completing things which might apply
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
281 to all arguments, such as variable names after a $."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
282 :type 'hook
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
283 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
289 (defcustom pcomplete-command-completion-function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
290 (function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
291 (lambda ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
292 (pcomplete-here (pcomplete-executables))))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
293 "Function called for completing the initial command argument."
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
294 :type 'function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
295 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
296
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
297 (defcustom pcomplete-command-name-function 'pcomplete-command-name
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
298 "Function called for determining the current command name."
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
299 :type 'function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
300 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
301
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
302 (defcustom pcomplete-default-completion-function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
303 (function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
304 (lambda ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
305 (while (pcomplete-here (pcomplete-entries)))))
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
306 "Function called when no completion rule can be found.
29876
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
307 This function is used to generate completions for every argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
308 :type 'function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
309 :group 'pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
310
31241
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 29876
diff changeset
311 (defcustom pcomplete-use-paring t
100171
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
312 "If t, pare alternatives that have already been used.
31241
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 29876
diff changeset
313 If nil, you will always see the completion set of possible options, no
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 29876
diff changeset
314 matter which of those options have already been used in previous
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 29876
diff changeset
315 command arguments."
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 29876
diff changeset
316 :type 'boolean
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 29876
diff changeset
317 :group 'pcomplete)
3099993cba0f See ChangeLog
John Wiegley <johnw@newartisans.com>
parents: 29876
diff changeset
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
d42aff5ca541 * align.el:
Lute Kamstra <lute@gnu.org>
parents: 94678
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
329 ;;; Internal Variables:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
330
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
331 ;; for cycling completion support
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
332 (defvar pcomplete-current-completions nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
333 (defvar pcomplete-last-completion-length)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
334 (defvar pcomplete-last-completion-stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
335 (defvar pcomplete-last-completion-raw)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
336 (defvar pcomplete-last-window-config nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
337 (defvar pcomplete-window-restore-timer nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
338
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
339 (make-variable-buffer-local 'pcomplete-current-completions)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
340 (make-variable-buffer-local 'pcomplete-last-completion-length)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
341 (make-variable-buffer-local 'pcomplete-last-completion-stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
342 (make-variable-buffer-local 'pcomplete-last-completion-raw)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
343 (make-variable-buffer-local 'pcomplete-last-window-config)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
344 (make-variable-buffer-local 'pcomplete-window-restore-timer)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
345
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
346 ;; used for altering pcomplete's behavior. These global variables
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
347 ;; should always be nil.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
348 (defvar pcomplete-show-help nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
349 (defvar pcomplete-show-list nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
350 (defvar pcomplete-expand-only-p nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
351
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
352 ;;; User Functions:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
545 "Support extensible programmable completion.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
546 To use this function, just bind the TAB key to it, or add it to your
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
550 pcomplete-cycle-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
551 pcomplete-current-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
552 (memq last-command '(pcomplete
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
553 pcomplete-expand-and-complete
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
554 pcomplete-reverse)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
557 (if (eq this-command 'pcomplete-reverse)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
561 (setcdr (last pcomplete-current-completions 2) nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
562 (nconc pcomplete-current-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
563 (list (car pcomplete-current-completions)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
564 (setq pcomplete-current-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
565 (cdr pcomplete-current-completions)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
568 nil pcomplete-last-completion-raw))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
569 (setq pcomplete-current-completions nil
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
570 pcomplete-last-completion-raw nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
571 (catch 'pcompleted
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
572 (let* ((pcomplete-stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
573 pcomplete-seen pcomplete-norm-func
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
574 pcomplete-args pcomplete-last pcomplete-index
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
575 (pcomplete-autolist pcomplete-autolist)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
576 (pcomplete-suffix-list pcomplete-suffix-list)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
577 (completions (pcomplete-completions))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
578 (result (pcomplete-do-complete pcomplete-stub completions)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
579 (and result
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
580 (not (eq (car result) 'listed))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
581 (cdr result)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
582 (pcomplete-insert-entry pcomplete-stub (cdr result)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
583 (memq (car result)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
584 '(sole shortest))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
585 pcomplete-last-completion-raw))))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
586
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
587 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
588 (defun pcomplete-reverse ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
589 "If cycling completion is in use, cycle backwards."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
590 (interactive)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
591 (call-interactively 'pcomplete))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
592
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
593 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
594 (defun pcomplete-expand-and-complete ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
595 "Expand the textual value of the current argument.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
596 This will modify the current buffer."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
597 (interactive)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
598 (let ((pcomplete-expand-before-complete t))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
599 (pcomplete)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
600
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
601 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
602 (defun pcomplete-continue ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
603 "Complete without reference to any cycling completions."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
604 (interactive)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
605 (setq pcomplete-current-completions nil
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
606 pcomplete-last-completion-raw nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
607 (call-interactively 'pcomplete))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
608
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
609 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
610 (defun pcomplete-expand ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
611 "Expand the textual value of the current argument.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
612 This will modify the current buffer."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
613 (interactive)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
614 (let ((pcomplete-expand-before-complete t)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
615 (pcomplete-expand-only-p t))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
616 (pcomplete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
620 (while pcomplete-current-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
621 (unless (pcomplete-insert-entry
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
625 (setq pcomplete-current-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
626 (cdr pcomplete-current-completions))))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
627
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
628 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
629 (defun pcomplete-help ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
630 "Display any help information relative to the current argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
631 (interactive)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
632 (let ((pcomplete-show-help t))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
633 (pcomplete)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
634
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
635 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
636 (defun pcomplete-list ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
637 "Show the list of possible completions for the current argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
638 (interactive)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
639 (when (and pcomplete-cycle-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
640 pcomplete-current-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
643 (setq pcomplete-current-completions nil
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
644 pcomplete-last-completion-raw nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
645 (let ((pcomplete-show-list t))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
646 (pcomplete)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
647
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
648 ;;; Internal Functions:
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
649
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
650 ;; argument handling
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
651
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
652 ;; for the sake of the bye-compiler, when compiling other files that
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
653 ;; contain completion functions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
654 (defvar pcomplete-args nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
655 (defvar pcomplete-begins nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
656 (defvar pcomplete-last nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
657 (defvar pcomplete-index nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
658 (defvar pcomplete-stub nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
659 (defvar pcomplete-seen nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
660 (defvar pcomplete-norm-func nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
661
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
662 (defun pcomplete-arg (&optional index offset)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
663 "Return the textual content of the INDEXth argument.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
664 INDEX is based from the current processing position. If INDEX is
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
665 positive, values returned are closer to the command argument; if
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
666 negative, they are closer to the last argument. If the INDEX is
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
667 outside of the argument list, nil is returned. The default value for
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
668 INDEX is 0, meaning the current argument being examined.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
669
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
670 The special indices `first' and `last' may be used to access those
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
671 parts of the list.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
672
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
673 The OFFSET argument is added to/taken away from the index that will be
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
674 used. This is really only useful with `first' and `last', for
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
675 accessing absolute argument positions."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
676 (setq index
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
677 (if (eq index 'first)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
678 0
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
679 (if (eq index 'last)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
680 pcomplete-last
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
681 (- pcomplete-index (or index 0)))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
682 (if offset
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
683 (setq index (+ index offset)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
684 (nth index pcomplete-args))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
685
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
686 (defun pcomplete-begin (&optional index offset)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
687 "Return the beginning position of the INDEXth argument.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
688 See the documentation for `pcomplete-arg'."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
689 (setq index
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
690 (if (eq index 'first)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
691 0
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
692 (if (eq index 'last)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
693 pcomplete-last
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
694 (- pcomplete-index (or index 0)))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
695 (if offset
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
696 (setq index (+ index offset)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
697 (nth index pcomplete-begins))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
698
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
699 (defsubst pcomplete-actual-arg (&optional index offset)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
702 that the last argument evaluated to. This function returns what the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
703 user actually typed in."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
704 (buffer-substring (pcomplete-begin index offset) (point)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
705
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
706 (defsubst pcomplete-next-arg ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
707 "Move the various pointers to the next argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
708 (setq pcomplete-index (1+ pcomplete-index)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
709 pcomplete-stub (pcomplete-arg))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
710 (if (> pcomplete-index pcomplete-last)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
711 (progn
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
712 (message "No completions")
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
713 (throw 'pcompleted nil))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
714
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
715 (defun pcomplete-command-name ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
716 "Return the command name of the first argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
717 (file-name-nondirectory (pcomplete-arg 'first)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
718
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
719 (defun pcomplete-match (regexp &optional index offset start)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
720 "Like `string-match', but on the current completion argument."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
721 (let ((arg (pcomplete-arg (or index 1) offset)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
722 (if arg
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
723 (string-match regexp arg start)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
724 (throw 'pcompleted nil))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
725
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
728 (let ((arg (pcomplete-arg (or index 1) offset)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
729 (if arg
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
730 (match-string which arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
731 (throw 'pcompleted nil))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
732
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
733 (defalias 'pcomplete-match-beginning 'match-beginning)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
734 (defalias 'pcomplete-match-end 'match-end)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
735
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
736 (defsubst pcomplete--test (pred arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
737 "Perform a programmable completion predicate match."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
738 (and pred
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
739 (cond ((eq pred t) t)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
740 ((functionp pred)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
741 (funcall pred arg))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
742 ((stringp pred)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
743 (string-match (concat "^" pred "$") arg)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
744 pred))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
745
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
746 (defun pcomplete-test (predicates &optional index offset)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
747 "Predicates to test the current programmable argument with."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
748 (let ((arg (pcomplete-arg (or index 1) offset)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
749 (unless (null predicates)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
750 (if (not (listp predicates))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
751 (pcomplete--test predicates arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
752 (let ((pred predicates)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
753 found)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
754 (while (and pred (not found))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
755 (setq found (pcomplete--test (car pred) arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
756 pred (cdr pred)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
757 found)))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
758
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
759 (defun pcomplete-parse-buffer-arguments ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
760 "Parse whitespace separated arguments in the current region."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
761 (let ((begin (point-min))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
762 (end (point-max))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
763 begins args)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
764 (save-excursion
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
765 (goto-char begin)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
766 (while (< (point) end)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
774
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
775 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
776 (defun pcomplete-comint-setup (completef-sym)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
777 "Setup a comint buffer to use pcomplete.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
781 (set (make-local-variable 'pcomplete-parse-arguments-function)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
788 (if elem
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
791
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
792 ;;;###autoload
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
800 (defun pcomplete-parse-comint-arguments ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
801 "Parse whitespace separated arguments in the current region."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
802 (let ((begin (save-excursion (comint-bol nil) (point)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
803 (end (point))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
804 begins args)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
805 (save-excursion
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
806 (goto-char begin)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
807 (while (< (point) end)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
810 (let ((skip t))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
811 (while skip
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
812 (skip-chars-forward "^ \t\n")
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
813 (if (eq (char-before) ?\\)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
814 (skip-chars-forward " \t\n")
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
819
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
820 (defun pcomplete-parse-arguments (&optional expand-p)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
821 "Parse the command line arguments. Most completions need this info."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
822 (let ((results (funcall pcomplete-parse-arguments-function)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
823 (when results
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
824 (setq pcomplete-args (or (car results) (list ""))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
825 pcomplete-begins (or (cdr results) (list (point)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
826 pcomplete-last (1- (length pcomplete-args))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
827 pcomplete-index 0
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
828 pcomplete-stub (pcomplete-arg 'last))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
829 (let ((begin (pcomplete-begin 'last)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
834 (common-stub (car completions))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
835 (c completions)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
836 (len (length common-stub)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
837 (while (and c (> len 0))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
838 (while (and (> len 0)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
839 (not (string=
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
840 (substring common-stub 0 len)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
841 (substring (car c) 0
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
842 (min (length (car c))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
843 len)))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
844 (setq len (1- len)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
845 (setq c (cdr c)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
846 (setq pcomplete-stub (substring common-stub 0 len)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
847 pcomplete-autolist t)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
848 (when (and begin (not pcomplete-show-list))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
849 (delete-region begin (point))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
850 (pcomplete-insert-entry "" pcomplete-stub))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
851 (throw 'pcomplete-completions completions))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
852 (when expand-p
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
853 (if (stringp pcomplete-stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
854 (when begin
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
855 (delete-region begin (point))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
856 (insert-and-inherit pcomplete-stub))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
857 (if (and (listp pcomplete-stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
858 pcomplete-expand-only-p)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
859 ;; this is for the benefit of `pcomplete-expand'
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
860 (setq pcomplete-last-completion-length (- (point) begin)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
861 pcomplete-current-completions pcomplete-stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
862 (error "Cannot expand argument"))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
863 (if pcomplete-expand-only-p
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
864 (throw 'pcompleted t)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
865 pcomplete-args))))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
866
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
867 (defun pcomplete-quote-argument (filename)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
868 "Return FILENAME with magic characters quoted.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
869 Magic characters are those in `pcomplete-arg-quote-list'."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
870 (if (null pcomplete-arg-quote-list)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
883
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
884 ;; file-system completion lists
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
885
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
886 (defsubst pcomplete-dirs-or-entries (&optional regexp predicate)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
897
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
898 (defun pcomplete-entries (&optional regexp predicate)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
899 "Complete against a list of directory candidates.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
900 If REGEXP is non-nil, it is a regular expression used to refine the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
901 match (files not matching the REGEXP will be excluded).
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
902 If PREDICATE is non-nil, it will also be used to refine the match
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
965
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
966 (defsubst pcomplete-all-entries (&optional regexp predicate)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
967 "Like `pcomplete-entries', but doesn't ignore any entries."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
968 (let (pcomplete-file-ignore
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
969 pcomplete-dir-ignore)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
970 (pcomplete-entries regexp predicate)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
971
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
972 (defsubst pcomplete-dirs (&optional regexp)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
973 "Complete amongst a list of directories."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
974 (pcomplete-entries regexp 'file-directory-p))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
975
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
976 ;; generation of completion lists
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
977
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
978 (defun pcomplete-find-completion-function (command)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
979 "Find the completion function to call for the given COMMAND."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
980 (let ((sym (intern-soft
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
981 (concat "pcomplete/" (symbol-name major-mode) "/" command))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
982 (unless sym
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
983 (setq sym (intern-soft (concat "pcomplete/" command))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
984 (and sym (fboundp sym) sym)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
985
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
986 (defun pcomplete-completions ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
987 "Return a list of completions for the current argument position."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
988 (catch 'pcomplete-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
989 (when (pcomplete-parse-arguments pcomplete-expand-before-complete)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
990 (if (= pcomplete-index pcomplete-last)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
991 (funcall pcomplete-command-completion-function)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
992 (let ((sym (or (pcomplete-find-completion-function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
993 (funcall pcomplete-command-name-function))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
994 pcomplete-default-completion-function)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
995 (ignore
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
996 (pcomplete-next-arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
997 (funcall sym)))))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
998
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
999 (defun pcomplete-opt (options &optional prefix no-ganging args-follow)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1000 "Complete a set of OPTIONS, each beginning with PREFIX (?- by default).
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1006 (if (and (= pcomplete-index pcomplete-last)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1007 (string= (pcomplete-arg) "-"))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1008 (let ((len (length options))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1009 (index 0)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1010 char choices)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1011 (while (< index len)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1012 (setq char (aref options index))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1013 (if (eq char ?\()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1014 (let ((result (read-from-string options index)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1015 (setq index (cdr result)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1018 (setq index (1+ index))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1019 (throw 'pcomplete-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1020 (mapcar
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1021 (function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1022 (lambda (opt)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1023 (concat "-" opt)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1024 (pcomplete-uniqify-list choices))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1025 (let ((arg (pcomplete-arg)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1026 (when (and (> (length arg) 1)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1027 (stringp arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1028 (eq (aref arg 0) (or prefix ?-)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1029 (pcomplete-next-arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1030 (let ((char (aref arg 1))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1031 (len (length options))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1032 (index 0)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1033 opt-char arg-char result)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1034 (while (< (1+ index) len)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1035 (setq opt-char (aref options index)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1036 arg-char (aref options (1+ index)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1037 (if (eq arg-char ?\()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1038 (setq result
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1039 (read-from-string options (1+ index))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1040 index (cdr result)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1041 result (car result))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1042 (setq result nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1043 (when (and (eq char opt-char)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1044 (memq arg-char '(?\( ?/ ?* ?? ?.)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1045 (if (< pcomplete-index pcomplete-last)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1046 (pcomplete-next-arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1047 (throw 'pcomplete-completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1048 (cond ((eq arg-char ?/) (pcomplete-dirs))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1049 ((eq arg-char ?*) (pcomplete-executables))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1050 ((eq arg-char ??) nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1051 ((eq arg-char ?.) (pcomplete-entries))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1052 ((eq arg-char ?\() (eval result))))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1053 (setq index (1+ index))))))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1054
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1057 See the documentation for `pcomplete-here'."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1058 (if (< pcomplete-index pcomplete-last)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1059 (progn
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1060 (if (eq paring 0)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1061 (setq pcomplete-seen nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1062 (unless (eq paring t)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1069 (pcomplete-next-arg)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1070 t)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1071 (when pcomplete-show-help
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1072 (pcomplete--help)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1073 (throw 'pcompleted t))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1074 (if stub
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1075 (setq pcomplete-stub stub))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1076 (if (or (eq paring t) (eq paring 0))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1077 (setq pcomplete-seen nil)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1078 (setq pcomplete-norm-func (or paring 'file-truename)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1079 (unless form-only
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1087
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1092 string, use it as the completion stub instead of the default (which is
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1093 the entire text of the current argument).
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1094
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1095 For an example of when you might want to use STUB: if the current
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1096 argument text is 'long-path-name/', you don't want the completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1097 list display to be cluttered by 'long-path-name/' appearing at the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1100 does not begin with this string for every entry, the current argument
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1101 won't complete correctly.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1102
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1103 The solution is to specify a relative stub. It allows you to
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1104 substitute a different argument from the current argument, almost
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1105 always for the sake of efficiency.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1106
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1107 If PARING is nil, this argument will be pared against previous
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1114
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1115 If FORM-ONLY is non-nil, only the result of FORM will be used to
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1116 generate the completions list. This means that the hook
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1121
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1122 (defmacro pcomplete-here* (&optional form stub form-only)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1126
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1127 ;; display support
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1128
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1129 (defun pcomplete-restore-windows ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1130 "If the only window change was due to Completions, restore things."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1131 (if pcomplete-last-window-config
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1132 (let* ((cbuf (get-buffer "*Completions*"))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1135 (bury-buffer cbuf)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1136 (set-window-configuration pcomplete-last-window-config))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1137 (setq pcomplete-last-window-config nil
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1138 pcomplete-window-restore-timer nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1139
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1140 ;; Abstractions so that the code below will work for both Emacs 20 and
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1141 ;; XEmacs 21
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1151 (aref (read-key-sequence prompt) 0)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1152
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1153 (defun pcomplete-show-completions (completions)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1154 "List in help buffer sorted COMPLETIONS.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1193
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1194 ;; insert completion at point
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1195
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1196 (defun pcomplete-insert-entry (stub entry &optional addsuffix raw-p)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1197 "Insert a completion entry at point.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1198 Returns non-nil if a space was appended at the end."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1199 (let ((here (point)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1200 (if (not pcomplete-ignore-case)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1201 (insert-and-inherit (if raw-p
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1202 (substring entry (length stub))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1203 (pcomplete-quote-argument
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1204 (substring entry (length stub)))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1205 ;; the stub is not quoted at this time, so to determine the
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1211 ;; if there is already a backslash present to handle the first
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1212 ;; character, don't bother quoting it
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1213 (when (eq (char-before) ?\\)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1214 (insert-and-inherit (substring entry 0 1))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1215 (setq entry (substring entry 1)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1216 (insert-and-inherit (if raw-p
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1217 entry
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1218 (pcomplete-quote-argument entry))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1219 (let (space-added)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1220 (when (and (not (memq (char-before) pcomplete-suffix-list))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1223 (setq space-added t))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1224 (setq pcomplete-last-completion-length (- (point) here)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1225 pcomplete-last-completion-stub stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1226 space-added)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1227
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1228 ;; selection of completions
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1229
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1230 (defun pcomplete-do-complete (stub completions)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1231 "Dynamically complete at point using STUB and COMPLETIONS.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1232 This is basically just a wrapper for `pcomplete-stub' which does some
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1233 extra checking, and munging of the COMPLETIONS list."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1234 (unless (stringp stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1235 (message "Cannot complete argument")
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1236 (throw 'pcompleted nil))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1237 (if (null completions)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1238 (ignore
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1239 (if (and stub (> (length stub) 0))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1240 (message "No completions of %s" stub)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1241 (message "No completions")))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1258 ;; OK, we've got a list of completions.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1262 (pcomplete-stub stub completions))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1263
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1264 (defun pcomplete-stub (stub candidates &optional cycle-p)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1265 "Dynamically complete STUB from CANDIDATES list.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1266 This function inserts completion characters at point by completing
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1267 STUB from the strings in CANDIDATES. A completions listing may be
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1268 shown in a help buffer if completion is ambiguous.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1269
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1270 Returns nil if no completion was inserted.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1271 Returns `sole' if completed with the only completion match.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1272 Returns `shortest' if completed with the shortest of the matches.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1273 Returns `partial' if completed as far as possible with the matches.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1274 Returns `listed' if a completion listing was shown.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1275
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1276 See also `pcomplete-filename'."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1319
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1320 ;; context sensitive help
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1321
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1322 (defun pcomplete--help ()
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1325 (if (and pcomplete-help
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1326 (or (and (stringp pcomplete-help)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1327 (fboundp 'Info-goto-node))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1328 (listp pcomplete-help)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1331 (save-window-excursion (info))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1332 (switch-to-buffer-other-window "*info*")
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1333 (funcall (symbol-function 'Info-goto-node) pcomplete-help))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1334 (if pcomplete-man-function
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1335 (let ((cmd (funcall pcomplete-command-name-function)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1336 (if (and cmd (> (length cmd) 0))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1337 (funcall pcomplete-man-function cmd)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1338 (message "No context-sensitive help available"))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1339
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1340 ;; general utilities
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1341
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1342 (defun pcomplete-pare-list (l r &optional pred)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1343 "Destructively remove from list L all elements matching any in list R.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1344 Test is done using `equal'.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1345 If PRED is non-nil, it is a function used for further removal.
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1346 Returns the resultant list."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1347 (while (and l (or (and r (member (car l) r))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1348 (and pred
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1349 (funcall pred (car l)))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1350 (setq l (cdr l)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1351 (let ((m l))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1352 (while m
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1353 (while (and (cdr m)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1354 (or (and r (member (cadr m) r))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1355 (and pred
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1356 (funcall pred (cadr m)))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1357 (setcdr m (cddr m)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1358 (setq m (cdr m))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1359 l)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1360
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1361 (defun pcomplete-uniqify-list (l)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1362 "Sort and remove multiples in L."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1363 (setq l (sort l 'string-lessp))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1364 (let ((m l))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1365 (while m
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1366 (while (and (cdr m)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1367 (string= (car m)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1368 (cadr m)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1369 (setcdr m (cddr m)))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1370 (setq m (cdr m))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1371 l)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1372
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1373 (defun pcomplete-process-result (cmd &rest args)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1374 "Call CMD using `call-process' and return the simplest result."
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1375 (with-temp-buffer
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1376 (apply 'call-process cmd nil t nil args)
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1377 (skip-chars-backward "\n")
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1378 (buffer-substring (point-min) (point))))
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1379
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1380 ;; create a set of aliases which allow completion functions to be not
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1381 ;; quite so verbose
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
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
edfec1c0d511 *** empty log message ***
Gerd Moellmann <gerd@gnu.org>
parents:
diff changeset
1395 ;;; pcomplete.el ends here