annotate lisp/complete.el @ 24534:ce83f341af6f

(partial-completion-mode): Doc fix.
author Karl Heuer <kwzh@gnu.org>
date Tue, 30 Mar 1999 21:23:15 +0000
parents 2a7aa9cd6a19
children 07ae57ea2a18
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
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
3 ;; Copyright (C) 1990, 1991, 1992, 1993 Free Software Foundation, Inc.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
4
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
5 ;; Author: Dave Gillespie <daveg@synaptics.com>
22250
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 22142
diff changeset
6 ;; Keywords: abbrev convenience
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
7 ;; Version: 2.03
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
8 ;; Special thanks to Hallvard Furuseth for his many ideas and contributions.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
9
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
11
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
13 ;; it under the terms of the GNU General Public License as published by
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
14 ;; the Free Software Foundation; either version 2, or (at your option)
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
15 ;; any later version.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
16
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
17 ;; 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
18 ;; 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
19 ;; 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
20 ;; GNU General Public License for more details.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
21
6736
3e1323443b1a Fix copying conditions for current GPL version.
Richard M. Stallman <rms@gnu.org>
parents: 3725
diff changeset
22 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 13337
diff changeset
25 ;; Boston, MA 02111-1307, USA.
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 ;; This package also contains a wildcard feature for C-x C-f (find-file).
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
82 ;; For example, `C-x C-f *.c RET' loads all .c files at once, exactly
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
83 ;; as if you had typed C-x C-f separately for each file. Completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
84 ;; is supported in connection with wildcards. Currently only the `*'
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
85 ;; wildcard character works.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
86
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
87 ;; File name completion does not do partial completion of directories
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
88 ;; on the path, e.g., "/u/b/f" will not complete to "/usr/bin/foo",
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
89 ;; but you can put *'s in the path to accomplish this: "/u*/b*/f".
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
90 ;; Stars are required for performance reasons.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
91
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
92 ;; In addition, this package includes a feature for accessing include
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
93 ;; 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
94 ;; /usr/include/sys/time.h. The variable PC-include-file-path is a
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
95 ;; list of directories in which to search for include files. Completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
96 ;; is supported in include file names.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
97
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
98
7942
bc5dccc5375f Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 7844
diff changeset
99 ;;; Code:
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
100
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
101 (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
102 "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
103 :prefix "pc-"
22250
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 22142
diff changeset
104 :group 'minibuffer
a77d473867b8 *** empty log message ***
Dan Nicolaescu <done@ece.arizona.edu>
parents: 22142
diff changeset
105 :group 'convenience)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
106
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
107 (defcustom partial-completion-mode nil
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
108 "Toggle Partial Completion mode.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
109 When Partial Completion mode is enabled, TAB (or M-TAB if `PC-meta-flag' is
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
110 nil) is enhanced so that if some string is divided into words and each word is
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
111 delimited by a character in `PC-word-delimiters', partial words are completed
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
112 as much as possible and `*' characters are treated likewise in file names.
24534
ce83f341af6f (partial-completion-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 24507
diff changeset
113 This variable should be set only with \\[customize], which is equivalent
ce83f341af6f (partial-completion-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 24507
diff changeset
114 to using the function `partial-completion-mode'."
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
115 :set (lambda (symbol value)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
116 (partial-completion-mode (or value 0)))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
117 :initialize 'custom-initialize-default
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
118 :type 'boolean
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
119 :group 'partial-completion
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
120 :require 'complete)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
121
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
122 (defcustom PC-first-char 'find-file
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
123 "*Control how the first character of a string is to be interpreted.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
124 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
125 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
126 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
127 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
128 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
129 completion."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
130 :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
131 (const :tag "literal" t)
22570
6cfe82c80677 (PC-first-char): Use `other' widget type.
Andreas Schwab <schwab@suse.de>
parents: 22250
diff changeset
132 (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
133 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
134
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
135 (defcustom PC-meta-flag t
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
136 "*If non-nil, TAB means PC completion and M-TAB means normal completion.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
137 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
138 :type 'boolean
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
139 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
140
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
141 (defcustom PC-word-delimiters "-_. "
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
142 "*A string of characters treated as word delimiters for completion.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
143 Some arcane rules:
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
144 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
145 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
146 If `-' is in this string, it must come first or right after `]'.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
147 In other words, if S is this string, then `[S]' must be a legal Emacs regular
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
148 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
149 :type 'string
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
150 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
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 (defcustom PC-include-file-path '("/usr/include" "/usr/local/include")
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
153 "*A list of directories in which to look for include files.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
154 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
155 :type '(repeat directory)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
156 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
157
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
158 (defcustom PC-disable-wildcards nil
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
159 "*If non-nil, wildcard support in \\[find-file] is disabled."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
160 :type 'boolean
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
161 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
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 (defcustom PC-disable-includes nil
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
164 "*If non-nil, include-file support in \\[find-file] is disabled."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
165 :type 'boolean
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
166 :group 'partial-completion)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
167
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
168 (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
169 "If non-nil, default partial completion key bindings are suppressed.")
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
170
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
171 (defvar PC-old-read-file-name-internal nil)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
172
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
173 ;;;###autoload
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
174 (defun partial-completion-mode (&optional arg)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
175 "Toggle Partial Completion mode.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
176 With prefix ARG, turn Partial Completion mode on if ARG is positive.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
177
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
178 When Partial Completion mode is enabled, TAB (or M-TAB if `PC-meta-flag' is
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
179 nil) is enhanced so that if some string is divided into words and each word is
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
180 delimited by a character in `PC-word-delimiters', partial words are completed
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
181 as much as possible.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
182
24507
2a7aa9cd6a19 (partial-completion-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 23009
diff changeset
183 For example, M-x p-c-m expands to M-x partial-completion-mode since no other
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
184 command begins with that sequence of characters, and
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
185 \\[find-file] f_b.c TAB might complete to foo_bar.c if that file existed and no
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
186 other file in that directory begin with that sequence of characters.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
187
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
188 Unless `PC-disable-wildcards' is non-nil, the \"*\" wildcard is interpreted
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
189 specially when entering file or directory names. For example,
24507
2a7aa9cd6a19 (partial-completion-mode): Doc fix.
Karl Heuer <kwzh@gnu.org>
parents: 23009
diff changeset
190 \\[find-file] *.c RET finds each C file in the current directory, and
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
191 \\[find-file] */foo_bar.c TAB completes the directory name as far as possible.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
192
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
193 Unless `PC-disable-includes' is non-nil, the \"<...>\" sequence is interpreted
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
194 specially in \\[find-file]. For example,
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
195 \\[find-file] <sys/time.h> RET finds the file /usr/include/sys/time.h.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
196 See also the variable `PC-include-file-path'."
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
197 (interactive "P")
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
198 (let ((on-p (if arg
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
199 (> (prefix-numeric-value arg) 0)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
200 (not partial-completion-mode))))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
201 ;; Deal with key bindings...
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
202 (PC-bindings on-p)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
203 ;; Deal with wildcard file feature...
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
204 (cond ((not on-p)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
205 (remove-hook 'find-file-not-found-hooks 'PC-try-load-many-files))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
206 ((not PC-disable-wildcards)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
207 (add-hook 'find-file-not-found-hooks 'PC-try-load-many-files)))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
208 ;; Deal with include file feature...
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
209 (cond ((not on-p)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
210 (remove-hook 'find-file-not-found-hooks 'PC-look-for-include-file))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
211 ((not PC-disable-includes)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
212 (add-hook 'find-file-not-found-hooks 'PC-look-for-include-file)))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
213 ;; ... with some underhand redefining.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
214 (cond ((and (not on-p) (functionp PC-old-read-file-name-internal))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
215 (fset 'read-file-name-internal PC-old-read-file-name-internal))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
216 ((and (not PC-disable-includes) (not PC-old-read-file-name-internal))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
217 (setq PC-old-read-file-name-internal
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
218 (symbol-function 'read-file-name-internal))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
219 (fset 'read-file-name-internal
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
220 'PC-read-include-file-name-internal)))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
221 ;; Finally set the mode variable.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
222 (setq partial-completion-mode on-p)))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
223
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
224 (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
225 (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
226 (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
227 (cond ((not bind)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
228 ;; 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
229 ;; restore the previous bindings.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
230 (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
231 (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
232 (define-key completion-map "?" 'minibuffer-completion-help)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
233
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
234 (define-key must-match-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
235 (define-key must-match-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
236 (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
237 (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
238 (define-key must-match-map "?" 'minibuffer-completion-help)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
239
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
240 (define-key global-map "\e\t" 'complete-symbol))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
241 (PC-default-bindings
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
242 (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
243 (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
244 (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
245
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
246 (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
247 (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
248 (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
249 (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
250 (define-key completion-map "\e?" 'PC-completion-help)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
251
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
252 (define-key must-match-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
253 (define-key must-match-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
254 (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
255 (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
256 (define-key must-match-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
257
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
258 (define-key must-match-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
259 (define-key must-match-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
260 (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
261 (define-key must-match-map "\e\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
262 (define-key must-match-map "\e?" 'PC-completion-help)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
263
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
264 (define-key global-map "\e\t" 'PC-lisp-complete-symbol)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
265
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
266 ;; Because the `partial-completion-mode' option is defined before the
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
267 ;; `partial-completion-mode' command and its callee, we give the former a
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
268 ;; default `:initialize' keyword value. Otherwise, the `:set' keyword value
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
269 ;; would be called to initialise the variable value, and that would call the
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
270 ;; as-yet undefined `partial-completion-mode' function.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
271 ;; Since the default `:initialize' keyword value (obviously) does not turn on
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
272 ;; Partial Completion Mode, we do that here, once the `partial-completion-mode'
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
273 ;; function and its callee are defined.
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
274 (when partial-completion-mode
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
275 (partial-completion-mode t))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
276
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
277 (defun PC-complete ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
278 "Like minibuffer-complete, but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
279 For example, \"M-x b--di\" would match `byte-recompile-directory', or any
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
280 name which consists of three or more words, the first beginning with \"b\"
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
281 and the third beginning with \"di\".
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
282
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
283 The pattern \"b--d\" is ambiguous for `byte-recompile-directory' and
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
284 `beginning-of-defun', so this would produce a list of completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
285 just like when normal Emacs completions are ambiguous.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
286
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
287 Word-delimiters for the purposes of Partial Completion are \"-\", \"_\",
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
288 \".\", and SPC."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
289 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
290 (if (PC-was-meta-key)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
291 (minibuffer-complete)
15802
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
292 ;; 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
293 ;; never scroll, always retry completion.
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
294 (or (eq last-command this-command)
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
295 (setq minibuffer-scroll-window nil))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
296 (let ((window minibuffer-scroll-window))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
297 ;; 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
298 ;; 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
299 (if (and window (window-buffer window)
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
300 (buffer-name (window-buffer window)))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
301 (save-excursion
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
302 (set-buffer (window-buffer window))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
303 (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
304 (set-window-start window (point-min) nil)
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
305 (scroll-other-window)))
1595df9ed1e8 (PC-complete): When command is repeated,
Richard M. Stallman <rms@gnu.org>
parents: 15261
diff changeset
306 (PC-do-completion nil)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
307
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
308
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
309 (defun PC-complete-word ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
310 "Like `minibuffer-complete-word', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
311 See `PC-complete' for details.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
312 This can be bound to other keys, like `-' and `.', if you wish."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
313 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
314 (if (eq (PC-was-meta-key) PC-meta-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
315 (if (eq last-command-char ? )
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
316 (minibuffer-complete-word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
317 (self-insert-command 1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
318 (self-insert-command 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
319 (if (eobp)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
320 (PC-do-completion 'word))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
321
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-complete-space ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
324 "Like `minibuffer-complete-word', 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 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
327 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
328 (if (eq (PC-was-meta-key) PC-meta-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
329 (minibuffer-complete-word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
330 (insert " ")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
331 (if (eobp)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
332 (PC-do-completion 'word))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
333
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
334
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
335 (defun PC-complete-and-exit ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
336 "Like `minibuffer-complete-and-exit', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
337 See `PC-complete' for details."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
338 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
339 (if (eq (PC-was-meta-key) PC-meta-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
340 (minibuffer-complete-and-exit)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
341 (PC-do-complete-and-exit)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
342
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
343 (defun PC-force-complete-and-exit ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
344 "Like `minibuffer-complete-and-exit', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
345 See `PC-complete' for details."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
346 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
347 (let ((minibuffer-completion-confirm nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
348 (PC-do-complete-and-exit)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
349
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
350 (defun PC-do-complete-and-exit ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
351 (if (= (buffer-size) 0) ; Duplicate the "bug" that Info-menu relies on...
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
352 (exit-minibuffer)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
353 (let ((flag (PC-do-completion 'exit)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
354 (and flag
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
355 (if (or (eq flag 'complete)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
356 (not minibuffer-completion-confirm))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
357 (exit-minibuffer)
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
358 (PC-temp-minibuffer-message " [Confirm]"))))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
359
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
360
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
361 (defun PC-completion-help ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
362 "Like `minibuffer-completion-help', but allows \"b--di\"-style abbreviations.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
363 See `PC-complete' for details."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
364 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
365 (if (eq (PC-was-meta-key) PC-meta-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
366 (minibuffer-completion-help)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
367 (PC-do-completion 'help)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
368
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
369 (defun PC-was-meta-key ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
370 (or (/= (length (this-command-keys)) 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
371 (let ((key (aref (this-command-keys) 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
372 (if (integerp key)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
373 (>= key 128)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
374 (not (null (memq 'meta (event-modifiers key))))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
375
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
376
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
377 (defvar PC-ignored-extensions 'empty-cache)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
378 (defvar PC-delims 'empty-cache)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
379 (defvar PC-ignored-regexp nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
380 (defvar PC-word-failed-flag nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
381 (defvar PC-delim-regex nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
382 (defvar PC-ndelims-regex nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
383 (defvar PC-delims-list nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
384
14765
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
385 (defvar PC-completion-as-file-name-predicate
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
386 (function
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
387 (lambda ()
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
388 (memq minibuffer-completion-table
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
389 '(read-file-name-internal read-directory-name-internal))))
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
390 "A function testing whether a minibuffer completion now will work filename-style.
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
391 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
392 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
393
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
394 (defun PC-do-completion (&optional mode beg end)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
395 (or beg (setq beg (point-min)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
396 (or end (setq end (point-max)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
397 (let* ((table minibuffer-completion-table)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
398 (pred minibuffer-completion-predicate)
14765
844686eabff0 (PC-completion-as-file-name-predicate):
Richard M. Stallman <rms@gnu.org>
parents: 14759
diff changeset
399 (filename (funcall PC-completion-as-file-name-predicate))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
400 (dirname nil)
8478
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
401 dirlength
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
402 (str (buffer-substring beg end))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
403 (incname (and filename (string-match "<\\([^\"<>]*\\)>?$" str)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
404 (ambig nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
405 basestr
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
406 regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
407 p offset
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
408 (poss nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
409 helpposs
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
410 (case-fold-search completion-ignore-case))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
411
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
412 ;; Check if buffer contents can already be considered complete
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
413 (if (and (eq mode 'exit)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
414 (PC-is-complete-p str table pred))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
415 'complete
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
416
8478
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
417 ;; Record how many characters at the beginning are not included
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
418 ;; in completion.
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
419 (setq dirlength
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
420 (if filename
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
421 (length (file-name-directory str))
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
422 0))
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
423
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
424 ;; Do substitutions in directory names
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
425 (and filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
426 (not (equal str (setq p (substitute-in-file-name str))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
427 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
428 (delete-region beg end)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
429 (insert p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
430 (setq str p end (+ beg (length str)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
431
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
432 ;; Prepare various delimiter strings
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
433 (or (equal PC-word-delimiters PC-delims)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
434 (setq PC-delims PC-word-delimiters
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
435 PC-delim-regex (concat "[" PC-delims "]")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
436 PC-ndelims-regex (concat "[^" PC-delims "]*")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
437 PC-delims-list (append PC-delims nil)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
438
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
439 ;; Look for wildcard expansions in directory name
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
440 (and filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
441 (string-match "\\*.*/" str)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
442 (let ((pat str)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
443 files)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
444 (setq p (1+ (string-match "/[^/]*\\'" pat)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
445 (while (setq p (string-match PC-delim-regex pat p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
446 (setq pat (concat (substring pat 0 p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
447 "*"
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
448 (substring pat p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
449 p (+ p 2)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
450 (setq files (PC-expand-many-files (concat pat "*")))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
451 (if files
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
452 (let ((dir (file-name-directory (car files)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
453 (p files))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
454 (while (and (setq p (cdr p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
455 (equal dir (file-name-directory (car p)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
456 (if p
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
457 (setq filename nil table nil pred nil
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
458 ambig t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
459 (delete-region beg end)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
460 (setq str (concat dir (file-name-nondirectory str)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
461 (insert str)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
462 (setq end (+ beg (length str)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
463 (setq filename nil table nil pred nil))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
464
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
465 ;; Strip directory name if appropriate
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
466 (if filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
467 (if incname
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
468 (setq basestr (substring str incname)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
469 dirname (substring str 0 incname))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
470 (setq basestr (file-name-nondirectory str)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
471 dirname (file-name-directory str)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
472 (setq basestr str))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
473
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
474 ;; Convert search pattern to a standard regular expression
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
475 (setq regex (regexp-quote basestr)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
476 offset (if (and (> (length regex) 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
477 (not (eq (aref basestr 0) ?\*))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
478 (or (eq PC-first-char t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
479 (and PC-first-char filename))) 1 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
480 p offset)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
481 (while (setq p (string-match PC-delim-regex regex p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
482 (if (eq (aref regex p) ? )
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
483 (setq regex (concat (substring regex 0 p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
484 PC-ndelims-regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
485 PC-delim-regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
486 (substring regex (1+ p)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
487 p (+ p (length PC-ndelims-regex) (length PC-delim-regex)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
488 (let ((bump (if (memq (aref regex p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
489 '(?$ ?^ ?\. ?* ?+ ?? ?[ ?] ?\\))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
490 -1 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
491 (setq regex (concat (substring regex 0 (+ p bump))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
492 PC-ndelims-regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
493 (substring regex (+ p bump)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
494 p (+ p (length PC-ndelims-regex) 1)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
495 (setq p 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
496 (if filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
497 (while (setq p (string-match "\\\\\\*" regex p))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
498 (setq regex (concat (substring regex 0 p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
499 "[^/]*"
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
500 (substring regex (+ p 2))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
501 ;;(setq the-regex regex)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
502 (setq regex (concat "\\`" regex))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
503
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
504 ;; Find an initial list of possible completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
505 (if (not (setq p (string-match (concat PC-delim-regex
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
506 (if filename "\\|\\*" ""))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
507 str
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
508 (+ (length dirname) offset))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
509
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
510 ;; Minibuffer contains no hyphens -- simple case!
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
511 (setq poss (all-completions str
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
512 table
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
513 pred))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
514
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
515 ;; Use all-completions to do an initial cull. This is a big win,
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
516 ;; since all-completions is written in C!
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
517 (let ((compl (all-completions (substring str 0 p)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
518 table
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
519 pred)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
520 (setq p compl)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
521 (while p
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
522 (and (string-match regex (car p))
16608
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
523 (progn
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
524 (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
525 (setq poss (cons (car p) poss))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
526 (setq p (cdr p)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
527
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
528 ;; Now we have a list of possible completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
529 (cond
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
530
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
531 ;; No valid completions found
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
532 ((null poss)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
533 (if (and (eq mode 'word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
534 (not PC-word-failed-flag))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
535 (let ((PC-word-failed-flag t))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
536 (delete-backward-char 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
537 (PC-do-completion 'word))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
538 (beep)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
539 (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
540 " [Ambiguous dir name]"
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
541 (if (eq mode 'help)
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
542 " [No completions]"
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
543 " [No match]")))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
544 nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
545
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
546 ;; More than one valid completion found
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
547 ((or (cdr (setq helpposs poss))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
548 (memq mode '(help word)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
549
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
550 ;; Handle completion-ignored-extensions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
551 (and filename
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
552 (not (eq mode 'help))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
553 (let ((p2 poss))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
554
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
555 ;; Build a regular expression representing the extensions list
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
556 (or (equal completion-ignored-extensions PC-ignored-extensions)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
557 (setq PC-ignored-regexp
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
558 (concat "\\("
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
559 (mapconcat
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
560 'regexp-quote
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
561 (setq PC-ignored-extensions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
562 completion-ignored-extensions)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
563 "\\|")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
564 "\\)\\'")))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
565
23009
9ffaa505edc7 (PC-do-completion): Exclude ./ and ../ from completion.
Richard M. Stallman <rms@gnu.org>
parents: 22570
diff changeset
566 ;; Check if there are any without an ignored extension.
9ffaa505edc7 (PC-do-completion): Exclude ./ and ../ from completion.
Richard M. Stallman <rms@gnu.org>
parents: 22570
diff changeset
567 ;; Also ignore `.' and `..'.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
568 (setq p nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
569 (while p2
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
570 (or (string-match PC-ignored-regexp (car p2))
23009
9ffaa505edc7 (PC-do-completion): Exclude ./ and ../ from completion.
Richard M. Stallman <rms@gnu.org>
parents: 22570
diff changeset
571 (string-match "\\(\\`\\|/\\)[.][.]?/?\\'" (car p2))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
572 (setq p (cons (car p2) p)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
573 (setq p2 (cdr p2)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
574
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
575 ;; If there are "good" names, use them
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
576 (and p (setq poss p))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
577
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
578 ;; Is the actual string one of the possible completions?
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
579 (setq p (and (not (eq mode 'help)) poss))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
580 (while (and p
16608
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
581 (not (string-equal (car p) basestr)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
582 (setq p (cdr p)))
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
583 (and p (null mode)
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
584 (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
585 (if (and p
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
586 (not (and (null mode)
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
587 (eq this-command last-command))))
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
588 t
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
589
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
590 ;; If ambiguous, try for a partial completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
591 (let ((improved nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
592 prefix
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
593 (pt nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
594 (skip "\\`"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
595
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
596 ;; Check if next few letters are the same in all cases
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
597 (if (and (not (eq mode 'help))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
598 (setq prefix (try-completion "" (mapcar 'list poss))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
599 (let ((first t) i)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
600 (if (eq mode 'word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
601 (setq prefix (PC-chop-word prefix basestr)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
602 (goto-char (+ beg (length dirname)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
603 (while (and (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
604 (setq i 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
605 (while (< i (length prefix))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
606 (if (and (< (point) end)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
607 (eq (aref prefix i)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
608 (following-char)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
609 (forward-char 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
610 (if (and (< (point) end)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
611 (or (and (looking-at " ")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
612 (memq (aref prefix i)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
613 PC-delims-list))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
614 (eq (downcase (aref prefix i))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
615 (downcase
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
616 (following-char)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
617 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
618 (delete-char 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
619 (setq end (1- end)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
620 (and filename (looking-at "\\*")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
621 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
622 (delete-char 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
623 (setq end (1- end))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
624 (setq improved t))
16608
e2858bcbed43 (PC-do-completion): Remove text properties from
Karl Heuer <kwzh@gnu.org>
parents: 15802
diff changeset
625 (insert (substring prefix i (1+ i)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
626 (setq end (1+ end)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
627 (setq i (1+ i)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
628 (or pt (equal (point) beg)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
629 (setq pt (point)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
630 (looking-at PC-delim-regex))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
631 (setq skip (concat skip
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
632 (regexp-quote prefix)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
633 PC-ndelims-regex)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
634 prefix (try-completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
635 ""
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
636 (mapcar
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
637 (function
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
638 (lambda (x)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
639 (list
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
640 (and (string-match skip x)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
641 (substring
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
642 x
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
643 (match-end 0))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
644 poss)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
645 (or (> i 0) (> (length prefix) 0))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
646 (or (not (eq mode 'word))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
647 (and first (> (length prefix) 0)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
648 (setq first nil
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
649 prefix (substring prefix 0 1))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
650 (goto-char (if (eq mode 'word) end
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
651 (or pt beg)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
652
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
653 (if (and (eq mode 'word)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
654 (not PC-word-failed-flag))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
655
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
656 (if improved
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
657
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
658 ;; We changed it... would it be complete without the space?
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
659 (if (PC-is-complete-p (buffer-substring 1 (1- end))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
660 table pred)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
661 (delete-region (1- end) end)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
662
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
663 (if improved
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
664
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
665 ;; We changed it... enough to be complete?
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
666 (and (eq mode 'exit)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
667 (PC-is-complete-p (buffer-string) table pred))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
668
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
669 ;; If totally ambiguous, display a list of completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
670 (if (or completion-auto-help
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
671 (eq mode 'help))
7844
86402e8c677b (PC-do-completion): Likewise.
Richard M. Stallman <rms@gnu.org>
parents: 7792
diff changeset
672 (with-output-to-temp-buffer "*Completions*"
8478
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
673 (display-completion-list (sort helpposs 'string-lessp))
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
674 (save-excursion
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
675 (set-buffer standard-output)
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
676 ;; Record which part of the buffer we are completing
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
677 ;; so that choosing a completion from the list
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
678 ;; knows how much old text to replace.
9d3d84a3c3fa (PC-do-completion): Set completion-base-size.
Richard M. Stallman <rms@gnu.org>
parents: 7942
diff changeset
679 (setq completion-base-size dirlength)))
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
680 (PC-temp-minibuffer-message " [Next char not unique]"))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
681 nil)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
682
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
683 ;; Only one possible completion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
684 (t
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
685 (if (equal basestr (car poss))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
686 (if (null mode)
10164
d16e46a4e34c (PC-do-completion): If complete but not unique,
Richard M. Stallman <rms@gnu.org>
parents: 8478
diff changeset
687 (PC-temp-minibuffer-message " [Sole completion]"))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
688 (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
689 (insert (format "%s"
1335cec8a016 (PC-do-completion): Clear text props from inserted text.
Richard M. Stallman <rms@gnu.org>
parents: 7639
diff changeset
690 (if filename
1335cec8a016 (PC-do-completion): Clear text props from inserted text.
Richard M. Stallman <rms@gnu.org>
parents: 7639
diff changeset
691 (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
692 (car poss)))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
693 t)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
694
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
695
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
696 (defun PC-is-complete-p (str table pred)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
697 (let ((res (if (listp table)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
698 (assoc str table)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
699 (if (vectorp table)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
700 (or (equal str "nil") ; heh, heh, heh
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
701 (intern-soft str table))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
702 (funcall table str pred 'lambda)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
703 (and res
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
704 (or (not pred)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
705 (and (not (listp table)) (not (vectorp table)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
706 (funcall pred res))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
707 res)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
708
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
709 (defun PC-chop-word (new old)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
710 (let ((i -1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
711 (j -1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
712 (while (and (setq i (string-match PC-delim-regex old (1+ i)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
713 (setq j (string-match PC-delim-regex new (1+ j)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
714 (if (and j
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
715 (or (not PC-word-failed-flag)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
716 (setq j (string-match PC-delim-regex new (1+ j)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
717 (substring new 0 (1+ j))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
718 new)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
719
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
720 (defvar PC-not-minibuffer nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
721
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
722 (defun PC-temp-minibuffer-message (message)
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
723 "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
724 (cond (PC-not-minibuffer
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
725 (message message)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
726 (sit-for 2)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
727 (message ""))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
728 ((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
729 (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
730 (t
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
731 (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
732 (save-excursion
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
733 (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
734 (insert message))
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
735 (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
736 (sit-for 2)
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
737 (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
738 (when quit-flag
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
739 (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
740 unread-command-events '(7))))))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
741
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
742
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
743 (defun PC-lisp-complete-symbol ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
744 "Perform completion on Lisp symbol preceding point.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
745 That symbol is compared against the symbols that exist
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
746 and any additional characters determined by what is there
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
747 are inserted.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
748 If the symbol starts just after an open-parenthesis,
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
749 only symbols with function definitions are considered.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
750 Otherwise, all symbols with function definitions, values
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
751 or properties are considered."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
752 (interactive)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
753 (let* ((end (point))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
754 (buffer-syntax (syntax-table))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
755 (beg (unwind-protect
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
756 (save-excursion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
757 (if lisp-mode-syntax-table
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
758 (set-syntax-table lisp-mode-syntax-table))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
759 (backward-sexp 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
760 (while (= (char-syntax (following-char)) ?\')
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
761 (forward-char 1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
762 (point))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
763 (set-syntax-table buffer-syntax)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
764 (minibuffer-completion-table obarray)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
765 (minibuffer-completion-predicate
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
766 (if (eq (char-after (1- beg)) ?\()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
767 'fboundp
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
768 (function (lambda (sym)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
769 (or (boundp sym) (fboundp sym)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
770 (symbol-plist sym))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
771 (PC-not-minibuffer t))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
772 (PC-do-completion nil beg end)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
773
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
774
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
775 ;;; Wildcards in `C-x C-f' command. This is independent from the main
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
776 ;;; completion code, except for `PC-expand-many-files' which is called
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
777 ;;; when "*"'s are found in the path during filename completion. (The
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
778 ;;; above completion code always understands "*"'s, except in file paths,
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
779 ;;; without relying on the following code.)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
780
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
781 (defvar PC-many-files-list nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
782
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
783 (defun PC-try-load-many-files ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
784 (if (string-match "\\*" buffer-file-name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
785 (let* ((pat buffer-file-name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
786 (files (PC-expand-many-files pat))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
787 (first (car files))
20709
780929dca508 (PC-try-load-many-files): Load files in reverse
Richard M. Stallman <rms@gnu.org>
parents: 18981
diff changeset
788 (next (reverse (cdr files))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
789 (kill-buffer (current-buffer))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
790 (or files
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
791 (error "No matching files"))
17352
058970c0f57f (PC-try-load-many-files): Set truename.
Richard M. Stallman <rms@gnu.org>
parents: 16608
diff changeset
792 ;; Bring the other files (not the first) into buffers.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
793 (save-window-excursion
20709
780929dca508 (PC-try-load-many-files): Load files in reverse
Richard M. Stallman <rms@gnu.org>
parents: 18981
diff changeset
794 (while next
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
795 (let ((buf (find-file-noselect (car next))))
17352
058970c0f57f (PC-try-load-many-files): Set truename.
Richard M. Stallman <rms@gnu.org>
parents: 16608
diff changeset
796 ;; Put this buffer at the front of the buffer list.
20709
780929dca508 (PC-try-load-many-files): Load files in reverse
Richard M. Stallman <rms@gnu.org>
parents: 18981
diff changeset
797 (switch-to-buffer buf))
780929dca508 (PC-try-load-many-files): Load files in reverse
Richard M. Stallman <rms@gnu.org>
parents: 18981
diff changeset
798 (setq next (cdr next))))
17352
058970c0f57f (PC-try-load-many-files): Set truename.
Richard M. Stallman <rms@gnu.org>
parents: 16608
diff changeset
799 ;; This modifies the `buf' variable inside find-file-noselect.
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
800 (setq buf (get-file-buffer first))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
801 (if buf
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
802 nil ; should do verify-visited-file-modtime stuff.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
803 (setq filename first)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
804 (setq buf (create-file-buffer filename))
17352
058970c0f57f (PC-try-load-many-files): Set truename.
Richard M. Stallman <rms@gnu.org>
parents: 16608
diff changeset
805 ;; This modified `truename' inside find-file-noselect.
058970c0f57f (PC-try-load-many-files): Set truename.
Richard M. Stallman <rms@gnu.org>
parents: 16608
diff changeset
806 (setq truename (abbreviate-file-name (file-truename filename)))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
807 (set-buffer buf)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
808 (erase-buffer)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
809 (insert-file-contents filename t))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
810 (if (cdr files)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
811 (setq PC-many-files-list (mapconcat
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
812 (if (string-match "\\*.*/" pat)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
813 'identity
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
814 'file-name-nondirectory)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
815 (cdr files) ", ")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
816 find-file-hooks (cons 'PC-after-load-many-files
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
817 find-file-hooks)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
818 ;; This modifies the "error" variable inside find-file-noselect.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
819 (setq error nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
820 t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
821 nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
822
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
823 (defun PC-after-load-many-files ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
824 (setq find-file-hooks (delq 'PC-after-load-many-files find-file-hooks))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
825 (message "Also loaded %s." PC-many-files-list))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
826
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
827 (defun PC-expand-many-files (name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
828 (save-excursion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
829 (set-buffer (generate-new-buffer " *Glob Output*"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
830 (erase-buffer)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
831 (shell-command (concat "echo " name) t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
832 (goto-char (point-min))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
833 (if (looking-at ".*No match")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
834 nil
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
835 (insert "(\"")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
836 (while (search-forward " " nil t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
837 (delete-backward-char 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
838 (insert "\" \""))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
839 (goto-char (point-max))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
840 (delete-backward-char 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
841 (insert "\")")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
842 (goto-char (point-min))
21266
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
843 (let ((files (read (current-buffer))) (p nil))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
844 (kill-buffer (current-buffer))
21266
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
845 (or (equal completion-ignored-extensions PC-ignored-extensions)
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
846 (setq PC-ignored-regexp
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
847 (concat "\\("
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
848 (mapconcat
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
849 'regexp-quote
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
850 (setq PC-ignored-extensions
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
851 completion-ignored-extensions)
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
852 "\\|")
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
853 "\\)\\'")))
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
854 (setq p nil)
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
855 (while files
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
856 (or (string-match PC-ignored-regexp (car files))
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
857 (setq p (cons (car files) p)))
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
858 (setq files (cdr files)))
af9641af8877 (PC-expand-many-files): Apply completion-ignored-extensions.
Karl Heuer <kwzh@gnu.org>
parents: 20709
diff changeset
859 p))))
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
860
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
861 ;;; Facilities for loading C header files. This is independent from the
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
862 ;;; main completion code. See also the variable `PC-include-file-path'
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
863 ;;; at top of this file.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
864
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
865 (defun PC-look-for-include-file ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
866 (if (string-match "[\"<]\\([^\"<>]*\\)[\">]?$" (buffer-file-name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
867 (let ((name (substring (buffer-file-name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
868 (match-beginning 1) (match-end 1)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
869 (punc (aref (buffer-file-name) (match-beginning 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
870 (path nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
871 new-buf)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
872 (kill-buffer (current-buffer))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
873 (if (equal name "")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
874 (save-excursion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
875 (set-buffer (car (buffer-list)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
876 (save-excursion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
877 (beginning-of-line)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
878 (if (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
879 "[ \t]*#[ \t]*include[ \t]+[<\"]\\(.+\\)[>\"][ \t]*[\n/]")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
880 (setq name (buffer-substring (match-beginning 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
881 (match-end 1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
882 punc (char-after (1- (match-beginning 1))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
883 ;; Suggested by Frank Siebenlist:
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
884 (if (or (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
885 "[ \t]*([ \t]*load[ \t]+\"\\([^\"]+\\)\"")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
886 (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
887 "[ \t]*([ \t]*load-library[ \t]+\"\\([^\"]+\\)\"")
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
888 (looking-at
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
889 "[ \t]*([ \t]*require[ \t]+'\\([^\t )]+\\)[\t )]"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
890 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
891 (setq name (buffer-substring (match-beginning 1)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
892 (match-end 1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
893 punc ?\<
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
894 path load-path)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
895 (if (string-match "\\.elc$" name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
896 (setq name (substring name 0 -1))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
897 (or (string-match "\\.el$" name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
898 (setq name (concat name ".el")))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
899 (error "Not on an #include line"))))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
900 (or (string-match "\\.[a-zA-Z0-9]+$" name)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
901 (setq name (concat name ".h")))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
902 (if (eq punc ?\<)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
903 (let ((path (or path (PC-include-file-path))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
904 (while (and path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
905 (not (file-exists-p
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
906 (concat (file-name-as-directory (car path))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
907 name))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
908 (setq path (cdr path)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
909 (if path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
910 (setq name (concat (file-name-as-directory (car path)) name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
911 (error "No such include file: <%s>" name)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
912 (let ((dir (save-excursion
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
913 (set-buffer (car (buffer-list)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
914 default-directory)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
915 (if (file-exists-p (concat dir name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
916 (setq name (concat dir name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
917 (error "No such include file: \"%s\"" name))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
918 (setq new-buf (get-file-buffer name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
919 (if new-buf
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
920 ;; no need to verify last-modified time for this!
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
921 (set-buffer new-buf)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
922 (setq new-buf (create-file-buffer name))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
923 (set-buffer new-buf)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
924 (erase-buffer)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
925 (insert-file-contents name t))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
926 (setq filename name
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
927 error nil
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
928 buf new-buf)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
929 t)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
930 nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
931
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
932 (defun PC-include-file-path ()
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
933 (or PC-include-file-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
934 (let ((env (getenv "INCPATH"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
935 (path nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
936 pos)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
937 (or env (error "No include file path specified"))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
938 (while (setq pos (string-match ":[^:]+$" env))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
939 (setq path (cons (substring env (1+ pos)) path)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
940 env (substring env 0 pos)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
941 path)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
942
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
943 ;;; This is adapted from lib-complete.el, by Mike Williams.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
944 (defun PC-include-file-all-completions (file search-path &optional full)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
945 "Return all completions for FILE in any directory on SEARCH-PATH.
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
946 If optional third argument FULL is non-nil, returned pathnames should be
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
947 absolute rather than relative to some directory on the SEARCH-PATH."
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
948 (setq search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
949 (mapcar '(lambda (dir)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
950 (if dir (file-name-as-directory dir) default-directory))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
951 search-path))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
952 (if (file-name-absolute-p file)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
953 ;; It's an absolute file name, so don't need search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
954 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
955 (setq file (expand-file-name file))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
956 (file-name-all-completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
957 (file-name-nondirectory file) (file-name-directory file)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
958 (let ((subdir (file-name-directory file))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
959 (ndfile (file-name-nondirectory file))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
960 file-lists)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
961 ;; Append subdirectory part to each element of search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
962 (if subdir
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
963 (setq search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
964 (mapcar '(lambda (dir) (concat dir subdir))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
965 search-path)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
966 file ))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
967 ;; Make list of completions in each directory on search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
968 (while search-path
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
969 (let* ((dir (car search-path))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
970 (subdir (if full dir subdir)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
971 (if (file-directory-p dir)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
972 (progn
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
973 (setq file-lists
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
974 (cons
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
975 (mapcar '(lambda (file) (concat subdir file))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
976 (file-name-all-completions ndfile
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
977 (car search-path)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
978 file-lists))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
979 (setq search-path (cdr search-path))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
980 ;; Compress out duplicates while building complete list (slloooow!)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
981 (let ((sorted (sort (apply 'nconc file-lists)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
982 '(lambda (x y) (not (string-lessp x y)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
983 compressed)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
984 (while sorted
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
985 (if (equal (car sorted) (car compressed)) nil
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
986 (setq compressed (cons (car sorted) compressed)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
987 (setq sorted (cdr sorted)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
988 compressed))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
989
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
990 (defun PC-read-include-file-name-internal (string dir action)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
991 (if (string-match "<\\([^\"<>]*\\)>?$" string)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
992 (let* ((name (substring string (match-beginning 1) (match-end 1)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
993 (str2 (substring string (match-beginning 0)))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
994 (completion-table
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
995 (mapcar (function (lambda (x) (list (format "<%s>" x))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
996 (PC-include-file-all-completions
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
997 name (PC-include-file-path)))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
998 (cond
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
999 ((not completion-table) nil)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1000 ((eq action nil) (try-completion str2 completion-table nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1001 ((eq action t) (all-completions str2 completion-table nil))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1002 ((eq action 'lambda)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1003 (eq (try-completion str2 completion-table nil) t))))
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1004 (funcall PC-old-read-file-name-internal string dir action)))
18981
6681f7141d2b customise & make installation/deinstallation happen on mode command not file load.
Simon Marshall <simon@gnu.org>
parents: 17352
diff changeset
1005
3725
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1006
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1007 (provide 'complete)
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1008
bd468d77adce Initial revision
Jim Blandy <jimb@redhat.com>
parents:
diff changeset
1009 ;;; End.