annotate lisp/ilisp/completer.new.el @ 119:d101af7320b8

Added tag r20-1b11 for changeset 7d55a9ba150c
author cvs
date Mon, 13 Aug 2007 09:24:19 +0200
parents 360340f9fd5f
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1 ;;; -*-Emacs-Lisp-*-
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
2 ;;;%Header
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
3 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
4 ;;; Rcs_Info: completer.el,v 3.23 1993/09/03 02:05:07 ivan Rel $
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
5 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
6 ;;; Partial completion mechanism for GNU Emacs. Version 3.03
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
7 ;;; Copyright (C) 1990, 1991, 1992 Chris McConnell, ccm@cs.cmu.edu.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
8 ;;; Thanks to Bjorn Victor for suggestions, testing, and patches for
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
9 ;;; file completion.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
10
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
11 ;;; This file is part of GNU Emacs.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
12
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
13 ;;; GNU Emacs is distributed in the hope that it will be useful,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
14 ;;; but WITHOUT ANY WARRANTY. No author or distributor
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
15 ;;; accepts responsibility to anyone for the consequences of using it
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
16 ;;; or for whether it serves any particular purpose or works at all,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
17 ;;; unless he says so in writing. Refer to the GNU Emacs General Public
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
18 ;;; License for full details.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
19 ;;; Everyone is granted permission to copy, modify and redistribute
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
20 ;;; GNU Emacs, but only under the conditions described in the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
21 ;;; GNU Emacs General Public License. A copy of this license is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
22 ;;; supposed to have been given to you along with GNU Emacs so you
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
23 ;;; can know your rights and responsibilities. It should be in a
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
24 ;;; file named COPYING. Among other things, the copyright notice
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
25 ;;; and this notice must be preserved on all copies.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
26
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
27 ;;; When loaded, this file extends the standard completion mechanisms
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
28 ;;; so that they perform pattern matching completions. There is also
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
29 ;;; an interface that allows it to be used by other programs. The
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
30 ;;; completion rules are:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
31 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
32 ;;; 1) If what has been typed matches any possibility, do normal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
33 ;;; completion.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
34 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
35 ;;; 2) Otherwise, generate a regular expression such that
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
36 ;;; completer-words delimit words and generate all possible matches.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
37 ;;; The variable completer-any-delimiter can be set to a character
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
38 ;;; that matches any delimiter. If it were " ", then "by d" would be
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
39 ;;; byte-recompile-directory. If completer-use-words is T, a match is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
40 ;;; unique if it is the only one with the same number of words. If
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
41 ;;; completer-use-words is NIL, a match is unique if it is the only
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
42 ;;; possibility. If you ask the completer to use its best guess, it
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
43 ;;; will be the shortest match of the possibilities unless
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
44 ;;; completer-exact is T.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
45 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
46 ;;; 3) For filenames, if completer-complete-filenames is T, each
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
47 ;;; pathname component will be individually completed, otherwise only
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
48 ;;; the final component will be completed. If you are using a
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
49 ;;; distributed file system like afs, you may want to set up a
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
50 ;;; symbolic link in your home directory or add pathname components to
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
51 ;;; completer-file-skip so that the pathname components that go across
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
52 ;;; machines do not get expanded.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
53 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
54 ;;; SPACE, TAB, LFD, RET, and ? do normal completion if possible
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
55 ;;; otherwise they do partial completion. In addition, C-DEL will
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
56 ;;; undo the last partial expansion or contraction. M-RET will always
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
57 ;;; complete to the current match before returning. This is useful
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
58 ;;; when any string is possible, but you want to complete to a string
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
59 ;;; as when calling find-file. The bindings can be changed by using
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
60 ;;; completer-load-hook.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
61 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
62 ;;; Modes that use comint-dynamic-complete (like cmushell and ilisp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
63 ;;; will also do partial completion as will M-tab in Emacs LISP.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
64 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
65 ;;; Examples:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
66 ;;; a-f auto-fill-mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
67 ;;; b--d *beginning-of-defun or byte-recompile-directory
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
68 ;;; by d *byte-recompile-directory if completer-any-delimiter is " "
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
69 ;;; ~/i.e *~/ilisp.el or ~/il-el.el or ~/ilisp.elc
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
70 ;;; /u/mi/ /usr/misc/
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
71 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
72
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
73 ;;;%Globals
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
74 ;;;%%Switches
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
75 (defvar completer-load-hook nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
76 "Hook called when minibuffer partial completion is loaded.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
77
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
78 (defvar completer-disable nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
79 "*If T, turn off partial completion. Use the command
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
80 \\[completer-toggle] to set this.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
81
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
82 (defvar completer-complete-filenames t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
83 "*If T, then each component of a filename will be completed,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
84 otherwise just the final component will be completed.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
85
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
86 (defvar completer-use-words nil ; jwz: this is HATEFUL!
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
87 "*If T, then prefer completions with the same number of words as the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
88 pattern.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
89
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
90 (defvar completer-words "---. <"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
91 "*Delimiters used in partial completions. It should be a set of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
92 characters suitable for inclusion in a [] regular expression.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
93
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
94 (defvar completer-any-delimiter nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
95 "*If a character, then a delimiter in the pattern that matches the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
96 character will match any delimiter in completer-words.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
97
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
98 (defvar completer-file-skip "^cs/$\\|@sys\\|.edu/$\\|.gov/$\\|.com/$\\|:/$"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
99 "*Regular expression for pathname components to not complete.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
100
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
101 (defvar completer-exact nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
102 "*If T, then you must have an exact match. Otherwise, the shortest
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
103 string that matches the pattern will be used.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
104
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
105 (defvar completer-cache-size 100
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
106 "*Size of cache to use for partially completed pathnames.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
107
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
108 (defvar completer-use-cache t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
109 "*Set to nil to disable the partially completed pathname cache.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
110
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
111 ;;;%%Internal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
112 (defvar completer-last-pattern ""
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
113 "The last pattern expanded.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
114
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
115 (defvar completer-message nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
116 "T if temporary message was just displayed.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
117
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
118 (defvar completer-path-cache nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
119 "Cache of (path . choices) for completer.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
120
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
121 (defvar completer-string nil "Last completer string.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
122 (defvar completer-table nil "Last completer table.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
123 (defvar completer-pred nil "Last completer pred.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
124 (defvar completer-mode nil "Last completer mode.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
125 (defvar completer-result nil "Last completer result.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
126
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
127 ;;;%Utilities
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
128 (defun completer-message (message &optional point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
129 "Display MESSAGE at optional POINT for two seconds."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
130 (setq point (or point (point-max))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
131 completer-message t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
132 (let ((end
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
133 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
134 (goto-char point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
135 (insert message)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
136 (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
137 (inhibit-quit t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
138 (sit-for 2)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
139 (delete-region point end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
140 (if (and quit-flag
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
141 ;;(not (eq 'lucid-19 ilisp-emacs-version-id))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
142 (not (string-match "Lucid" emacs-version))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
143 )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
144 (setq quit-flag nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
145 unread-command-char 7))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
146
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
147 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
148 (defun completer-deleter (regexp choices &optional keep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
149 "Destructively remove strings that match REGEXP in CHOICES and
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
150 return the modified list. If optional KEEP, then keep entries that
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
151 match regexp."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
152 (let* ((choiceb choices)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
153 choicep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
154 (if keep
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
155 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
156 (while (and choiceb (not (string-match regexp (car choiceb))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
157 (setq choiceb (cdr choiceb)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
158 (setq choicep choiceb)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
159 (while (cdr choicep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
160 (if (string-match regexp (car (cdr choicep)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
161 (setq choicep (cdr choicep))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
162 (rplacd choicep (cdr (cdr choicep))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
163 (while (and choiceb (string-match regexp (car choiceb)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
164 (setq choiceb (cdr choiceb)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
165 (setq choicep choiceb)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
166 (while (cdr choicep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
167 (if (string-match regexp (car (cdr choicep)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
168 (rplacd choicep (cdr (cdr choicep)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
169 (setq choicep (cdr choicep)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
170 choiceb))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
171
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
172 ;;;%%Regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
173 (defun completer-regexp (string delimiters any)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
174 "Convert STRING into a regexp with words delimited by characters in
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
175 DELIMITERS. Any delimiter in STRING that is the same as ANY will
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
176 match any delimiter."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
177 (let* ((delimiter-reg (concat "[" delimiters "]"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
178 (limit (length string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
179 (pos 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
180 (regexp "^"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
181 (while (and (< pos limit) (string-match delimiter-reg string pos))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
182 (let* ((begin (match-beginning 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
183 (end (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
184 (delimiter (substring string begin end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
185 (anyp (eq (elt string begin) any)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
186 (setq regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
187 (format "%s%s[^%s]*%s"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
188 regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
189 (regexp-quote (substring string pos begin))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
190 (if anyp delimiters delimiter)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
191 (if anyp delimiter-reg delimiter))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
192 pos end)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
193 (if (<= pos limit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
194 (setq regexp (concat regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
195 (regexp-quote (substring string pos limit)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
196
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
197 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
198 (defun completer-words (regexp string &optional limit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
199 "Return the number of words matching REGEXP in STRING up to LIMIT."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
200 (setq limit (or limit 1000))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
201 (let ((count 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
202 (pos 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
203 (while (and (string-match regexp string pos) (<= count limit))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
204 (setq count (1+ count)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
205 pos (match-end 0)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
206 count))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
207
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
208 ;;;%Matcher
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
209 (defun completer-matches (string choices delimiters any)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
210 "Return STRING's matches in CHOICES using DELIMITERS and wildcard
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
211 ANY to segment the strings."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
212 (let* ((regexp (concat "[" delimiters "]"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
213 (from nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
214 (to 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
215 (pattern nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
216 (len (length string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
217 (matches nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
218 sub sublen choice word wordlen pat)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
219 ;; Segment pattern
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
220 (while (< (or from 0) len)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
221 (setq to (or (string-match regexp string (if from (1+ from))) len))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
222 (if (eq (elt string (or from 0)) completer-any-delimiter)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
223 (setq sub (substring string (if from (1+ from) 0) to)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
224 sublen (- (length sub)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
225 (setq sub (substring string (or from 0) to)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
226 sublen (length sub)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
227 (setq pattern (cons (cons sub sublen) pattern)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
228 from to))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
229 (setq pattern (reverse pattern))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
230 ;; Find choices that match patterns
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
231 (setq regexp (concat "[" delimiters "]"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
232 (while choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
233 (setq choice (car choices)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
234 word pattern
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
235 from 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
236 (while (and word from
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
237 (let* (begin end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
238 (if (< (setq wordlen (cdr (setq pat (car word)))) 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
239 (setq begin (1+ from)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
240 end (+ begin (- wordlen)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
241 (setq begin from
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
242 end (+ begin wordlen)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
243 (and (<= end (length choice))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
244 (or (zerop wordlen)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
245 (string-equal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
246 (car pat)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
247 (substring choice begin end))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
248 (setq from (string-match regexp choice
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
249 (if (and (zerop from) (zerop wordlen))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
250 from
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
251 (1+ from)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
252 word (cdr word)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
253 (if (not word) (setq matches (cons choice matches)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
254 (setq choices (cdr choices)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
255 matches))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
256
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
257 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
258 (defun completer-choice (string choices delimiters use-words)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
259 "Return the best match of STRING in CHOICES with DELIMITERS between
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
260 words and T if it is unique. A match is unique if it is the only
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
261 possibility or when USE-WORDS the only possibility with the same
108
360340f9fd5f Import from CVS: tag r20-1b6
cvs
parents: 70
diff changeset
262 number of words. The shortest string of multiple possibilities will be
4
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
263 the best match."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
264 (or (if (null (cdr choices)) (cons (car choices) t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
265 (let* ((regexp (concat "[^" delimiters "]*[" delimiters "]"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
266 (words (if use-words (completer-words regexp string)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
267 (choice choices)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
268 (unique-p nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
269 (match nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
270 (match-count nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
271 (match-len 1000))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
272 (while choice
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
273 (let* ((current (car choice))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
274 (length (length current)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
275 (if match-count
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
276 (if (= (completer-words regexp current words) words)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
277 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
278 (setq unique-p nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
279 (if (< length match-len)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
280 (setq match current
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
281 match-len length))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
282 (if (and use-words
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
283 (= (completer-words regexp current words) words))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
284 (setq match current
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
285 match-len length
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
286 match-count t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
287 unique-p t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
288 (if (< length match-len)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
289 (setq match current
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
290 match-len length)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
291 (setq choice (cdr choice)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
292 (cons match unique-p))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
293
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
294 ;;;%Completer
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
295 ;;;%%Utilities
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
296 (defun completer-region (delimiters)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
297 "Return the completion region bounded by characters in DELIMITERS
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
298 for the current buffer assuming that point is in it."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
299 (cons (save-excursion (skip-chars-backward delimiters) (point))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
300 (save-excursion (skip-chars-forward delimiters) (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
301
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
302 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
303 (defun completer-last-component (string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
304 "Return the start of the last filename component in STRING."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
305 (let ((last (1- (length string)) )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
306 (match 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
307 (end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
308 (while (and (setq match (string-match "/" string end)) (< match last))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
309 (setq end (1+ match)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
310 end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
311
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
312 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
313 (defun completer-match-record (string matches delimiters any dir mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
314 "Return (match lcs choices unique) for STRING in MATCHES with
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
315 DELIMITERS or ANY wildcards and DIR if a filename when in MODE."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
316 (let ((pattern (if dir
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
317 (substring string (completer-last-component string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
318 string)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
319 (setq matches (completer-matches pattern matches delimiters any))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
320 (if (cdr matches)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
321 (let ((match
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
322 (if (not completer-exact)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
323 (completer-choice
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
324 pattern matches delimiters completer-use-words)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
325 (lcs (concat dir (try-completion "" (mapcar 'list matches)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
326 (list (if match (concat dir (car match)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
327 lcs
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
328 matches (cdr match)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
329 (if matches
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
330 (let ((match (concat dir (car matches))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
331 (list match match matches t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
332 (list nil nil nil nil)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
333
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
334 ;;;%%Complete file
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
335 (defun completer-extension-regexp (extensions)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
336 "Return a regexp that matches any of EXTENSIONS."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
337 (let ((regexp "\\("))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
338 (while extensions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
339 (setq regexp (concat regexp (car extensions)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
340 (if (cdr extensions) "\\|"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
341 extensions (cdr extensions)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
342 (concat regexp "\\)$")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
343
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
344 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
345 (defun completer-flush ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
346 "Flush completer's pathname cache."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
347 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
348 (setq completer-path-cache nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
349
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
350 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
351 (defun completer-cache (path pred words any mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
352 "Check to see if PATH is in path cache with PRED, WORDS, ANY and
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
353 MODE."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
354 (let* ((last nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
355 (ptr completer-path-cache)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
356 (size 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
357 (result nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
358 (if completer-use-cache
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
359 (while ptr
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
360 (let ((current (car (car ptr))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
361 (if (string-equal current path)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
362 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
363 (if last
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
364 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
365 (rplacd last (cdr ptr))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
366 (rplacd ptr completer-path-cache)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
367 (setq completer-path-cache ptr)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
368 (setq result (cdr (car ptr))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
369 ptr nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
370 (if (cdr ptr) (setq last ptr))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
371 (setq size (1+ size)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
372 ptr (cdr ptr))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
373 (or result
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
374 (let* ((choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
375 (completer path 'read-file-name-internal pred words any
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
376 mode t)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
377 (if (and (or (car (cdr (cdr (cdr choices))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
378 (string= path (car choices)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
379 (eq (elt (car choices) (1- (length (car choices)))) ?/))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
380 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
381 (if (>= size completer-cache-size) (rplacd last nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
382 (setq completer-path-cache
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
383 (cons (cons path choices) completer-path-cache))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
384 choices))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
385
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
386 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
387 (defun completer-file (string pred words any mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
388 "Return (match common-substring matches unique-p) for STRING using
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
389 read-file-name-internal for choices that pass PRED using WORDS to
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
390 delimit words. Optional ANY is a delimiter that matches any of the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
391 delimiters in WORD. If optional MODE is nil or 'help then possible
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
392 matches will always be returned."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
393 (let* ((case-fold-search completion-ignore-case)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
394 (last (and (eq mode 'exit-ok) (completer-last-component string)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
395 (position
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
396 ;; Special hack for CMU RFS filenames
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
397 (if (string-match "^/\\.\\./[^/]*/" string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
398 (match-end 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
399 (string-match "[^~/]" string)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
400 (new (substring string 0 position))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
401 (user (if (string= new "~")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
402 (setq new (file-name-directory (expand-file-name new)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
403 (words (concat words "/"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
404 (len (length string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
405 (choices nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
406 end
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
407 (old-choices (list nil nil nil nil)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
408 (while position
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
409 (let* ((begin (string-match "/" string position))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
410 (exact-p nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
411 (setq end (if begin (match-end 0))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
412 choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
413 ;; Ends with a /, so check files in directory
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
414 (if (and (memq mode '(nil help)) (= position len))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
415 (completer-match-record
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
416 ""
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
417 ;; This assumes that .. and . come at the end
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
418 (let* ((choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
419 (all-completions new 'read-file-name-internal))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
420 (choicep choices))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
421 (if (string= (car choicep) "../")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
422 (cdr (cdr choicep))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
423 (while (cdr choicep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
424 (if (string= (car (cdr choicep)) "../")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
425 (rplacd choicep nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
426 (setq choicep (cdr choicep)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
427 choices))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
428 words any new mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
429 (if (eq position last)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
430 (let ((new (concat new (substring string position))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
431 (list new new nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
432 (let ((component (substring string position end)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
433 (if (and end
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
434 (string-match completer-file-skip component))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
435 ;; Assume component is complete
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
436 (list (concat new component)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
437 (concat new component)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
438 nil t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
439 (completer-cache
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
440 (concat new component)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
441 pred words any mode))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
442 ;; Keep going if unique or we match exactly
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
443 (if (or (car (cdr (cdr (cdr choices))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
444 (setq exact-p
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
445 (string= (concat new (substring string position end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
446 (car choices))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
447 (setq old-choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
448 (let* ((lcs (car (cdr choices)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
449 (matches (car (cdr (cdr choices))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
450 (slash (and lcs (string-match "/$" lcs))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
451 (list nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
452 (if slash (substring lcs 0 slash) lcs)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
453 (if (and (cdr matches)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
454 (or (eq mode 'help) (not exact-p)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
455 matches)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
456 nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
457 new (car choices)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
458 position end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
459 ;; Its ok to not match user names because they may be in
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
460 ;; different root directories
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
461 (if (and (= position 1) (= (elt string 0) ?~))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
462 (setq new (substring string 0 end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
463 choices (list new new (list new) t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
464 user nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
465 position end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
466 (setq position nil)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
467 (if (not (car choices))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
468 (setq choices old-choices))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
469 (if (and (car choices)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
470 (not (eq mode 'help))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
471 (not (car (cdr (cdr (cdr choices))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
472 ;; Try removing completion ignored extensions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
473 (let* ((extensions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
474 (completer-extension-regexp completion-ignored-extensions))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
475 (choiceb (car (cdr (cdr choices))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
476 (choicep choiceb)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
477 (isext nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
478 (noext nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
479 (while choicep
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
480 (if (string-match extensions (car choicep))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
481 (setq isext t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
482 (setq noext t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
483 (if (and isext noext)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
484 ;; There are matches besides extensions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
485 (setq choiceb (completer-deleter extensions choiceb)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
486 choicep nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
487 (setq choicep (cdr choicep))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
488 (if (and isext noext)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
489 (setq choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
490 (completer-match-record
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
491 (if end (substring string end) "")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
492 choiceb words any
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
493 (file-name-directory (car (cdr choices)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
494 mode)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
495 (if user
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
496 (let ((match (car choices))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
497 (lcs (car (cdr choices)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
498 (len (length user)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
499 (setq choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
500 (cons (if match (concat "~" (substring match len)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
501 (cons (if lcs (concat "~" (substring lcs len)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
502 (cdr (cdr choices)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
503 choices))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
504
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
505 ;;;%Exported program interface
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
506 ;;;%%Completer
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
507 (defun completer (string table pred words
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
508 &optional any mode file-p)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
509 "Return (match common-substring matches unique-p) for STRING in
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
510 TABLE for choices that pass PRED using WORDS to delimit words. If the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
511 flag completer-complete-filenames is T and the table is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
512 read-file-name-internal, then filename components will be individually
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
513 expanded. Optional ANY is a delimiter that can match any delimiter in
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
514 WORDS. Optional MODE is nil for complete, 'help for help and 'exit
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
515 for exit."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
516 (if (and (stringp completer-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
517 (string= string completer-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
518 (eq table completer-table)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
519 (eq pred completer-pred)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
520 (not file-p)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
521 (or (eq mode completer-mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
522 (not (memq table '(read-file-name-internal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
523 read-directory-name-internal)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
524 completer-result
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
525 (setq
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
526 completer-string ""
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
527 completer-table table
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
528 completer-pred pred
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
529 completer-mode mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
530 completer-result
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
531 (if (and completer-complete-filenames
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
532 (not file-p) (eq table 'read-file-name-internal))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
533 (completer-file string pred words any mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
534 (let* ((file-p (or file-p (eq table 'read-file-name-internal)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
535 (case-fold-search completion-ignore-case)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
536 (pattern (concat "[" words "]"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
537 (component (if file-p (completer-last-component string)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
538 (dir (if component (substring string 0 component)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
539 (string (if dir (substring string component) string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
540 (has-words (or (string-match pattern string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
541 (length string))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
542 (if (and file-p (string-match "^\\$" string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
543 ;; Handle environment variables
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
544 (let ((match
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
545 (getenv (substring string 1
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
546 (string-match "/" string)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
547 (if match (setq match (concat match "/")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
548 (list match match (list match) match))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
549 (let* ((choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
550 (all-completions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
551 (concat dir (substring string 0 has-words))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
552 table pred))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
553 (regexp (completer-regexp string words any)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
554 (if choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
555 (completer-match-record
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
556 string
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
557 (completer-deleter regexp choices t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
558 words any dir mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
559 (list nil nil nil nil))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
560 completer-string string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
561 completer-result))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
562
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
563 ;;;%%Display choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
564 (defun completer-display-choices (choices &optional match message end
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
565 display)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
566 "Display the list of possible CHOICES with optional MATCH, MESSAGE,
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
567 END and DISPLAY. If MATCH is non-nil, it will be flagged as the best
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
568 guess. If there are no choices, display MESSAGE. END is where to put
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
569 temporary messages. If DISPLAY is present then it will be called on
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
570 each possible completion and should return a string."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
571 (if choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
572 (with-output-to-temp-buffer " *Completions*"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
573 (if (cdr choices)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
574 (display-completion-list
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
575 (sort
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
576 (if display
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
577 (let ((old choices)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
578 (new nil))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
579 (while old
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
580 (setq new (cons (funcall display (car old)) new)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
581 old (cdr old)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
582 new)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
583 (copy-sequence choices))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
584 (function (lambda (x y)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
585 (string-lessp (or (car-safe x) x)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
586 (or (car-safe y) y)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
587 (if match
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
588 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
589 (set-buffer " *Completions*")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
590 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
591 (insert "Guess = " match (if (cdr choices) ", " "")))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
592 (beep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
593 (completer-message (or message " (No completions)") end)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
594
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
595 ;;;%%Goto
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
596 (defun completer-goto (match lcs choices unique delimiters words
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
597 &optional mode display)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
598 "MATCH is the best match, LCS is the longest common substring of all
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
599 of the matches. CHOICES is a list of the possibilities, UNIQUE
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
600 indicates if MATCH is unique. DELIMITERS are possible bounding
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
601 characters for the completion region. WORDS are the characters that
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
602 delimit the words for partial matches. Replace the region bounded by
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
603 delimiters with the match if unique and the lcs otherwise unless
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
604 optional MODE is 'help. Then go to the part of the string that
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
605 disambiguates choices using WORDS to separate words and display the
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
606 possibilities if the string was not extended. If optional DISPLAY is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
607 present then it will be called on each possible completion and should
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
608 return a string."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
609 (setq completer-message nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
610 (let* ((region (completer-region delimiters))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
611 (start (car region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
612 (end (cdr region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
613 (string (buffer-substring start end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
614 (file-p (string-match "[^ ]*\\(~\\|/\\|$\\)" string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
615 (no-insert (eq mode 'help))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
616 (message t)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
617 (new (not (string= (buffer-substring start (point)) lcs))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
618 (if unique
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
619 (if no-insert
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
620 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
621 (goto-char end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
622 (completer-display-choices choices match nil end display))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
623 (if (string= string match)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
624 (if (not file-p)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
625 (progn (goto-char end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
626 (completer-message " (Sole completion)" end)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
627 (completer-insert match delimiters)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
628 ;;Not unique
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
629 (if lcs
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
630 (let* ((regexp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
631 (concat "[" words (if file-p "/") "]"))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
632 (words (completer-words regexp lcs))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
633 point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
634 ;; Go to where its ambiguous
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
635 (goto-char start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
636 (if (not no-insert)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
637 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
638 (insert lcs)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
639 (setq completer-last-pattern
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
640 (list string delimiters (current-buffer) start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
641 start (point)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
642 end (+ end (length lcs)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
643 ;; Skip to the first delimiter in the original string
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
644 ;; beyond the ambiguous point and keep from there on
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
645 (if (re-search-forward regexp end 'move words)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
646 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
647 (if (and (not no-insert) match)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
648 (let ((delimiter
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
649 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
650 (string-match lcs match)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
651 (substring match (match-end 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
652 (1+ (match-end 0))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
653 (if (string-match regexp delimiter)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
654 (insert delimiter))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
655 (forward-char -1)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
656 (if (not no-insert)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
657 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
658 (setq end (- end (- (point) start)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
659 (delete-region start (point))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
660 (if choices
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
661 (if (or no-insert (not new))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
662 (completer-display-choices choices match nil end display))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
663 (if file-p
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
664 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
665 (if (not (= (point) end)) (forward-char 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
666 (if (not (save-excursion (re-search-forward "/" end t)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
667 (goto-char end))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
668 (if message
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
669 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
670 (beep)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
671 (completer-message (if no-insert
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
672 " (No completions)"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
673 " (No match)")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
674 end)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
675
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
676 ;;;%Exported buffer interface
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
677 ;;;%%Complete and go
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
678 (defun completer-complete-goto (delimiters words table pred
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
679 &optional no-insert display)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
680 "Complete the string bound by DELIMITERS using WORDS to bound words
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
681 for partial matches in TABLE with PRED and then insert the longest
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
682 common substring unless optional NO-INSERT and go to the point of
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
683 ambiguity. If optional DISPLAY, it will be called on each match when
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
684 possible completions are shown and should return a string."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
685 (let* ((region (completer-region delimiters)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
686 (apply 'completer-goto
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
687 (append (completer (buffer-substring (car region) (cdr region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
688 table pred words completer-any-delimiter
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
689 no-insert)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
690 (list delimiters words no-insert display)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
691
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
692 ;;;%%Undo
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
693 (defun completer-insert (match delimiters &optional buffer undo)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
694 "Replace the region bounded with characters in DELIMITERS by MATCH
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
695 and save it so that it can be restored by completer-undo."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
696 (let* ((region (completer-region delimiters))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
697 (start (car region))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
698 (end (cdr region)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
699 (if (and undo (or (not (= start undo))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
700 (not (eq (current-buffer) buffer))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
701 (error "No previous pattern")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
702 (setq completer-last-pattern (list (buffer-substring start end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
703 delimiters
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
704 (current-buffer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
705 start))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
706 (delete-region start end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
707 (goto-char start)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
708 (insert match))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
709
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
710 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
711 (defun completer-undo ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
712 "Swap the last expansion and the last match pattern."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
713 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
714 (if completer-last-pattern
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
715 (apply 'completer-insert completer-last-pattern)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
716 (error "No previous pattern")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
717
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
718 ;;;%Minibuffer specific code
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
719 ;;;%%Utilities
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
720 (defun completer-minibuf-string ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
721 "Remove dead filename specs from the minibuffer as delimited by //
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
722 or ~ or $ and return the resulting string."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
723 (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
724 (goto-char (point-max))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
725 (if (and (eq minibuffer-completion-table 'read-file-name-internal)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
726 (re-search-backward "//\\|/~\\|.\\$" nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
727 (delete-region (point-min) (1+ (point))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
728 (buffer-substring (point-min) (point-max))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
729
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
730 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
731 (defun completer-minibuf-exit ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
732 "Exit and clear pattern."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
733 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
734 (setq completer-last-pattern nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
735 (exit-minibuffer))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
736
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
737 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
738 (defun completer-new-cmd (cmd)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
739 "Return T if we can't execute the old minibuffer version of CMD."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
740 (if (or completer-disable
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
741 (let ((string (completer-minibuf-string)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
742 (or
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
743 (not (string-match
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
744 (concat "[" completer-words "/~]")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
745 string))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
746 (condition-case ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
747 (let ((completion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
748 (try-completion string
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
749 minibuffer-completion-table
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
750 minibuffer-completion-predicate)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
751 (if (eq minibuffer-completion-table
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
752 'read-file-name-internal)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
753 ;; Directories complete as themselves
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
754 (and completion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
755 (or (not (string= string completion))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
756 (file-exists-p completion)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
757 completion))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
758 (error nil)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
759 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
760 (funcall cmd)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
761 nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
762 t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
763
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
764 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
765 (defun completer-minibuf (&optional mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
766 "Partial completion of minibuffer expressions. Optional MODE is
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
767 'help for help and 'exit for exit.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
768
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
769 If what has been typed so far matches any possibility normal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
770 completion will be done. Otherwise, the string is considered to be a
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
771 pattern with words delimited by the characters in
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
772 completer-words. If completer-exact is T, the best match will be
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
773 the shortest one with the same number of words as the pattern if
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
774 possible and otherwise the shortest matching expression. If called
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
775 with a prefix, caching will be temporarily disabled.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
776
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
777 Examples:
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
778 a-f auto-fill-mode
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
779 r-e rmail-expunge
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
780 b--d *begining-of-defun or byte-recompile-directory
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
781 by d *byte-recompile-directory if completer-any-delimiter is \" \"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
782 ~/i.e *~/ilisp.el or ~/il-el.el or ~/ilisp.elc
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
783 /u/mi/ /usr/misc/"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
784 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
785 (append
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
786 (let ((completer-use-cache (not (or (not completer-use-cache)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
787 current-prefix-arg))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
788 (completer (completer-minibuf-string)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
789 minibuffer-completion-table
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
790 minibuffer-completion-predicate
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
791 completer-words
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
792 completer-any-delimiter
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
793 mode))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
794 (list "^" completer-words mode)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
795
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
796 ;;;%%Commands
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
797 (defun completer-toggle ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
798 "Turn partial completion on or off."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
799 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
800 (setq completer-disable (not completer-disable))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
801 (message (if completer-disable
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
802 "Partial completion OFF"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
803 "Partial completion ON")))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
804
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
805 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
806 (defvar completer-old-help
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
807 (lookup-key minibuffer-local-must-match-map "?")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
808 "Old binding of ? in minibuffer completion map.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
809 (defun completer-help ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
810 "Partial completion minibuffer-completion-help.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
811 See completer-minibuf for more information."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
812 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
813 (if (completer-new-cmd completer-old-help)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
814 (apply 'completer-goto (completer-minibuf 'help))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
815
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
816 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
817 (defvar completer-old-completer
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
818 (lookup-key minibuffer-local-must-match-map "\t")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
819 "Old binding of TAB in minibuffer completion map.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
820 (defun completer-complete ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
821 "Partial completion minibuffer-complete.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
822 See completer-minibuf for more information."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
823 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
824 (if (completer-new-cmd completer-old-completer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
825 (apply 'completer-goto (completer-minibuf))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
826
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
827 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
828 (defvar completer-old-word
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
829 (lookup-key minibuffer-local-must-match-map " ")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
830 "Old binding of SPACE in minibuffer completion map.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
831 (defun completer-word ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
832 "Partial completion minibuffer-complete.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
833 See completer-minibuf for more information."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
834 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
835 (if (eq completer-any-delimiter ?\ )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
836 (insert ?\ )
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
837 (if (completer-new-cmd completer-old-word)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
838 (apply 'completer-goto (completer-minibuf)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
839
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
840 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
841 (defvar completer-old-exit
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
842 (lookup-key minibuffer-local-must-match-map "\n")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
843 "Old binding of RET in minibuffer completion map.")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
844 (defun completer-exit ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
845 "Partial completion minibuffer-complete-and-exit.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
846 See completer-minibuf for more information."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
847 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
848 (if (completer-new-cmd completer-old-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
849 (let* ((completions (completer-minibuf 'exit))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
850 (match (car completions))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
851 (unique-p (car (cdr (cdr (cdr completions))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
852 (apply 'completer-goto completions)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
853 (if unique-p
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
854 (completer-minibuf-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
855 (if match
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
856 (progn (completer-insert match "^")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
857 (if minibuffer-completion-confirm
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
858 (completer-message " (Confirm)")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
859 (completer-minibuf-exit)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
860 (if (not completer-message) (beep)))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
861
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
862 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
863 (defun completer-match-exit ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
864 "Exit the minibuffer with the current best match."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
865 (interactive)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
866 (let* ((completions (completer-minibuf 'exit))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
867 (guess (car completions)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
868 (if (not guess)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
869 ;; OK if last filename component doesn't match
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
870 (setq completions (completer-minibuf 'exit-ok)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
871 guess (car completions)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
872 (if guess
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
873 (progn
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
874 (goto-char (point-min))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
875 (insert guess)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
876 (delete-region (point) (point-max))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
877 (exit-minibuffer))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
878 (apply 'completer-goto completions))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
879
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
880 ;;;%%Keymaps
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
881 (define-key minibuffer-local-completion-map "\C-_" 'completer-undo)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
882 (define-key minibuffer-local-completion-map "\t" 'completer-complete)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
883 (define-key minibuffer-local-completion-map " " 'completer-word)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
884 (define-key minibuffer-local-completion-map "?" 'completer-help)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
885 (define-key minibuffer-local-completion-map "\n" 'completer-minibuf-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
886 (define-key minibuffer-local-completion-map "\r" 'completer-minibuf-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
887 (define-key minibuffer-local-completion-map "\M-\n" 'completer-match-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
888 (define-key minibuffer-local-completion-map "\M-\r" 'completer-match-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
889
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
890 (define-key minibuffer-local-must-match-map "\C-_" 'completer-undo)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
891 (define-key minibuffer-local-must-match-map "\t" 'completer-complete)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
892 (define-key minibuffer-local-must-match-map " " 'completer-word)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
893 (define-key minibuffer-local-must-match-map "\n" 'completer-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
894 (define-key minibuffer-local-must-match-map "\r" 'completer-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
895 (define-key minibuffer-local-must-match-map "?" 'completer-help)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
896 (define-key minibuffer-local-must-match-map "\M-\n" 'completer-match-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
897 (define-key minibuffer-local-must-match-map "\M-\r" 'completer-match-exit)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
898
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
899 ;;;%comint
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
900 (defun completer-comint-dynamic-list-completions (completions)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
901 "List in help buffer sorted COMPLETIONS.
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
902 Typing SPC flushes the help buffer."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
903 (completer-comint-dynamic-complete-1 nil 'help))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
904
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
905 (defun completer-comint-dynamic-complete-filename ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
906 "Dynamically complete the filename at point."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
907 (completer-comint-dynamic-complete-1 nil t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
908
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
909 ;;;
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
910 (defun completer-comint-dynamic-complete-1 (&optional undo mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
911 "Complete the previous filename or display possibilities if done
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
912 twice in a row. If called with a prefix, undo the last completion."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
913 (interactive "P")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
914 (if undo
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
915 (completer-undo)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
916 ;; added by jwz: don't cache completions in shell buffer!
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
917 (setq completer-string nil)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
918 (let ((conf (current-window-configuration)));; lemacs change
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
919 (completer-complete-goto
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
920 "^ \t\n\""
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
921 completer-words
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
922 'read-file-name-internal
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
923 default-directory
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
924 mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
925 ;; lemacs change
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
926 (if (eq mode 'help) (comint-restore-window-config conf))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
927 )))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
928 ;(fset 'comint-dynamic-complete 'completer-comint-dynamic-complete)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
929 (fset 'comint-dynamic-complete-filename
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
930 'completer-comint-dynamic-complete-filename)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
931 (fset 'comint-dynamic-list-completions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
932 'completer-comint-dynamic-list-completions)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
933
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
934 ;;; Set the functions again if comint is loaded
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
935 (setq comint-load-hook
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
936 (cons (function (lambda ()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
937 ;; (fset 'comint-dynamic-complete
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
938 ;; 'completer-comint-dynamic-complete)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
939 (fset 'comint-dynamic-complete-filename
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
940 'completer-comint-dynamic-complete-filename)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
941 (fset 'comint-dynamic-list-completions
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
942 'completer-comint-dynamic-list-completions)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
943 (if (and (boundp 'comint-load-hook) comint-load-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
944 (if (consp comint-load-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
945 (if (eq (car comint-load-hook) 'lambda)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
946 (list comint-load-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
947 comint-load-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
948 (list comint-load-hook)))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
949
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
950 ;;;%lisp-complete-symbol
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
951 (defun lisp-complete-symbol (&optional mode)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
952 "Perform partial completion on Lisp symbol preceding point. That
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
953 symbol is compared against the symbols that exist and any additional
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
954 characters determined by what is there are inserted. If the symbol
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
955 starts just after an open-parenthesis, only symbols with function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
956 definitions are considered. Otherwise, all symbols with function
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
957 definitions, values or properties are considered. If called with a
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
958 negative prefix, the last completion will be undone."
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
959 (interactive "P")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
960 (if (< (prefix-numeric-value mode) 0)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
961 (completer-undo)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
962 (let* ((end (save-excursion (skip-chars-forward "^ \t\n)]}\"") (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
963 (beg (save-excursion
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
964 (backward-sexp 1)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
965 (while (= (char-syntax (following-char)) ?\')
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
966 (forward-char 1))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
967 (point)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
968 (pattern (buffer-substring beg end))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
969 (predicate
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
970 (if (eq (char-after (1- beg)) ?\()
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
971 'fboundp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
972 (function (lambda (sym)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
973 (or (boundp sym) (fboundp sym)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
974 (symbol-plist sym))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
975 (completion (try-completion pattern obarray predicate)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
976 (cond ((eq completion t))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
977 ((null completion)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
978 (completer-complete-goto
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
979 "^ \t\n\(\)[]{}'`" completer-words
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
980 obarray predicate
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
981 nil
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
982 (if (not (eq predicate 'fboundp))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
983 (function (lambda (choice)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
984 (if (fboundp (intern choice))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
985 (list choice " <f>")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
986 choice))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
987 ((not (string= pattern completion))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
988 (delete-region beg end)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
989 (insert completion))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
990 (t
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
991 (message "Making completion list...")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
992 (let ((list (all-completions pattern obarray predicate)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
993 (or (eq predicate 'fboundp)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
994 (let (new)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
995 (while list
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
996 (setq new (cons (if (fboundp (intern (car list)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
997 (list (car list) " <f>")
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
998 (car list))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
999 new))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1000 (setq list (cdr list)))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1001 (setq list (nreverse new))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1002 (with-output-to-temp-buffer "*Help*"
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1003 (display-completion-list
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1004 (sort list (function (lambda (x y)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1005 (string-lessp
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1006 (or (car-safe x) x)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1007 (or (car-safe y) y))))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1008 (message "Making completion list...%s" "done"))))))
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1009
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1010 ;;;%Hooks
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1011 (provide 'completer)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1012 (run-hooks 'completer-load-hook)
b82b59fe008d Import from CVS: tag r19-15b3
cvs
parents:
diff changeset
1013