annotate lisp/obsolete/complete.el @ 112426:59f7ce1a78c6

* admin/notes/bzrmerge: Comment on skipped revisions.
author Glenn Morris <rgm@gnu.org>
date Sat, 22 Jan 2011 11:44:38 -0800
parents ef719132ddfa
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
15261
bd56cdc4d07b Fixed up initial line
Erik Naggum <erik@naggum.no>
parents: 14765
diff changeset
1 ;;; complete.el --- partial completion mechanism plus other goodies
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
2
74439
ddcbd2c1b70d Update copyright years.
Glenn Morris <rgm@gnu.org>
parents: 72310
diff changeset
3 ;; Copyright (C) 1990, 1991, 1992, 1993, 1999, 2000, 2001, 2002, 2003,
112228
417b1e4d63cd Merge from emacs-23
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 108765
diff changeset
4 ;; 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
6 ;; Author: Dave Gillespie <daveg@synaptics.com>
22250
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 22142
diff changeset
7 ;; Keywords: abbrev convenience
107849
c35518fa0d56 Move complete.el to lisp/obsolete.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107390
diff changeset
8 ;; Obsolete-since: 24.1
107390
bb307bf2e752 Fix keywords.
Juri Linkov <juri@jurta.org>
parents: 106815
diff changeset
9 ;;
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 ;; Special thanks to Hallvard Furuseth for his many ideas and contributions.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
12 ;; This file is part of GNU Emacs.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
13
94678
ee5932bf781d Switch to recommended form of GPLv3 permissions notice.
Glenn Morris <rgm@gnu.org>
parents: 94302
diff changeset
14 ;; GNU Emacs is free software: you can redistribute it and/or modify
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
15 ;; 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: 94302
diff changeset
16 ;; 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: 94302
diff changeset
17 ;; (at your option) any later version.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
18
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
19 ;; GNU Emacs is distributed in the hope that it will be useful,
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
20 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
21 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
22 ;; GNU General Public License for more details.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
23
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
24 ;; 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: 94302
diff changeset
25 ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
26
7942
bc5dccc5375f Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7844
diff changeset
27 ;;; Commentary:
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
28
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
29 ;; Extended completion for the Emacs minibuffer.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
30 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
31 ;; The basic idea is that the command name or other completable text is
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
32 ;; divided into words and each word is completed separately, so that
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
33 ;; "M-x p-b" expands to "M-x print-buffer". If the entry is ambiguous
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
34 ;; each word is completed as much as possible and then the cursor is
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
35 ;; left at the first position where typing another letter will resolve
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
36 ;; the ambiguity.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
37 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
38 ;; Word separators for this purpose are hyphen, space, and period.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
39 ;; These would most likely occur in command names, Info menu items,
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
40 ;; and file names, respectively. But all word separators are treated
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
41 ;; alike at all times.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
42 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
43 ;; This completion package replaces the old-style completer's key
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
44 ;; bindings for TAB, SPC, RET, and `?'. The old completer is still
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
45 ;; available on the Meta versions of those keys. If you set
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
46 ;; PC-meta-flag to nil, the old completion keys will be left alone
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
47 ;; and the partial completer will use the Meta versions of the keys.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
48
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
49
22142
a63710b545db Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 21266
diff changeset
50 ;; Usage: M-x partial-completion-mode. During completable minibuffer entry,
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
51 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
52 ;; TAB means to do a partial completion;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
53 ;; SPC means to do a partial complete-word;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
54 ;; RET means to do a partial complete-and-exit;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
55 ;; ? means to do a partial completion-help.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
56 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
57 ;; If you set PC-meta-flag to nil, then TAB, SPC, RET, and ? perform
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
58 ;; original Emacs completions, and M-TAB etc. do partial completion.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
59 ;; To do this, put the command,
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
60 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
61 ;; (setq PC-meta-flag nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
62 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
63 ;; in your .emacs file. To load partial completion automatically, put
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
64 ;;
22142
a63710b545db Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 21266
diff changeset
65 ;; (partial-completion-mode t)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
66 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
67 ;; in your .emacs file, too. Things will be faster if you byte-compile
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
68 ;; this file when you install it.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
69 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
70 ;; As an extra feature, in cases where RET would not normally
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
71 ;; complete (such as `C-x b'), the M-RET key will always do a partial
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
72 ;; complete-and-exit. Thus `C-x b f.c RET' will select or create a
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
73 ;; buffer called "f.c", but `C-x b f.c M-RET' will select the existing
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
74 ;; buffer whose name matches that pattern (perhaps "filing.c").
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
75 ;; (PC-meta-flag does not affect this behavior; M-RET used to be
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
76 ;; undefined in this situation.)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
77 ;;
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
78 ;; The regular M-TAB (lisp-complete-symbol) command also supports
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
79 ;; partial completion in this package.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
80
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
81 ;; In addition, this package includes a feature for accessing include
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 ;; files. For example, `C-x C-f <sys/time.h> RET' reads the file
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 ;; /usr/include/sys/time.h. The variable PC-include-file-path is a
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 ;; list of directories in which to search for include files. Completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 ;; is supported in include file names.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87
7942
bc5dccc5375f Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7844
diff changeset
88 ;;; Code:
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
90 (defgroup partial-completion nil
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
91 "Partial Completion of items."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
92 :prefix "pc-"
22250
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 22142
diff changeset
93 :group 'minibuffer
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 22142
diff changeset
94 :group 'convenience)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
96 (defcustom PC-first-char 'find-file
69309
f0678aafb24e (PC-expand-many-files): Try be more careful when parsing the shell's output.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
97 "Control how the first character of a string is to be interpreted.
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
98 If nil, the first character of a string is not taken literally if it is a word
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
99 delimiter, so that \".e\" matches \"*.e*\".
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
100 If t, the first character of a string is always taken literally even if it is a
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
101 word delimiter, so that \".e\" matches \".e*\".
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
102 If non-nil and non-t, the first character is taken literally only for file name
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
103 completion."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
104 :type '(choice (const :tag "delimiter" nil)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
105 (const :tag "literal" t)
22570
6cfe82c80677 (PC-first-char): Use `other' widget type.
Andreas Schwab <schwab@suse.de>
parents: 22250
diff changeset
106 (other :tag "find-file" find-file))
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
107 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
108
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
109 (defcustom PC-meta-flag t
69309
f0678aafb24e (PC-expand-many-files): Try be more careful when parsing the shell's output.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
110 "If non-nil, TAB means PC completion and M-TAB means normal completion.
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
111 Otherwise, TAB means normal completion and M-TAB means Partial Completion."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
112 :type 'boolean
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
113 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
114
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
115 (defcustom PC-word-delimiters "-_. "
69309
f0678aafb24e (PC-expand-many-files): Try be more careful when parsing the shell's output.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
116 "A string of characters treated as word delimiters for completion.
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
117 Some arcane rules:
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
118 If `]' is in this string, it must come first.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
119 If `^' is in this string, it must not come first.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
120 If `-' is in this string, it must come first or right after `]'.
60920
242e5edee3ce * complete.el, thumbs.el: Replace `legal' with `valid'.
Werner LEMBERG <wl@gnu.org>
parents: 53258
diff changeset
121 In other words, if S is this string, then `[S]' must be a valid Emacs regular
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
122 expression (not containing character ranges like `a-z')."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
123 :type 'string
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
124 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
125
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
126 (defcustom PC-include-file-path '("/usr/include" "/usr/local/include")
69309
f0678aafb24e (PC-expand-many-files): Try be more careful when parsing the shell's output.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
127 "A list of directories in which to look for include files.
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
128 If nil, means use the colon-separated path in the variable $INCPATH instead."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
129 :type '(repeat directory)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
130 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
131
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
132 (defcustom PC-disable-includes nil
69309
f0678aafb24e (PC-expand-many-files): Try be more careful when parsing the shell's output.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 68651
diff changeset
133 "If non-nil, include-file support in \\[find-file] is disabled."
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
134 :type 'boolean
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
135 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
136
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
137 (defvar PC-default-bindings t
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
138 "If non-nil, default partial completion key bindings are suppressed.")
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
139
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
140 (defvar PC-env-vars-alist nil
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
141 "A list of the environment variable names and values.")
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
142
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
143
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
144 (defun PC-bindings (bind)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
145 (let ((completion-map minibuffer-local-completion-map)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
146 (must-match-map minibuffer-local-must-match-map))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
147 (cond ((not bind)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
148 ;; These bindings are the default bindings. It would be better to
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
149 ;; restore the previous bindings.
76389
dea4a6c39682 (PC-bindings): Rebind M-TAB in read-expression-map.
Chong Yidong <cyd@stupidchicken.com>
parents: 76378
diff changeset
150 (define-key read-expression-map "\e\t" 'lisp-complete-symbol)
dea4a6c39682 (PC-bindings): Rebind M-TAB in read-expression-map.
Chong Yidong <cyd@stupidchicken.com>
parents: 76378
diff changeset
151
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
152 (define-key completion-map "\t" 'minibuffer-complete)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
153 (define-key completion-map " " 'minibuffer-complete-word)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
154 (define-key completion-map "?" 'minibuffer-completion-help)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
155
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
156 (define-key must-match-map "\r" 'minibuffer-complete-and-exit)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
157 (define-key must-match-map "\n" 'minibuffer-complete-and-exit)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
158
76378
7722d7feb5cc (PC-bindings): Remap lisp-complete-symbol to
Kim F. Storm <storm@cua.dk>
parents: 76375
diff changeset
159 (define-key global-map [remap lisp-complete-symbol] nil))
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
160 (PC-default-bindings
76389
dea4a6c39682 (PC-bindings): Rebind M-TAB in read-expression-map.
Chong Yidong <cyd@stupidchicken.com>
parents: 76378
diff changeset
161 (define-key read-expression-map "\e\t" 'PC-lisp-complete-symbol)
dea4a6c39682 (PC-bindings): Rebind M-TAB in read-expression-map.
Chong Yidong <cyd@stupidchicken.com>
parents: 76378
diff changeset
162
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
163 (define-key completion-map "\t" 'PC-complete)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
164 (define-key completion-map " " 'PC-complete-word)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
165 (define-key completion-map "?" 'PC-completion-help)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
166
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
167 (define-key completion-map "\e\t" 'PC-complete)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
168 (define-key completion-map "\e " 'PC-complete-word)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
169 (define-key completion-map "\e\r" 'PC-force-complete-and-exit)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
170 (define-key completion-map "\e\n" 'PC-force-complete-and-exit)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
171 (define-key completion-map "\e?" 'PC-completion-help)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
172
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
173 (define-key must-match-map "\r" 'PC-complete-and-exit)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
174 (define-key must-match-map "\n" 'PC-complete-and-exit)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
175
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
176 (define-key must-match-map "\e\r" 'PC-complete-and-exit)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
177 (define-key must-match-map "\e\n" 'PC-complete-and-exit)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
178
76378
7722d7feb5cc (PC-bindings): Remap lisp-complete-symbol to
Kim F. Storm <storm@cua.dk>
parents: 76375
diff changeset
179 (define-key global-map [remap lisp-complete-symbol] 'PC-lisp-complete-symbol)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
180
76774
a98404fc2d91 (PC-do-completion-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76756
diff changeset
181 (defvar PC-do-completion-end nil
a98404fc2d91 (PC-do-completion-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76756
diff changeset
182 "Internal variable used by `PC-do-completion'.")
a98404fc2d91 (PC-do-completion-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76756
diff changeset
183
77211
43c40e825164 (PC-goto-end, PC-do-completion-end): Make buffer-local.
Glenn Morris <rgm@gnu.org>
parents: 77208
diff changeset
184 (make-variable-buffer-local 'PC-do-completion-end)
43c40e825164 (PC-goto-end, PC-do-completion-end): Make buffer-local.
Glenn Morris <rgm@gnu.org>
parents: 77208
diff changeset
185
77208
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
186 (defvar PC-goto-end nil
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
187 "Internal variable set in `PC-do-completion', used in
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
188 `choose-completion-string-functions'.")
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
189
77211
43c40e825164 (PC-goto-end, PC-do-completion-end): Make buffer-local.
Glenn Morris <rgm@gnu.org>
parents: 77208
diff changeset
190 (make-variable-buffer-local 'PC-goto-end)
43c40e825164 (PC-goto-end, PC-do-completion-end): Make buffer-local.
Glenn Morris <rgm@gnu.org>
parents: 77208
diff changeset
191
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
192 ;;;###autoload
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
193 (define-minor-mode partial-completion-mode
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
194 "Toggle Partial Completion mode.
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
195 With prefix ARG, turn Partial Completion mode on if ARG is positive.
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
196
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
197 When Partial Completion mode is enabled, TAB (or M-TAB if `PC-meta-flag' is
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
198 nil) is enhanced so that if some string is divided into words and each word is
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
199 delimited by a character in `PC-word-delimiters', partial words are completed
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
200 as much as possible and `*' characters are treated likewise in file names.
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
201
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
202 For example, M-x p-c-m expands to M-x partial-completion-mode since no other
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
203 command begins with that sequence of characters, and
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
204 \\[find-file] f_b.c TAB might complete to foo_bar.c if that file existed and no
71436
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
205 other file in that directory begins with that sequence of characters.
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
206
36033
0a150990aa8c (partial-completion-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 33183
diff changeset
207 Unless `PC-disable-includes' is non-nil, the `<...>' sequence is interpreted
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
208 specially in \\[find-file]. For example,
36033
0a150990aa8c (partial-completion-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 33183
diff changeset
209 \\[find-file] <sys/time.h> RET finds the file `/usr/include/sys/time.h'.
67008
13e3867c55fb (partial-completion-mode): Mention completion-auto-help in the doc string.
Eli Zaretskii <eliz@gnu.org>
parents: 64762
diff changeset
210 See also the variable `PC-include-file-path'.
13e3867c55fb (partial-completion-mode): Mention completion-auto-help in the doc string.
Eli Zaretskii <eliz@gnu.org>
parents: 64762
diff changeset
211
13e3867c55fb (partial-completion-mode): Mention completion-auto-help in the doc string.
Eli Zaretskii <eliz@gnu.org>
parents: 64762
diff changeset
212 Partial Completion mode extends the meaning of `completion-auto-help' (which
67596
b5e49d33eeef (partial-completion-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67161
diff changeset
213 see), so that if it is neither nil nor t, Emacs shows the `*Completions*'
b5e49d33eeef (partial-completion-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67161
diff changeset
214 buffer only on the second attempt to complete. That is, if TAB finds nothing
b5e49d33eeef (partial-completion-mode): Doc fix.
Richard M. Stallman <rms@gnu.org>
parents: 67161
diff changeset
215 to complete, the first TAB just says \"Next char not unique\" and the
67622
bd00b5fc4e4d (PC-do-completion): Remove `(equal (point) beg)' to
Juri Linkov <juri@jurta.org>
parents: 67596
diff changeset
216 second TAB brings up the `*Completions*' buffer."
33183
1988cb3ecd2f (partial-completion-mode): Drop unneeded positional args.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 31971
diff changeset
217 :global t :group 'partial-completion
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
218 ;; Deal with key bindings...
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
219 (PC-bindings partial-completion-mode)
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
220 ;; Deal with include file feature...
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
221 (cond ((not partial-completion-mode)
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
222 (remove-hook 'find-file-not-found-functions 'PC-look-for-include-file))
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
223 ((not PC-disable-includes)
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
224 (add-hook 'find-file-not-found-functions 'PC-look-for-include-file)))
70076
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
225 ;; Adjust the completion selection in *Completion* buffers to the way
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
226 ;; we work. The default minibuffer completion code only completes the
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
227 ;; text before point and leaves the text after point alone (new in
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
228 ;; Emacs-22). In contrast we use the whole text and we even sometimes
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
229 ;; move point to a place before EOB, to indicate the first position where
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
230 ;; there's a difference, so when the user uses choose-completion, we have
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
231 ;; to trick choose-completion into replacing the whole minibuffer text
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
232 ;; rather than only the text before point. --Stef
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
233 (funcall
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
234 (if partial-completion-mode 'add-hook 'remove-hook)
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
235 'choose-completion-string-functions
105601
68686d39c93a Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101614
diff changeset
236 (lambda (choice buffer &rest ignored)
77208
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
237 ;; When completing M-: (lisp- ) with point before the ), it is
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
238 ;; not appropriate to go to point-max (unlike the filename case).
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
239 (if (and (not PC-goto-end)
105601
68686d39c93a Replace completion-base-size by completion-base-position to fix bugs
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 101614
diff changeset
240 (minibufferp buffer))
77208
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
241 (goto-char (point-max))
76774
a98404fc2d91 (PC-do-completion-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76756
diff changeset
242 ;; Need a similar hack for the non-minibuffer-case -- gm.
76787
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
243 (when PC-do-completion-end
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
244 (goto-char PC-do-completion-end)
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
245 (setq PC-do-completion-end nil)))
77208
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
246 (setq PC-goto-end nil)
71517
983727db2901 (partial-completion-mode): In lambda for
Juri Linkov <juri@jurta.org>
parents: 71436
diff changeset
247 nil))
70076
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
248 ;; Build the env-completion and mapping table.
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
249 (when (and partial-completion-mode (null PC-env-vars-alist))
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
250 (setq PC-env-vars-alist
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
251 (mapcar (lambda (string)
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
252 (let ((d (string-match "=" string)))
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
253 (cons (concat "$" (substring string 0 d))
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
254 (and d (substring string (1+ d))))))
10e0b8ee9993 (partial-completion-mode): Use 'choose-completion-string-functions to make
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 69309
diff changeset
255 process-environment))))
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
256
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
257
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
258 (defun PC-complete ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
259 "Like minibuffer-complete, but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
260 For example, \"M-x b--di\" would match `byte-recompile-directory', or any
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
261 name which consists of three or more words, the first beginning with \"b\"
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
262 and the third beginning with \"di\".
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
264 The pattern \"b--d\" is ambiguous for `byte-recompile-directory' and
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265 `beginning-of-defun', so this would produce a list of completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
266 just like when normal Emacs completions are ambiguous.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
267
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
268 Word-delimiters for the purposes of Partial Completion are \"-\", \"_\",
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
269 \".\", and SPC."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
270 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
271 (if (PC-was-meta-key)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
272 (minibuffer-complete)
15802
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
273 ;; If the previous command was not this one,
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
274 ;; never scroll, always retry completion.
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
275 (or (eq last-command this-command)
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
276 (setq minibuffer-scroll-window nil))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
277 (let ((window minibuffer-scroll-window))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
278 ;; If there's a fresh completion window with a live buffer,
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
279 ;; and this command is repeated, scroll that window.
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
280 (if (and window (window-buffer window)
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
281 (buffer-name (window-buffer window)))
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
282 (with-current-buffer (window-buffer window)
15802
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
283 (if (pos-visible-in-window-p (point-max) window)
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
284 (set-window-start window (point-min) nil)
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
285 (scroll-other-window)))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
286 (PC-do-completion nil)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 (defun PC-complete-word ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 "Like `minibuffer-complete-word', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 See `PC-complete' for details.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
292 This can be bound to other keys, like `-' and `.', if you wish."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
293 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
294 (if (eq (PC-was-meta-key) PC-meta-flag)
101010
4efc7ca085ce Replace last-command-char with last-command-event.
Glenn Morris <rgm@gnu.org>
parents: 100908
diff changeset
295 (if (eq last-command-event ? )
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
296 (minibuffer-complete-word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
297 (self-insert-command 1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
298 (self-insert-command 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
299 (if (eobp)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
300 (PC-do-completion 'word))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
301
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
302
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
303 (defun PC-complete-space ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
304 "Like `minibuffer-complete-word', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
305 See `PC-complete' for details.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
306 This is suitable for binding to other keys which should act just like SPC."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308 (if (eq (PC-was-meta-key) PC-meta-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 (minibuffer-complete-word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310 (insert " ")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 (if (eobp)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 (PC-do-completion 'word))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 (defun PC-complete-and-exit ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316 "Like `minibuffer-complete-and-exit', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 See `PC-complete' for details."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 (if (eq (PC-was-meta-key) PC-meta-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 (minibuffer-complete-and-exit)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321 (PC-do-complete-and-exit)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
322
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
323 (defun PC-force-complete-and-exit ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 "Like `minibuffer-complete-and-exit', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
325 See `PC-complete' for details."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
326 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
327 (let ((minibuffer-completion-confirm nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328 (PC-do-complete-and-exit)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
330 (defun PC-do-complete-and-exit ()
81708
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
331 (cond
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
332 ((= (point-max) (minibuffer-prompt-end))
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
333 ;; Duplicate the "bug" that Info-menu relies on...
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
334 (exit-minibuffer))
100016
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
335 ((eq minibuffer-completion-confirm 'confirm)
81708
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
336 (if (or (eq last-command this-command)
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
337 (test-completion (field-string)
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
338 minibuffer-completion-table
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
339 minibuffer-completion-predicate))
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
340 (exit-minibuffer)
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
341 (PC-temp-minibuffer-message " [Confirm]")))
100016
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
342 ((eq minibuffer-completion-confirm 'confirm-after-completion)
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
343 ;; Similar to the above, but only if trying to exit immediately
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
344 ;; after typing TAB (this catches most minibuffer typos).
100051
172ab771edf9 (PC-do-complete-and-exit): Use minibuffer-confirm-exit-commands.
Chong Yidong <cyd@stupidchicken.com>
parents: 100016
diff changeset
345 (if (and (memq last-command minibuffer-confirm-exit-commands)
100016
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
346 (not (test-completion (field-string)
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
347 minibuffer-completion-table
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
348 minibuffer-completion-predicate)))
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
349 (PC-temp-minibuffer-message " [Confirm]")
92d948bc8621 (PC-do-complete-and-exit): Synch to 2008-11-24 change to
Chong Yidong <cyd@stupidchicken.com>
parents: 98091
diff changeset
350 (exit-minibuffer)))
81708
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
351 (t
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
352 (let ((flag (PC-do-completion 'exit)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
353 (and flag
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
354 (if (or (eq flag 'complete)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
355 (not minibuffer-completion-confirm))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
356 (exit-minibuffer)
81708
d71be1e37321 (PC-do-complete-and-exit): Add support for the new
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 81678
diff changeset
357 (PC-temp-minibuffer-message " [Confirm]")))))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
358
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360 (defun PC-completion-help ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361 "Like `minibuffer-completion-help', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
362 See `PC-complete' for details."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364 (if (eq (PC-was-meta-key) PC-meta-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
365 (minibuffer-completion-help)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366 (PC-do-completion 'help)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
368 (defun PC-was-meta-key ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 (or (/= (length (this-command-keys)) 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 (let ((key (aref (this-command-keys) 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371 (if (integerp key)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 (>= key 128)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 (not (null (memq 'meta (event-modifiers key))))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376 (defvar PC-ignored-extensions 'empty-cache)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 (defvar PC-delims 'empty-cache)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378 (defvar PC-ignored-regexp nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379 (defvar PC-word-failed-flag nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380 (defvar PC-delim-regex nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381 (defvar PC-ndelims-regex nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
382 (defvar PC-delims-list nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
383
14765
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
384 (defvar PC-completion-as-file-name-predicate
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
385 (lambda () minibuffer-completing-file-name)
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
386 "A function testing whether a minibuffer completion now will work filename-style.
14765
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
387 The function takes no arguments, and typically looks at the value
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
388 of `minibuffer-completion-table' and the minibuffer contents.")
14759
f93ed65c0584 (PC-do-completion-filename-completers): New variable.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
389
71436
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
390 ;; Returns the sequence of non-delimiter characters that follow regexp in string.
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
391 (defun PC-chunk-after (string regexp)
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
392 (if (not (string-match regexp string))
87096
a99a2e8bc21e Fix possibly buggy calls to `message'.
Deepak Goel <deego@gnufans.org>
parents: 85543
diff changeset
393 (let ((message "String %s didn't match regexp %s"))
a99a2e8bc21e Fix possibly buggy calls to `message'.
Deepak Goel <deego@gnufans.org>
parents: 85543
diff changeset
394 (message message string regexp)
a99a2e8bc21e Fix possibly buggy calls to `message'.
Deepak Goel <deego@gnufans.org>
parents: 85543
diff changeset
395 (error message string regexp)))
71436
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
396 (let ((result (substring string (match-end 0))))
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
397 ;; result may contain multiple chunks
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
398 (if (string-match PC-delim-regex result)
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
399 (setq result (substring result 0 (match-beginning 0))))
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
400 result))
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
401
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
402 (defun test-completion-ignore-case (str table pred)
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
403 "Like `test-completion', but ignores case when possible."
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
404 ;; Binding completion-ignore-case to nil ensures, for compatibility with
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
405 ;; standard completion, that the return value is exactly one of the
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
406 ;; possibilities. Do this binding only if pred is nil, out of paranoia;
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
407 ;; perhaps it is safe even if pred is non-nil.
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
408 (if pred
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
409 (test-completion str table pred)
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
410 (let ((completion-ignore-case nil))
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
411 (test-completion str table pred))))
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
412
76404
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
413 ;; The following function is an attempt to work around two problems:
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
414
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
415 ;; (1) When complete.el was written, (try-completion "" '(("") (""))) used to
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
416 ;; return the value "". With a change from 2002-07-07 it returns t which caused
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
417 ;; `PC-lisp-complete-symbol' to fail with a "Wrong type argument: sequencep, t"
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
418 ;; error. `PC-try-completion' returns STRING in this case.
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
419
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
420 ;; (2) (try-completion "" '((""))) returned t before the above-mentioned change.
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
421 ;; Since `PC-chop-word' operates on the return value of `try-completion' this
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
422 ;; case might have provoked a similar error as in (1). `PC-try-completion'
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
423 ;; returns "" instead. I don't know whether this is a real problem though.
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
424
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
425 ;; Since `PC-try-completion' is not a guaranteed to fix these bugs reliably, you
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
426 ;; should try to look at the following discussions when you encounter problems:
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
427 ;; - emacs-pretest-bug ("Partial Completion" starting 2007-02-23),
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
428 ;; - emacs-devel ("[address-of-OP: Partial completion]" starting 2007-02-24),
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
429 ;; - emacs-devel ("[address-of-OP: EVAL and mouse selection in *Completions*]"
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
430 ;; starting 2007-03-05).
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
431 (defun PC-try-completion (string alist &optional predicate)
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
432 "Like `try-completion' but return STRING instead of t."
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
433 (let ((result (try-completion string alist predicate)))
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
434 (if (eq result t) string result)))
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
435
77208
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
436 ;; TODO document MODE magic...
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
437 (defun PC-do-completion (&optional mode beg end goto-end)
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
438 "Internal function to do the work of partial completion.
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
439 Text to be completed lies between BEG and END. Normally when
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
440 replacing text in the minibuffer, this function replaces up to
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
441 point-max (as is appropriate for completing a file name). If
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
442 GOTO-END is non-nil, however, it instead replaces up to END."
26341
6063383b77d5 (PC-do-completion): Use minibuffer-prompt-end to
Gerd Moellmann <gerd@gnu.org>
parents: 25207
diff changeset
443 (or beg (setq beg (minibuffer-prompt-end)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
444 (or end (setq end (point-max)))
81678
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
445 (let* ((table (if (eq minibuffer-completion-table 'read-file-name-internal)
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
446 'PC-read-file-name-internal
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
447 minibuffer-completion-table))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
448 (pred minibuffer-completion-predicate)
14765
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
449 (filename (funcall PC-completion-as-file-name-predicate))
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
450 (dirname nil) ; non-nil only if a filename is being completed
76439
2a096eef08d4 (PC-do-completion): Bind dirlength to nil to avoid
Martin Rudalics <rudalics@gmx.at>
parents: 76406
diff changeset
451 ;; The following used to be "(dirlength 0)" which caused the erasure of
2a096eef08d4 (PC-do-completion): Bind dirlength to nil to avoid
Martin Rudalics <rudalics@gmx.at>
parents: 76406
diff changeset
452 ;; the entire buffer text before `point' when inserting a completion
2a096eef08d4 (PC-do-completion): Bind dirlength to nil to avoid
Martin Rudalics <rudalics@gmx.at>
parents: 76406
diff changeset
453 ;; into a buffer.
2a096eef08d4 (PC-do-completion): Bind dirlength to nil to avoid
Martin Rudalics <rudalics@gmx.at>
parents: 76406
diff changeset
454 dirlength
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
455 (str (buffer-substring beg end))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
456 (incname (and filename (string-match "<\\([^\"<>]*\\)>?$" str)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
457 (ambig nil)
70840
b599bb78c1fc (PC-do-completion): Undo the addition of implicit
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 70076
diff changeset
458 basestr origstr
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
459 env-on
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
460 regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
461 p offset
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
462 abbreviated
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
463 (poss nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
464 helpposs
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
465 (case-fold-search completion-ignore-case))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
466
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
467 ;; Check if buffer contents can already be considered complete
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
468 (if (and (eq mode 'exit)
76336
d24bffa1374c (PC-do-completion): If completion-ignore-case is non-nil, replace
Chong Yidong <cyd@stupidchicken.com>
parents: 75347
diff changeset
469 (test-completion str table pred))
98091
cf3a44c40410 * complete.el (PC-do-completion): Don't replace buffer contents
Chong Yidong <cyd@stupidchicken.com>
parents: 96376
diff changeset
470 'complete
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
471
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
472 ;; Do substitutions in directory names
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
473 (and filename
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
474 (setq basestr (or (file-name-directory str) ""))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
475 (setq dirlength (length basestr))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
476 ;; Do substitutions in directory names
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
477 (setq p (substitute-in-file-name basestr))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
478 (not (string-equal basestr p))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
479 (setq str (concat p (file-name-nondirectory str)))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
480 (progn
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
481 (delete-region beg end)
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
482 (insert str)
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
483 (setq end (+ beg (length str)))))
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
484
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
485 ;; Prepare various delimiter strings
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
486 (or (equal PC-word-delimiters PC-delims)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
487 (setq PC-delims PC-word-delimiters
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
488 PC-delim-regex (concat "[" PC-delims "]")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
489 PC-ndelims-regex (concat "[^" PC-delims "]*")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 PC-delims-list (append PC-delims nil)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
491
48225
75ced2cd606e (PC-do-completion): Make partial-completion work
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38436
diff changeset
492 ;; Add wildcards if necessary
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
493 (and filename
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
494 (let ((dir (file-name-directory str))
52883
cc2b636ab1db (PC-do-completion): Do not forget to use `pred' as the default-directory
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 52401
diff changeset
495 (file (file-name-nondirectory str))
94302
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
496 ;; The base dir for file-completion was passed in `predicate'.
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
497 (default-directory (if (stringp pred) (expand-file-name pred)
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
498 default-directory)))
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
499 (while (and (stringp dir) (not (file-directory-p dir)))
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
500 (setq dir (directory-file-name dir))
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
501 (setq file (concat (replace-regexp-in-string
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
502 PC-delim-regex "*\\&"
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
503 (file-name-nondirectory dir))
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
504 "*/" file))
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
505 (setq dir (file-name-directory dir)))
70840
b599bb78c1fc (PC-do-completion): Undo the addition of implicit
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 70076
diff changeset
506 (setq origstr str str (concat dir file))))
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
507
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508 ;; Look for wildcard expansions in directory name
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509 (and filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
510 (string-match "\\*.*/" str)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
511 (let ((pat str)
94302
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
512 ;; The base dir for file-completion was passed in `predicate'.
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
513 (default-directory (if (stringp pred) (expand-file-name pred)
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
514 default-directory))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
515 files)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
516 (setq p (1+ (string-match "/[^/]*\\'" pat)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
517 (while (setq p (string-match PC-delim-regex pat p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 (setq pat (concat (substring pat 0 p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
519 "*"
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
520 (substring pat p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
521 p (+ p 2)))
85543
3688c29b5541 (PC-expand-many-files): Remove.
Juanma Barranquero <lekktu@gmail.com>
parents: 84347
diff changeset
522 (setq files (file-expand-wildcards (concat pat "*")))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
523 (if files
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
524 (let ((dir (file-name-directory (car files)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
525 (p files))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
526 (while (and (setq p (cdr p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
527 (equal dir (file-name-directory (car p)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
528 (if p
94302
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
529 (setq filename nil table nil
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
530 pred (if (stringp pred) nil pred)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
531 ambig t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
532 (delete-region beg end)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
533 (setq str (concat dir (file-name-nondirectory str)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
534 (insert str)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
535 (setq end (+ beg (length str)))))
70840
b599bb78c1fc (PC-do-completion): Undo the addition of implicit
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 70076
diff changeset
536 (if origstr
81678
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
537 ;; If the wildcards were introduced by us, it's
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
538 ;; possible that PC-read-file-name-internal can
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
539 ;; still find matches for the original string
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
540 ;; even if we couldn't, so remove the added
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
541 ;; wildcards.
70840
b599bb78c1fc (PC-do-completion): Undo the addition of implicit
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 70076
diff changeset
542 (setq str origstr)
94302
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
543 (setq filename nil table nil
5a4d9f3d23f9 (PC-do-completion): Be more robust in the presence of
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94219
diff changeset
544 pred (if (stringp pred) nil pred))))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
545
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
546 ;; Strip directory name if appropriate
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
547 (if filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
548 (if incname
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
549 (setq basestr (substring str incname)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
550 dirname (substring str 0 incname))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
551 (setq basestr (file-name-nondirectory str)
25207
e62d2121822f (PC-do-completion): If completing on file name,
Eli Zaretskii <eliz@gnu.org>
parents: 24624
diff changeset
552 dirname (file-name-directory str))
e62d2121822f (PC-do-completion): If completing on file name,
Eli Zaretskii <eliz@gnu.org>
parents: 24624
diff changeset
553 ;; Make sure str is consistent with its directory and basename
e62d2121822f (PC-do-completion): If completing on file name,
Eli Zaretskii <eliz@gnu.org>
parents: 24624
diff changeset
554 ;; parts. This is important on DOZe'NT systems when str only
e62d2121822f (PC-do-completion): If completing on file name,
Eli Zaretskii <eliz@gnu.org>
parents: 24624
diff changeset
555 ;; includes a drive letter, like in "d:".
e62d2121822f (PC-do-completion): If completing on file name,
Eli Zaretskii <eliz@gnu.org>
parents: 24624
diff changeset
556 (setq str (concat dirname basestr)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
557 (setq basestr str))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
558
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
559 ;; Convert search pattern to a standard regular expression
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
560 (setq regex (regexp-quote basestr)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
561 offset (if (and (> (length regex) 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
562 (not (eq (aref basestr 0) ?\*))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
563 (or (eq PC-first-char t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
564 (and PC-first-char filename))) 1 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
565 p offset)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
566 (while (setq p (string-match PC-delim-regex regex p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
567 (if (eq (aref regex p) ? )
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
568 (setq regex (concat (substring regex 0 p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
569 PC-ndelims-regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
570 PC-delim-regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
571 (substring regex (1+ p)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
572 p (+ p (length PC-ndelims-regex) (length PC-delim-regex)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
573 (let ((bump (if (memq (aref regex p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
574 '(?$ ?^ ?\. ?* ?+ ?? ?[ ?] ?\\))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
575 -1 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
576 (setq regex (concat (substring regex 0 (+ p bump))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
577 PC-ndelims-regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
578 (substring regex (+ p bump)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
579 p (+ p (length PC-ndelims-regex) 1)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
580 (setq p 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
581 (if filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
582 (while (setq p (string-match "\\\\\\*" regex p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
583 (setq regex (concat (substring regex 0 p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
584 "[^/]*"
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
585 (substring regex (+ p 2))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
586 ;;(setq the-regex regex)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
587 (setq regex (concat "\\`" regex))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
588
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
589 (and (> (length basestr) 0)
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
590 (= (aref basestr 0) ?$)
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
591 (setq env-on t
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
592 table PC-env-vars-alist
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
593 pred nil))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
594
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
595 ;; Find an initial list of possible completions
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
596 (unless (setq p (string-match (concat PC-delim-regex
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
597 (if filename "\\|\\*" ""))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
598 str
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
599 (+ (length dirname) offset)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
600
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
601 ;; Minibuffer contains no hyphens -- simple case!
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
602 (setq poss (all-completions (if env-on basestr str)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
603 table
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
604 pred))
84347
36f09a4f9133 2007-09-06 Sean O'Rourke <sorourke@cs.ucsd.edu>
Romain Francoise <romain@orebokech.com>
parents: 82855
diff changeset
605 (unless (or poss (string-equal str ""))
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
606 ;; Try completion as an abbreviation, e.g. "mvb" ->
84347
36f09a4f9133 2007-09-06 Sean O'Rourke <sorourke@cs.ucsd.edu>
Romain Francoise <romain@orebokech.com>
parents: 82855
diff changeset
607 ;; "m-v-b" -> "multiple-value-bind", but only for
36f09a4f9133 2007-09-06 Sean O'Rourke <sorourke@cs.ucsd.edu>
Romain Francoise <romain@orebokech.com>
parents: 82855
diff changeset
608 ;; non-empty strings.
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
609 (setq origstr str
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
610 abbreviated t)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
611 (if filename
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
612 (cond
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
613 ;; "alpha" or "/alpha" -> expand whole path.
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
614 ((string-match "^/?\\([A-Za-z0-9]+\\)$" str)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
615 (setq
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
616 basestr ""
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
617 p nil
85543
3688c29b5541 (PC-expand-many-files): Remove.
Juanma Barranquero <lekktu@gmail.com>
parents: 84347
diff changeset
618 poss (file-expand-wildcards
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
619 (concat "/"
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
620 (mapconcat #'list (match-string 1 str) "*/")
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
621 "*"))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
622 beg (1- beg)))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
623 ;; Alphanumeric trailer -> expand trailing file
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
624 ((string-match "^\\(.+/\\)\\([A-Za-z0-9]+\\)$" str)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
625 (setq regex (concat "\\`"
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
626 (mapconcat #'list
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
627 (match-string 2 str)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
628 "[A-Za-z0-9]*[^A-Za-z0-9]"))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
629 p (1+ (length (match-string 1 str))))))
93243
9ecf89702ffc (PC-do-completion): Use regexp-quote.
Johan Bockgård <bojohan@gnu.org>
parents: 87649
diff changeset
630 (setq regex (concat "\\`" (mapconcat (lambda (c)
9ecf89702ffc (PC-do-completion): Use regexp-quote.
Johan Bockgård <bojohan@gnu.org>
parents: 87649
diff changeset
631 (regexp-quote (string c)))
9ecf89702ffc (PC-do-completion): Use regexp-quote.
Johan Bockgård <bojohan@gnu.org>
parents: 87649
diff changeset
632 str "[^-]*-"))
9ecf89702ffc (PC-do-completion): Use regexp-quote.
Johan Bockgård <bojohan@gnu.org>
parents: 87649
diff changeset
633 p 1))))
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
634 (when p
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
635 ;; Use all-completions to do an initial cull. This is a big win,
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
636 ;; since all-completions is written in C!
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
637 (let ((compl (all-completions (if env-on
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
638 (file-name-nondirectory (substring str 0 p))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
639 (substring str 0 p))
72310
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
640 table
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
641 pred)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
642 (setq p compl)
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
643 (when (and compl abbreviated)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
644 (if filename
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
645 (progn
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
646 (setq p nil)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
647 (dolist (x compl)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
648 (when (string-match regex x)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
649 (push x p)))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
650 (setq basestr (try-completion "" p)))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
651 (setq basestr (mapconcat 'list str "-"))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
652 (delete-region beg end)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
653 (setq end (+ beg (length basestr)))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
654 (insert basestr))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
655 (while p
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
656 (and (string-match regex (car p))
16608
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
657 (progn
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
658 (set-text-properties 0 (length (car p)) '() (car p))
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
659 (setq poss (cons (car p) poss))))
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
660 (setq p (cdr p))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
661
76375
3183de2acda4 (PC-do-completion): Delete duplicates in the list of possible completions.
Michaël Cadilhac <michael.cadilhac@lrde.org>
parents: 76336
diff changeset
662 ;; If table had duplicates, they can be here.
3183de2acda4 (PC-do-completion): Delete duplicates in the list of possible completions.
Michaël Cadilhac <michael.cadilhac@lrde.org>
parents: 76336
diff changeset
663 (delete-dups poss)
3183de2acda4 (PC-do-completion): Delete duplicates in the list of possible completions.
Michaël Cadilhac <michael.cadilhac@lrde.org>
parents: 76336
diff changeset
664
72310
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
665 ;; Handle completion-ignored-extensions
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
666 (and filename
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
667 (not (eq mode 'help))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
668 (let ((p2 poss))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
669
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
670 ;; Build a regular expression representing the extensions list
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
671 (or (equal completion-ignored-extensions PC-ignored-extensions)
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
672 (setq PC-ignored-regexp
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
673 (concat "\\("
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
674 (mapconcat
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
675 'regexp-quote
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
676 (setq PC-ignored-extensions
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
677 completion-ignored-extensions)
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
678 "\\|")
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
679 "\\)\\'")))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
680
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
681 ;; Check if there are any without an ignored extension.
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
682 ;; Also ignore `.' and `..'.
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
683 (setq p nil)
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
684 (while p2
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
685 (or (string-match PC-ignored-regexp (car p2))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
686 (string-match "\\(\\`\\|/\\)[.][.]?/?\\'" (car p2))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
687 (setq p (cons (car p2) p)))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
688 (setq p2 (cdr p2)))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
689
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
690 ;; If there are "good" names, use them
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
691 (and p (setq poss p))))
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
692
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
693 ;; Now we have a list of possible completions
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
694
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
695 (cond
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
696
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
697 ;; No valid completions found
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
698 ((null poss)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
699 (if (and (eq mode 'word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
700 (not PC-word-failed-flag))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
701 (let ((PC-word-failed-flag t))
108765
d835100c3e8b Replace Lisp calls to delete-backward-char by delete-char.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 107849
diff changeset
702 (delete-char -1)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
703 (PC-do-completion 'word))
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
704 (when abbreviated
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
705 (delete-region beg end)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
706 (insert origstr))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
707 (beep)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
708 (PC-temp-minibuffer-message (if ambig
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
709 " [Ambiguous dir name]"
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
710 (if (eq mode 'help)
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
711 " [No completions]"
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
712 " [No match]")))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
713 nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
714
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
715 ;; More than one valid completion found
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
716 ((or (cdr (setq helpposs poss))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
717 (memq mode '(help word)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
718
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
719 ;; Is the actual string one of the possible completions?
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
720 (setq p (and (not (eq mode 'help)) poss))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
721 (while (and p
16608
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
722 (not (string-equal (car p) basestr)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
723 (setq p (cdr p)))
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
724 (and p (null mode)
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
725 (PC-temp-minibuffer-message " [Complete, but not unique]"))
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
726 (if (and p
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
727 (not (and (null mode)
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
728 (eq this-command last-command))))
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
729 t
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
730
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
731 ;; If ambiguous, try for a partial completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
732 (let ((improved nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
733 prefix
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
734 (pt nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
735 (skip "\\`"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
736
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
737 ;; Check if next few letters are the same in all cases
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
738 (if (and (not (eq mode 'help))
76404
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
739 (setq prefix (PC-try-completion
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
740 (PC-chunk-after basestr skip) poss)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741 (let ((first t) i)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
742 (if (eq mode 'word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
743 (setq prefix (PC-chop-word prefix basestr)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
744 (goto-char (+ beg (length dirname)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
745 (while (and (progn
71436
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
746 (setq i 0) ; index into prefix string
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
747 (while (< i (length prefix))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
748 (if (and (< (point) end)
101614
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
749 (or (eq (downcase (aref prefix i))
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
750 (downcase (following-char)))
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
751 (and (looking-at " ")
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
752 (memq (aref prefix i)
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
753 PC-delims-list))))
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
754 ;; replace " " by the actual delimiter
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
755 ;; or input char by prefix char
71436
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
756 (progn
101614
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
757 (delete-char 1)
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
758 (insert (substring prefix i (1+ i))))
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
759 ;; insert a new character
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
760 (progn
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
761 (and filename (looking-at "\\*")
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
762 (progn
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
763 (delete-char 1)
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
764 (setq end (1- end))))
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
765 (setq improved t)
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
766 (insert (substring prefix i (1+ i)))
9b2f88075647 (PC-do-completion): Correct case when completion is unambiguous.
Chong Yidong <cyd@stupidchicken.com>
parents: 101010
diff changeset
767 (setq end (1+ end))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
768 (setq i (1+ i)))
67622
bd00b5fc4e4d (PC-do-completion): Remove `(equal (point) beg)' to
Juri Linkov <juri@jurta.org>
parents: 67596
diff changeset
769 (or pt (setq pt (point)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
770 (looking-at PC-delim-regex))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
771 (setq skip (concat skip
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
772 (regexp-quote prefix)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
773 PC-ndelims-regex)
76404
51826bf423f3 (PC-try-completion): New function.
Martin Rudalics <rudalics@gmx.at>
parents: 76389
diff changeset
774 prefix (PC-try-completion
71436
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
775 (PC-chunk-after
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
776 ;; not basestr, because that does
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
777 ;; not reflect insertions
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
778 (buffer-substring
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
779 (+ beg (length dirname)) end)
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
780 skip)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
781 (mapcar
72310
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
782 (lambda (x)
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
783 (when (string-match skip x)
e45c648eb3ad (PC-do-completion): Strip out completion-ignored-extensions
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 72243
diff changeset
784 (substring x (match-end 0))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
785 poss)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
786 (or (> i 0) (> (length prefix) 0))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
787 (or (not (eq mode 'word))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
788 (and first (> (length prefix) 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
789 (setq first nil
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
790 prefix (substring prefix 0 1))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
791 (goto-char (if (eq mode 'word) end
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
792 (or pt beg)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
793
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
794 (if (and (eq mode 'word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
795 (not PC-word-failed-flag))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
796
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
797 (if improved
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
798
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
799 ;; We changed it... would it be complete without the space?
100116
f2e50678d85a (PC-do-completion): Fix leftover bug from Emacs-21 when
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100051
diff changeset
800 (if (test-completion (buffer-substring
f2e50678d85a (PC-do-completion): Fix leftover bug from Emacs-21 when
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 100051
diff changeset
801 (field-beginning) (1- end))
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
802 table pred)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
803 (delete-region (1- end) end)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
804
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
805 (if improved
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
806
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
807 ;; We changed it... enough to be complete?
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
808 (and (eq mode 'exit)
71436
d51a5dc58935 (PC-do-completion): Retain capitalization of user input, when possible, even
Eli Zaretskii <eliz@gnu.org>
parents: 70840
diff changeset
809 (test-completion-ignore-case (field-string) table pred))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
810
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
811 ;; If totally ambiguous, display a list of completions
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
812 (if (or (eq completion-auto-help t)
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
813 (and completion-auto-help
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
814 (eq last-command this-command))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
815 (eq mode 'help))
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
816 (let ((prompt-end (minibuffer-prompt-end)))
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
817 (with-output-to-temp-buffer "*Completions*"
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
818 (display-completion-list (sort helpposs 'string-lessp))
77211
43c40e825164 (PC-goto-end, PC-do-completion-end): Make buffer-local.
Glenn Morris <rgm@gnu.org>
parents: 77208
diff changeset
819 (setq PC-do-completion-end end
43c40e825164 (PC-goto-end, PC-do-completion-end): Make buffer-local.
Glenn Morris <rgm@gnu.org>
parents: 77208
diff changeset
820 PC-goto-end goto-end)
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
821 (with-current-buffer standard-output
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
822 ;; Record which part of the buffer we are completing
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
823 ;; so that choosing a completion from the list
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
824 ;; knows how much old text to replace.
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
825 ;; This was briefly nil in the non-dirname case.
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
826 ;; However, if one calls PC-lisp-complete-symbol
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
827 ;; on "(ne-f" with point on the hyphen, PC offers
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
828 ;; all completions starting with "(ne", some of
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
829 ;; which do not match the "-f" part (maybe it
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
830 ;; should not, but it does). In such cases,
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
831 ;; completion gets confused trying to figure out
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
832 ;; how much to replace, so we tell it explicitly
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
833 ;; (ie, the number of chars in the buffer before beg).
76774
a98404fc2d91 (PC-do-completion-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76756
diff changeset
834 ;;
a98404fc2d91 (PC-do-completion-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76756
diff changeset
835 ;; Note that choose-completion-string-functions
a98404fc2d91 (PC-do-completion-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76756
diff changeset
836 ;; plays around with point.
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
837 (setq completion-base-size (if dirname
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
838 dirlength
77211
43c40e825164 (PC-goto-end, PC-do-completion-end): Make buffer-local.
Glenn Morris <rgm@gnu.org>
parents: 77208
diff changeset
839 (- beg prompt-end))))))
82855
f839eef40802 (PC-do-completion): Make RET accept a non-unique but complete
Michaël Cadilhac <michael.cadilhac@lrde.org>
parents: 82302
diff changeset
840 (PC-temp-minibuffer-message " [Next char not unique]"))
f839eef40802 (PC-do-completion): Make RET accept a non-unique but complete
Michaël Cadilhac <michael.cadilhac@lrde.org>
parents: 82302
diff changeset
841 ;; Expansion of filenames is not reversible,
f839eef40802 (PC-do-completion): Make RET accept a non-unique but complete
Michaël Cadilhac <michael.cadilhac@lrde.org>
parents: 82302
diff changeset
842 ;; so just keep the prefix.
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
843 (when (and abbreviated filename)
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
844 (delete-region (point) end))
82855
f839eef40802 (PC-do-completion): Make RET accept a non-unique but complete
Michaël Cadilhac <michael.cadilhac@lrde.org>
parents: 82302
diff changeset
845 nil)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
846
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
847 ;; Only one possible completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
848 (t
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
849 (if (and (equal basestr (car poss))
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
850 (not (and env-on filename))
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
851 (not abbreviated))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
852 (if (null mode)
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
853 (PC-temp-minibuffer-message " [Sole completion]"))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
854 (delete-region beg end)
7792
1335cec8a016 (PC-do-completion): Clear text props from inserted text.
Richard M. Stallman <rms@gnu.org>
parents: 7639
diff changeset
855 (insert (format "%s"
1335cec8a016 (PC-do-completion): Clear text props from inserted text.
Richard M. Stallman <rms@gnu.org>
parents: 7639
diff changeset
856 (if filename
1335cec8a016 (PC-do-completion): Clear text props from inserted text.
Richard M. Stallman <rms@gnu.org>
parents: 7639
diff changeset
857 (substitute-in-file-name (concat dirname (car poss)))
1335cec8a016 (PC-do-completion): Clear text props from inserted text.
Richard M. Stallman <rms@gnu.org>
parents: 7639
diff changeset
858 (car poss)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
859 t)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
860
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
861 (defun PC-chop-word (new old)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
862 (let ((i -1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
863 (j -1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
864 (while (and (setq i (string-match PC-delim-regex old (1+ i)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
865 (setq j (string-match PC-delim-regex new (1+ j)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
866 (if (and j
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
867 (or (not PC-word-failed-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
868 (setq j (string-match PC-delim-regex new (1+ j)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
869 (substring new 0 (1+ j))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
870 new)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
871
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
872 (defvar PC-not-minibuffer nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
873
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
874 (defun PC-temp-minibuffer-message (message)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
875 "A Lisp version of `temp_minibuffer_message' from minibuf.c."
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
876 (cond (PC-not-minibuffer
87096
a99a2e8bc21e Fix possibly buggy calls to `message'.
Deepak Goel <deego@gnufans.org>
parents: 85543
diff changeset
877 (message "%s" message)
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
878 (sit-for 2)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
879 (message ""))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
880 ((fboundp 'temp-minibuffer-message)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
881 (temp-minibuffer-message message))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
882 (t
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
883 (let ((point-max (point-max)))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
884 (save-excursion
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
885 (goto-char point-max)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
886 (insert message))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
887 (let ((inhibit-quit t))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
888 (sit-for 2)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
889 (delete-region point-max (point-max))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
890 (when quit-flag
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
891 (setq quit-flag nil
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
892 unread-command-events '(7))))))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
893
76787
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
894 ;; Does not need to be buffer-local (?) because only used when one
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
895 ;; PC-l-c-s immediately follows another.
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
896 (defvar PC-lisp-complete-end nil
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
897 "Internal variable used by `PC-lisp-complete-symbol'.")
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
898
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
899 (defun PC-lisp-complete-symbol ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
900 "Perform completion on Lisp symbol preceding point.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
901 That symbol is compared against the symbols that exist
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
902 and any additional characters determined by what is there
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
903 are inserted.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
904 If the symbol starts just after an open-parenthesis,
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
905 only symbols with function definitions are considered.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
906 Otherwise, all symbols with function definitions, values
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
907 or properties are considered."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
908 (interactive)
82302
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
909 (let* ((end
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
910 (save-excursion
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
911 (with-syntax-table lisp-mode-syntax-table
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
912 (skip-syntax-forward "_w")
c0e2cbf10e3a (PC-lisp-complete-symbol): Complete symbol around point.
Richard M. Stallman <rms@gnu.org>
parents: 82140
diff changeset
913 (point))))
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
914 (beg (save-excursion
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
915 (with-syntax-table lisp-mode-syntax-table
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
916 (backward-sexp 1)
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
917 (while (= (char-syntax (following-char)) ?\')
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
918 (forward-char 1))
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
919 (point))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
920 (minibuffer-completion-table obarray)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
921 (minibuffer-completion-predicate
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
922 (if (eq (char-after (1- beg)) ?\()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
923 'fboundp
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
924 (function (lambda (sym)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
925 (or (boundp sym) (fboundp sym)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
926 (symbol-plist sym))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
927 (PC-not-minibuffer t))
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
928 ;; http://lists.gnu.org/archive/html/emacs-devel/2007-03/msg01211.html
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
929 ;;
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
930 ;; This deals with cases like running PC-l-c-s on "M-: (n-f".
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
931 ;; The first call to PC-l-c-s expands this to "(ne-f", and moves
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
932 ;; point to the hyphen [1]. If one calls PC-l-c-s immediately after,
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
933 ;; then without the last-command check, one is offered all
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
934 ;; completions of "(ne", which is presumably not what one wants.
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
935 ;;
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
936 ;; This is arguably (at least, it seems to be the existing intended
96376
c3309dba6542 American English spelling fix.
Glenn Morris <rgm@gnu.org>
parents: 94678
diff changeset
937 ;; behavior) what one _does_ want if point has been explicitly
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
938 ;; positioned on the hyphen. Note that if PC-do-completion (qv) binds
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
939 ;; completion-base-size to nil, then completion does not replace the
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
940 ;; correct amount of text in such cases.
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
941 ;;
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
942 ;; Neither of these problems occur when using PC for filenames in the
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
943 ;; minibuffer, because in that case PC-do-completion is called without
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
944 ;; an explicit value for END, and so uses (point-max). This is fine for
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
945 ;; a filename, because the end of the filename must be at the end of
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
946 ;; the minibuffer. The same is not true for lisp symbols.
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
947 ;;
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
948 ;; [1] An alternate fix would be to not move point to the hyphen
96376
c3309dba6542 American English spelling fix.
Glenn Morris <rgm@gnu.org>
parents: 94678
diff changeset
949 ;; in such cases, but that would make the behavior different from
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
950 ;; that for filenames. It seems PC moves point to the site of the
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
951 ;; first difference between the possible completions.
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
952 ;;
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
953 ;; Alternatively alternatively, maybe end should be computed in
96376
c3309dba6542 American English spelling fix.
Glenn Morris <rgm@gnu.org>
parents: 94678
diff changeset
954 ;; the same way as beg. That would change the behavior though.
76756
63293afecf15 (PC-do-completion): Compute completion-base-size in
Glenn Morris <rgm@gnu.org>
parents: 76655
diff changeset
955 (if (equal last-command 'PC-lisp-complete-symbol)
77208
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
956 (PC-do-completion nil beg PC-lisp-complete-end t)
76787
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
957 (if PC-lisp-complete-end
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
958 (move-marker PC-lisp-complete-end end)
960eefe0c8c4 (partial-completion-mode): Set PC-do-completion-end to nil after use.
Glenn Morris <rgm@gnu.org>
parents: 76774
diff changeset
959 (setq PC-lisp-complete-end (copy-marker end t)))
77208
2b2091de06c3 (PC-goto-end): New variable.
Glenn Morris <rgm@gnu.org>
parents: 76787
diff changeset
960 (PC-do-completion nil beg end t))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
961
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
962 (defun PC-complete-as-file-name ()
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
963 "Perform completion on file names preceding point.
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
964 Environment vars are converted to their values."
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
965 (interactive)
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
966 (let* ((end (point))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
967 (beg (if (re-search-backward "[^\\][ \t\n\"\`\'][^ \t\n\"\`\']"
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
968 (point-min) t)
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
969 (+ (point) 2)
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
970 (point-min)))
81678
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
971 (minibuffer-completion-table 'PC-read-file-name-internal)
94219
185747659a29 (PC-complete-as-file-name, PC-read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94086
diff changeset
972 (minibuffer-completion-predicate nil)
29674
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
973 (PC-not-minibuffer t))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
974 (goto-char end)
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
975 (PC-do-completion nil beg end)))
611062a8c71e (PC-env-vars-alist): New variable.
Gerd Moellmann <gerd@gnu.org>
parents: 29088
diff changeset
976
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
977 ;; Facilities for loading C header files. This is independent from the
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
978 ;; main completion code. See also the variable `PC-include-file-path'
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
979 ;; at top of this file.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
980
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
981 (defun PC-look-for-include-file ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
982 (if (string-match "[\"<]\\([^\"<>]*\\)[\">]?$" (buffer-file-name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
983 (let ((name (substring (buffer-file-name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
984 (match-beginning 1) (match-end 1)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
985 (punc (aref (buffer-file-name) (match-beginning 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
986 (path nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
987 new-buf)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
988 (kill-buffer (current-buffer))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
989 (if (equal name "")
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
990 (with-current-buffer (car (buffer-list))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
991 (save-excursion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
992 (beginning-of-line)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
993 (if (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
994 "[ \t]*#[ \t]*include[ \t]+[<\"]\\(.+\\)[>\"][ \t]*[\n/]")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
995 (setq name (buffer-substring (match-beginning 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
996 (match-end 1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
997 punc (char-after (1- (match-beginning 1))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
998 ;; Suggested by Frank Siebenlist:
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
999 (if (or (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1000 "[ \t]*([ \t]*load[ \t]+\"\\([^\"]+\\)\"")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1001 (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1002 "[ \t]*([ \t]*load-library[ \t]+\"\\([^\"]+\\)\"")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1003 (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1004 "[ \t]*([ \t]*require[ \t]+'\\([^\t )]+\\)[\t )]"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1005 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1006 (setq name (buffer-substring (match-beginning 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1007 (match-end 1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1008 punc ?\<
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1009 path load-path)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1010 (if (string-match "\\.elc$" name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1011 (setq name (substring name 0 -1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1012 (or (string-match "\\.el$" name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1013 (setq name (concat name ".el")))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1014 (error "Not on an #include line"))))))
29088
6dce569d0615 (PC-look-for-include-file): Use :alnum: character class.
Dave Love <fx@gnu.org>
parents: 26508
diff changeset
1015 (or (string-match "\\.[[:alnum:]]+$" name)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1016 (setq name (concat name ".h")))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1017 (if (eq punc ?\<)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1018 (let ((path (or path (PC-include-file-path))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1019 (while (and path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1020 (not (file-exists-p
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1021 (concat (file-name-as-directory (car path))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1022 name))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1023 (setq path (cdr path)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1024 (if path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1025 (setq name (concat (file-name-as-directory (car path)) name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1026 (error "No such include file: <%s>" name)))
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
1027 (let ((dir (with-current-buffer (car (buffer-list))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1028 default-directory)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1029 (if (file-exists-p (concat dir name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1030 (setq name (concat dir name))
24624
07ae57ea2a18 Delete the wildcard expansion feature
Karl Heuer <kwzh@gnu.org>
parents: 24534
diff changeset
1031 (error "No such include file: `%s'" name))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1032 (setq new-buf (get-file-buffer name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1033 (if new-buf
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1034 ;; no need to verify last-modified time for this!
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1035 (set-buffer new-buf)
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
1036 (set-buffer (create-file-buffer name))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1037 (erase-buffer)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1038 (insert-file-contents name t))
24624
07ae57ea2a18 Delete the wildcard expansion feature
Karl Heuer <kwzh@gnu.org>
parents: 24534
diff changeset
1039 ;; Returning non-nil with the new buffer current
07ae57ea2a18 Delete the wildcard expansion feature
Karl Heuer <kwzh@gnu.org>
parents: 24534
diff changeset
1040 ;; is sufficient to tell find-file to use it.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1041 t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1042 nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1043
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1044 (defun PC-include-file-path ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1045 (or PC-include-file-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1046 (let ((env (getenv "INCPATH"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1047 (path nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1048 pos)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1049 (or env (error "No include file path specified"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1050 (while (setq pos (string-match ":[^:]+$" env))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1051 (setq path (cons (substring env (1+ pos)) path)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1052 env (substring env 0 pos)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1053 path)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1054
67161
759b69f39057 (PC-completion-as-file-name-predicate): Use minibuffer-completing-file-name.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 67008
diff changeset
1055 ;; This is adapted from lib-complete.el, by Mike Williams.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1056 (defun PC-include-file-all-completions (file search-path &optional full)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1057 "Return all completions for FILE in any directory on SEARCH-PATH.
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
1058 If optional third argument FULL is non-nil, returned pathnames should be
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1059 absolute rather than relative to some directory on the SEARCH-PATH."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1060 (setq search-path
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
1061 (mapcar (lambda (dir)
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
1062 (if dir (file-name-as-directory dir) default-directory))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1063 search-path))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1064 (if (file-name-absolute-p file)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1065 ;; It's an absolute file name, so don't need search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1066 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1067 (setq file (expand-file-name file))
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
1068 (file-name-all-completions
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1069 (file-name-nondirectory file) (file-name-directory file)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1070 (let ((subdir (file-name-directory file))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1071 (ndfile (file-name-nondirectory file))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1072 file-lists)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1073 ;; Append subdirectory part to each element of search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1074 (if subdir
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1075 (setq search-path
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
1076 (mapcar (lambda (dir) (concat dir subdir))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1077 search-path)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1078 file ))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1079 ;; Make list of completions in each directory on search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1080 (while search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1081 (let* ((dir (car search-path))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1082 (subdir (if full dir subdir)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1083 (if (file-directory-p dir)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1084 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1085 (setq file-lists
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
1086 (cons
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
1087 (mapcar (lambda (file) (concat subdir file))
48611
79a38ce36eb1 (PC-do-completion): Do not add wildcards to pattern unless filename is
Noah Friedman <friedman@splode.com>
parents: 48225
diff changeset
1088 (file-name-all-completions ndfile
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1089 (car search-path)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1090 file-lists))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1091 (setq search-path (cdr search-path))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1092 ;; Compress out duplicates while building complete list (slloooow!)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1093 (let ((sorted (sort (apply 'nconc file-lists)
31971
fa083a5fbf0c (partial-completion-mode) <defcustom>: Remove.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 29674
diff changeset
1094 (lambda (x y) (not (string-lessp x y)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1095 compressed)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1096 (while sorted
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1097 (if (equal (car sorted) (car compressed)) nil
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1098 (setq compressed (cons (car sorted) compressed)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1099 (setq sorted (cdr sorted)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1100 compressed))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1101
94219
185747659a29 (PC-complete-as-file-name, PC-read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94086
diff changeset
1102 (defun PC-read-file-name-internal (string pred action)
81678
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
1103 "Extend `read-file-name-internal' to handle include files.
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
1104 This is only used by "
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
1105 (if (string-match "<\\([^\"<>]*\\)>?\\'" string)
97a40a986c47 (partial-completion-mode): Remove advice of read-file-name-internal.
Richard M. Stallman <rms@gnu.org>
parents: 81312
diff changeset
1106 (let* ((name (match-string 1 string))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1107 (str2 (substring string (match-beginning 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1108 (completion-table
76655
adb0ab836e5d (read-file-name-internal): Don't add the final > if the completion is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 76439
diff changeset
1109 (mapcar (lambda (x)
adb0ab836e5d (read-file-name-internal): Don't add the final > if the completion is not
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 76439
diff changeset
1110 (format (if (string-match "/\\'" x) "<%s" "<%s>") x))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1111 (PC-include-file-all-completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1112 name (PC-include-file-path)))))
94086
4dfdf555a78e Minor re-indent.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93243
diff changeset
1113 (cond
4dfdf555a78e Minor re-indent.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93243
diff changeset
1114 ((not completion-table) nil)
4dfdf555a78e Minor re-indent.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93243
diff changeset
1115 ((eq action 'lambda) (test-completion str2 completion-table nil))
4dfdf555a78e Minor re-indent.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93243
diff changeset
1116 ((eq action nil) (PC-try-completion str2 completion-table nil))
4dfdf555a78e Minor re-indent.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 93243
diff changeset
1117 ((eq action t) (all-completions str2 completion-table nil))))
94219
185747659a29 (PC-complete-as-file-name, PC-read-file-name-internal):
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 94086
diff changeset
1118 (read-file-name-internal string pred action)))
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
1119
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1120
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1121 (provide 'complete)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1122
38436
b174db545cfd Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 36033
diff changeset
1123 ;;; complete.el ends here