annotate lisp/minibuf.el @ 5753:dbd8305e13cb

Warn about non-string non-integer ARG to #'gensym, bytecomp.el. lisp/ChangeLog addition: 2013-08-21 Aidan Kehoe <kehoea@parhasard.net> * bytecomp.el: * bytecomp.el (gensym): * bytecomp.el (byte-compile-gensym): New. Warn that gensym called in a for-effect context is unlikely to be useful. Warn about non-string non-integer ARGs, this is incorrect. Am not changing the function to error with same, most code that makes the mistake is has no problems, which is why it has survived so long. * window-xemacs.el (save-window-excursion/mapping): * window.el (save-window-excursion): Call #'gensym with a string, not a symbol.
author Aidan Kehoe <kehoea@parhasard.net>
date Wed, 21 Aug 2013 19:02:59 +0100
parents f9e4d44504a4
children bbe4146603db
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1 ;;; minibuf.el --- Minibuffer functions for XEmacs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
3 ;; Copyright (C) 1992, 1993, 1994, 1997 Free Software Foundation, Inc.
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
4 ;; Copyright (C) 1995 Tinker Systems.
771
943eaba38521 [xemacs-hg @ 2002-03-13 08:51:24 by ben]
ben
parents: 765
diff changeset
5 ;; Copyright (C) 1995, 1996, 2000, 2002 Ben Wing.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
6
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
7 ;; Author: Richard Mlynarik
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
8 ;; Created: 2-Oct-92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
9 ;; Maintainer: XEmacs Development Team
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
10 ;; Keywords: internal, dumped
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
11
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
12 ;; This file is part of XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
13
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
14 ;; XEmacs is free software: you can redistribute it and/or modify it
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
15 ;; under the terms of the GNU General Public License as published by the
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
16 ;; Free Software Foundation, either version 3 of the License, or (at your
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
17 ;; option) any later version.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
18
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
19 ;; XEmacs is distributed in the hope that it will be useful, but WITHOUT
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
20 ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
21 ;; FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
22 ;; for more details.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
23
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
24 ;; You should have received a copy of the GNU General Public License
5402
308d34e9f07d Changed bulk of GPLv2 or later files identified by script
Mats Lidell <matsl@xemacs.org>
parents: 5267
diff changeset
25 ;; along with XEmacs. If not, see <http://www.gnu.org/licenses/>.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
26
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
27 ;;; Synched up with: all the minibuffer history stuff is synched with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
28 ;;; 19.30. Not sure about the rest.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
29
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
30 ;;; Commentary:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
31
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
32 ;; This file is dumped with XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
33
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
34 ;; Written by Richard Mlynarik 2-Oct-92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
35
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
36 ;; 06/11/1997 - Use char-(after|before) instead of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
37 ;; (following|preceding)-char. -slb
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
38
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
39 ;;; Code:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
40
4734
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
41 (require 'cl)
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
42
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
43 (defgroup minibuffer nil
5384
3889ef128488 Fix misspelled words, and some grammar, across the entire source tree.
Jerry James <james@xemacs.org>
parents: 5368
diff changeset
44 "Controlling the behavior of the minibuffer."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
45 :group 'environment)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
46
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
47
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
48 (defcustom insert-default-directory t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
49 "*Non-nil means when reading a filename start with default dir in minibuffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
50 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
51 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
52
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
53 (defcustom minibuffer-history-uniquify t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
54 "*Non-nil means when adding an item to a minibuffer history, remove
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
55 previous occurrences of the same item from the history list first,
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
56 rather than just consing the new element onto the front of the list."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
57 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
58 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
59
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
60 (defvar minibuffer-completion-table nil
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
61 "List, hash table, function or obarray used for minibuffer completion.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
62
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
63 This becomes the COLLECTION argument to `try-completion', `all-completions'
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
64 and `test-completion'; see the documentation of those functions for how
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
65 values are interpreted.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
66
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
67 (defvar minibuffer-completion-predicate nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
68 "Within call to `completing-read', this holds the PREDICATE argument.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
69
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
70 (defvar minibuffer-completion-confirm nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
71 "Non-nil => demand confirmation of completion before exiting minibuffer.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
72
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
73 (defcustom minibuffer-confirm-incomplete nil
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
74 "If true, then in contexts where completing-read allows answers which
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
75 are not valid completions, an extra RET must be typed to confirm the
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
76 response. This is helpful for catching typos, etc."
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
77 :type 'boolean
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
78 :group 'minibuffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
79
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
80 (defcustom completion-auto-help t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
81 "*Non-nil means automatically provide help for invalid completion input."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
82 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
83 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
84
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
85 (defcustom enable-recursive-minibuffers nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
86 "*Non-nil means to allow minibuffer commands while in the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
87 More precisely, this variable makes a difference when the minibuffer window
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
88 is the selected window. If you are in some other window, minibuffer commands
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
89 are allowed even if a minibuffer is active."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
90 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
91 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
92
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
93 (defcustom minibuffer-max-depth 1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
94 ;; See comment in #'minibuffer-max-depth-exceeded
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
95 "*Global maximum number of minibuffers allowed;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
96 compare to enable-recursive-minibuffers, which is only consulted when the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
97 minibuffer is reinvoked while it is the selected window."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
98 :type '(choice integer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
99 (const :tag "Indefinite" nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
100 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
102 ;; Moved to C. The minibuffer prompt must be setup before this is run
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
103 ;; and that can only be done from the C side.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
104 ;(defvar minibuffer-setup-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
105 ; "Normal hook run just after entry to minibuffer.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
106
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
107 ;; see comment at list-mode-hook.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
108 (put 'minibuffer-setup-hook 'permanent-local t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
109
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
110 (defvar minibuffer-exit-hook nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
111 "Normal hook run just after exit from minibuffer.")
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
112 (put 'minibuffer-exit-hook 'permanent-local t)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
113
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
114 (defvar minibuffer-help-form nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
115 "Value that `help-form' takes on inside the minibuffer.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
116
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
117 (defvar minibuffer-default nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
118 "Default value for minibuffer input.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
119
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
120 (defvar minibuffer-local-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
121 (let ((map (make-sparse-keymap 'minibuffer-local-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
122 map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
123 "Default keymap to use when reading from the minibuffer.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
124
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
125 (defvar minibuffer-local-completion-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
126 (let ((map (make-sparse-keymap 'minibuffer-local-completion-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
127 (set-keymap-parents map (list minibuffer-local-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
128 map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
129 "Local keymap for minibuffer input with completion.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
130
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
131 (defvar minibuffer-local-must-match-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
132 (let ((map (make-sparse-keymap 'minibuffer-must-match-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
133 (set-keymap-parents map (list minibuffer-local-completion-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
134 map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
135 "Local keymap for minibuffer input with completion, for exact match.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
136
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
137 ;; (define-key minibuffer-local-map "\C-g" 'abort-recursive-edit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
138 (define-key minibuffer-local-map "\C-g" 'minibuffer-keyboard-quit) ;; moved here from pending-del.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
139 (define-key minibuffer-local-map "\r" 'exit-minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
140 (define-key minibuffer-local-map "\n" 'exit-minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
141
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
142 ;; Historical crock. Unused by anything but user code, if even that
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
143 ;(defvar minibuffer-local-ns-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
144 ; (let ((map (make-sparse-keymap 'minibuffer-local-ns-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
145 ; (set-keymap-parents map (list minibuffer-local-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
146 ; map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
147 ; "Local keymap for the minibuffer when spaces are not allowed.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
148 ;(define-key minibuffer-local-ns-map [space] 'exit-minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
149 ;(define-key minibuffer-local-ns-map [tab] 'exit-minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
150 ;(define-key minibuffer-local-ns-map [?\?] 'self-insert-and-exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
151
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
152 (define-key minibuffer-local-completion-map "\t" 'minibuffer-complete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
153 (define-key minibuffer-local-completion-map " " 'minibuffer-complete-word)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
154 (define-key minibuffer-local-completion-map "?" 'minibuffer-completion-help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
155 (define-key minibuffer-local-must-match-map "\r" 'minibuffer-complete-and-exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
156 (define-key minibuffer-local-must-match-map "\n" 'minibuffer-complete-and-exit)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
157
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
158 (define-key minibuffer-local-map "\M-n" 'next-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
159 (define-key minibuffer-local-map "\M-p" 'previous-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
160 (define-key minibuffer-local-map '[next] "\M-n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
161 (define-key minibuffer-local-map '[prior] "\M-p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
162 (define-key minibuffer-local-map "\M-r" 'previous-matching-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
163 (define-key minibuffer-local-map "\M-s" 'next-matching-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
164 (define-key minibuffer-local-must-match-map [next]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
165 'next-complete-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
166 (define-key minibuffer-local-must-match-map [prior]
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
167 'previous-complete-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
168
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
169 ;; This is an experiment--make up and down arrows do history.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
170 (define-key minibuffer-local-map [up] 'previous-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
171 (define-key minibuffer-local-map [down] 'next-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
172 (define-key minibuffer-local-completion-map [up] 'previous-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
173 (define-key minibuffer-local-completion-map [down] 'next-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
174 (define-key minibuffer-local-must-match-map [up] 'previous-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
175 (define-key minibuffer-local-must-match-map [down] 'next-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
176
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
177 (defvar read-expression-map (let ((map (make-sparse-keymap
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
178 'read-expression-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
179 (set-keymap-parents map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
180 (list minibuffer-local-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
181 (define-key map "\M-\t" 'lisp-complete-symbol)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
182 map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
183 "Minibuffer keymap used for reading Lisp expressions.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
184
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
185 (defvar read-shell-command-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
186 (let ((map (make-sparse-keymap 'read-shell-command-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
187 (set-keymap-parents map (list minibuffer-local-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
188 (define-key map "\t" 'comint-dynamic-complete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
189 (define-key map "\M-\t" 'comint-dynamic-complete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
190 (define-key map "\M-?" 'comint-dynamic-list-completions)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
191 map)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
192 "Minibuffer keymap used by `shell-command' and related commands.")
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
193
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
194 (defcustom use-dialog-box t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
195 "*Variable controlling usage of the dialog box.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
196 If nil, the dialog box will never be used, even in response to mouse events."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
197 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
198 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
199
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
200 (defcustom minibuffer-electric-file-name-behavior t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
201 "*If non-nil, slash and tilde in certain places cause immediate deletion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
202 These are the same places where this behavior would occur later on anyway,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
203 in `substitute-in-file-name'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
204 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
205 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
206
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
207 ;; originally by Stig@hackvan.com
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
208 (defun minibuffer-electric-separator ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
209 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
210 (let ((c last-command-char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
211 (and minibuffer-electric-file-name-behavior
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
212 (eq c directory-sep-char)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
213 (eq c (char-before (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
214 (not (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
215 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
216 (and (looking-at "/.+:~?[^/]*/.+")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
217 (re-search-forward "^/.+:~?[^/]*" nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
218 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
219 (delete-region (point) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
220 t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
221 (not (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
222 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
223 (and (looking-at ".+://[^/]*/.+")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
224 (re-search-forward "^.+:/" nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
225 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
226 (delete-region (point) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
227 t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
228 ;; permit `//hostname/path/to/file'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
229 (not (eq (point) (1+ (point-min))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
230 ;; permit `http://url/goes/here'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
231 (or (not (eq ?: (char-after (- (point) 2))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
232 (eq ?/ (char-after (point-min))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
233 (delete-region (point-min) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
234 (insert c)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
235
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
236 (defun minibuffer-electric-tilde ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
237 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
238 (and minibuffer-electric-file-name-behavior
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
239 (eq directory-sep-char (char-before (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
240 ;; permit URL's with //, for e.g. http://hostname/~user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
241 (not (save-excursion (search-backward "//" nil t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
242 (delete-region (point-min) (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
243 (insert ?~))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
244
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
245
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
246 (defvar read-file-name-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
247 (let ((map (make-sparse-keymap 'read-file-name-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
248 (set-keymap-parents map (list minibuffer-local-completion-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
249 (define-key map (vector directory-sep-char) 'minibuffer-electric-separator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
250 (define-key map "~" 'minibuffer-electric-tilde)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
251 map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
252 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
253
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
254 (defvar read-file-name-must-match-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
255 (let ((map (make-sparse-keymap 'read-file-name-map)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
256 (set-keymap-parents map (list minibuffer-local-must-match-map))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
257 (define-key map (vector directory-sep-char) 'minibuffer-electric-separator)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
258 (define-key map "~" 'minibuffer-electric-tilde)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
259 map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
260 ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
261
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
262 (defun minibuffer-keyboard-quit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
263 "Abort recursive edit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
264 If `zmacs-regions' is true, and the zmacs region is active in this buffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
265 then this key deactivates the region without beeping."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
266 (interactive)
2611
139afe9fb2ee [xemacs-hg @ 2005-02-23 22:25:15 by adrian]
adrian
parents: 2527
diff changeset
267 (if (region-active-p)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
268 ;; pseudo-zmacs compatibility: don't beep if this ^G is simply
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
269 ;; deactivating the region. If it is inactive, beep.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
270 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
271 (abort-recursive-edit)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
272
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
273 ;;;; Guts of minibuffer invocation
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
274
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
275 ;;#### The only things remaining in C are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
276 ;; "Vminibuf_prompt" and the display junk
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
277 ;; "minibuf_prompt_width" and "minibuf_prompt_pix_width"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
278 ;; Also "active_frame", though I suspect I could already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
279 ;; hack that in Lisp if I could make any sense of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
280 ;; complete mess of frame/frame code in XEmacs.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
281 ;; Vminibuf_prompt could easily be made Lisp-bindable.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
282 ;; I suspect that minibuf_prompt*_width are actually recomputed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
283 ;; by redisplay as needed -- or could be arranged to be so --
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
284 ;; and that there could be need for read-minibuffer-internal to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
285 ;; save and restore them.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
286 ;;#### The only other thing which read-from-minibuffer-internal does
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
287 ;; which we can't presently do in Lisp is move the frame cursor
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
288 ;; to the start of the minibuffer line as it returns. This is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
289 ;; a rather nice touch and should be preserved -- probably by
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
290 ;; providing some Lisp-level mechanism (extension to cursor-in-echo-area ?)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
291 ;; to effect it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
292
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
293
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
294 ;; Like reset_buffer in FSF's buffer.c
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
295 ;; (Except that kill-all-local-variables doesn't nuke 'permanent-local
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
296 ;; variables -- we preserve them, reset_buffer doesn't.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
297 (defun reset-buffer (buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
298 (with-current-buffer buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
299 ;(if (fboundp 'unlock-buffer) (unlock-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
300 (kill-all-local-variables)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
301 (setq buffer-read-only nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
302 ;; don't let read only text yanked into the minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
303 ;; permanently wedge it.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
304 (make-local-variable 'inhibit-read-only)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
305 (setq inhibit-read-only t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
306 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
307 ;(setq default-directory nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
308 (setq buffer-file-name nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
309 (setq buffer-file-truename nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
310 (set-buffer-modified-p nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
311 (setq buffer-backed-up nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
312 (setq buffer-auto-save-file-name nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
313 (set-buffer-dedicated-frame buffer nil)
2021
cb22c508fb00 [xemacs-hg @ 2004-04-17 09:59:24 by michaels]
michaels
parents: 863
diff changeset
314 (set-marker (mark-marker t buffer) nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
315 buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
317 (defvar minibuffer-history-variable 'minibuffer-history
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
318 "History list symbol to add minibuffer values to.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
319 Each minibuffer output is added with
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
320 (set minibuffer-history-variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
321 (cons STRING (symbol-value minibuffer-history-variable)))")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
322 (defvar minibuffer-history-position)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
323
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
324 ;; Added by hniksic:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
325 (defvar initial-minibuffer-history-position)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
326 (defvar current-minibuffer-contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
327 (defvar current-minibuffer-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
328
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
329 (defcustom minibuffer-history-minimum-string-length nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
330 "*If this variable is non-nil, a string will not be added to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
331 minibuffer history if its length is less than that value."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
332 :type '(choice (const :tag "Any" nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
333 integer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
334 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
335
510
5bdbc721d46a [xemacs-hg @ 2001-05-06 08:33:35 by ben]
ben
parents: 502
diff changeset
336 (define-error 'input-error "Keyboard input error" 'io-error)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
337
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
338 ((macro
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
339 . (lambda (read-from-minibuffer-definition)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
340 (nsublis
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
341 ;; `M-x doctor' makes (the interned) history a local variable, use an
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
342 ;; uninterned symbol here so we don't interact with it.
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
343 '((history . #:history))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
344 read-from-minibuffer-definition)))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
345 (defun read-from-minibuffer (prompt &optional initial-contents keymap
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
346 readp history abbrev-table default)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
347 "Read a string from the minibuffer, prompting with string PROMPT.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
348 If optional second arg INITIAL-CONTENTS is non-nil, it is a string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
349 to be inserted into the minibuffer before reading input.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
350 If INITIAL-CONTENTS is (STRING . POSITION), the initial input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
351 is STRING, but point is placed POSITION characters into the string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
352 Third arg KEYMAP is a keymap to use while reading;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
353 if omitted or nil, the default is `minibuffer-local-map'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
354 If fourth arg READ is non-nil, then interpret the result as a lisp object
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
355 and return that object:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
356 in other words, do `(car (read-from-string INPUT-STRING))'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
357 Fifth arg HISTORY, if non-nil, specifies a history list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
358 and optionally the initial position in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
359 It can be a symbol, which is the history list variable to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
360 or it can be a cons cell (HISTVAR . HISTPOS).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
361 In that case, HISTVAR is the history list variable to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
362 and HISTPOS is the initial position (the position in the list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
363 which INITIAL-CONTENTS corresponds to).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
364 If HISTORY is `t', no history will be recorded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
365 Positions are counted starting from 1 at the beginning of the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
366 Sixth arg ABBREV-TABLE, if non-nil, becomes the value of `local-abbrev-table'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
367 in the minibuffer.
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
368 Seventh arg DEFAULT, if non-nil, will be returned when user enters
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
369 an empty string.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
370
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
371 See also the variable `completion-highlight-first-word-only' for
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
372 control over completion display."
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
373 (if (and (not enable-recursive-minibuffers)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
374 (> (minibuffer-depth) 0)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
375 (eq (selected-window) (minibuffer-window)))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
376 (error "Command attempted to use minibuffer while in minibuffer"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
377
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
378 (if (and minibuffer-max-depth
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
379 (> minibuffer-max-depth 0)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
380 (>= (minibuffer-depth) minibuffer-max-depth))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
381 (minibuffer-max-depth-exceeded))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
382
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
383 ;; catch this error before the poor user has typed something...
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
384 (if history
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
385 (if (symbolp history)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
386 (or (boundp history)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
387 (error "History list %S is unbound" history))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
388 (or (boundp (car history))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
389 (error "History list %S is unbound" (car history)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
390
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
391 (if (noninteractive)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
392 (progn
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
393 ;; XEmacs in -batch mode calls minibuffer: print the prompt.
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
394 (message "%s" (gettext prompt))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
395 ;;#### force-output
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
396
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
397 ;;#### Should this even be falling though to the code below?
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
398 ;;#### How does this stuff work now, anyway?
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
399 ))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
400 (let* ((dir default-directory)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
401 (owindow (selected-window))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
402 (oframe (selected-frame))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
403 (window (minibuffer-window))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
404 (buffer (get-buffer-create (format " *Minibuf-%d*"
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
405 (minibuffer-depth))))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
406 (frame (window-frame window))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
407 (mconfig (if (eq frame (selected-frame))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
408 nil (current-window-configuration frame)))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
409 (oconfig (current-window-configuration))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
410 (minibuffer-default default))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
411 (unwind-protect
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
412 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
413 (set-buffer (reset-buffer buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
414 (setq default-directory dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
415 (make-local-variable 'print-escape-newlines)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
416 (setq print-escape-newlines t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
417 (make-local-variable 'current-minibuffer-contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
418 (make-local-variable 'current-minibuffer-point)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
419 (make-local-variable 'initial-minibuffer-history-position)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
420 (setq current-minibuffer-contents ""
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
421 current-minibuffer-point 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
422 (if (not minibuffer-smart-completion-tracking-behavior)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
423 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
424 (make-local-variable 'mode-motion-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
425 (or mode-motion-hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
426 ;;####disgusting
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
427 (setq mode-motion-hook 'minibuffer-smart-mouse-tracker))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
428 (make-local-variable 'mouse-track-click-hook)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
429 (add-hook 'mouse-track-click-hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
430 'minibuffer-smart-maybe-select-highlighted-completion))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
431 (set-window-buffer window buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
432 (select-window window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
433 (set-window-hscroll window 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
434 (buffer-enable-undo buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
435 (message nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
436 (if initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
437 (if (consp initial-contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
438 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
439 (insert (car initial-contents))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
440 (goto-char (1+ (cdr initial-contents)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
441 (setq current-minibuffer-contents (car initial-contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
442 current-minibuffer-point (cdr initial-contents)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
443 (insert initial-contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
444 (setq current-minibuffer-contents initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
445 current-minibuffer-point (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
446 (use-local-map (help-keymap-with-help-key
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
447 (or keymap minibuffer-local-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
448 minibuffer-help-form))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
449 (let ((mouse-grabbed-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
450 (and minibuffer-smart-completion-tracking-behavior
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
451 (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
452 (current-prefix-arg current-prefix-arg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
453 ;; (help-form minibuffer-help-form)
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
454 (minibuffer-history-variable (cond ((not history)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
455 'minibuffer-history)
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
456 ((consp history)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
457 (car history))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
458 (t
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
459 history)))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
460 (minibuffer-history-position (cond ((consp history)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
461 (cdr history))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
462 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
463 0)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
464 (minibuffer-scroll-window owindow))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
465 (setq initial-minibuffer-history-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
466 minibuffer-history-position)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
467 (if abbrev-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
468 (setq local-abbrev-table abbrev-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
469 abbrev-mode t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
470 ;; This is now run from read-minibuffer-internal
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
471 ;(if minibuffer-setup-hook
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
472 ; (run-hooks 'minibuffer-setup-hook))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
473 ;(message nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
474 (if (eq 't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
475 (catch 'exit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
476 (if (> (recursion-depth) (minibuffer-depth))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
477 (let ((standard-output t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
478 (standard-input t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
479 (read-minibuffer-internal prompt))
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
480 (read-minibuffer-internal prompt))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
481 ;; Translate an "abort" (throw 'exit 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
482 ;; into a real quit
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
483 (signal 'quit '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
484 ;; return value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
485 (let* ((val (progn (set-buffer buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
486 (if minibuffer-exit-hook
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
487 (run-hooks 'minibuffer-exit-hook))
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
488 (if (and (eq (char-after (point-min)) nil)
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
489 default)
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
490 default
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
491 (buffer-string))))
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
492 (histval (if (and default (string= val ""))
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
493 default
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
494 val))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
495 (err nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
496 (if readp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
497 (condition-case e
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
498 (let ((v (read-from-string val)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
499 (if (< (cdr v) (length val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
500 (save-match-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
501 (or (string-match "[ \t\n]*\\'" val (cdr v))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
502 (error "Trailing garbage following expression"))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
503 (setq v (car v))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
504 ;; total total kludge
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
505 (if (stringp v) (setq v (list 'quote v)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
506 (setq val v))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
507 (end-of-file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
508 (setq err
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
509 '(input-error "End of input before end of expression")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
510 (error (setq err e))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
511 ;; Add the value to the appropriate history list unless
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
512 ;; it's already the most recent element, or it's only
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
513 ;; two characters long.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
514 (if (and (symbolp minibuffer-history-variable)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
515 (boundp minibuffer-history-variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
516 (let ((list (symbol-value minibuffer-history-variable)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
517 (or (eq list t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
518 (null val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
519 (and list (equal histval (car list)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
520 (and (stringp val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
521 minibuffer-history-minimum-string-length
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
522 (< (length val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
523 minibuffer-history-minimum-string-length))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
524 (set minibuffer-history-variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
525 (if minibuffer-history-uniquify
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
526 (cons histval (remove histval list))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
527 (cons histval list))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
528 (if err (signal (car err) (cdr err)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
529 val))))
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
530 ;; stupid display code requires this for some reason
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
531 (set-buffer buffer)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
532 (buffer-disable-undo buffer)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
533 (setq buffer-read-only nil)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
534 (erase-buffer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
535
4806
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
536 ;; restore frame configurations
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
537 (if (and mconfig (frame-live-p oframe)
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
538 (eq frame (selected-frame)))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
539 ;; if we changed frames (due to surrogate minibuffer),
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
540 ;; and we're still on the new frame, go back to the old one.
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
541 (select-frame oframe))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
542 (if mconfig (set-window-configuration mconfig))
fd36a980d701 Use uninterned symbols in various information-hiding contexts.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4734
diff changeset
543 (set-window-configuration oconfig)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
544
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
545 (defun minibuffer-max-depth-exceeded ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
546 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
547 ;; This signals an error if an Nth minibuffer is invoked while N-1 are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
548 ;; already active, whether the minibuffer window is selected or not.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
549 ;; Since, under X, it's easy to jump out of the minibuffer (by doing M-x,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
550 ;; getting distracted, and clicking elsewhere) many many novice users have
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
551 ;; had the problem of having multiple minibuffers build up, even to the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
552 ;; point of exceeding max-lisp-eval-depth. Since the variable
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
553 ;; enable-recursive-minibuffers historically/crockishly is only consulted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
554 ;; when the minibuffer is currently active (like typing M-x M-x) it doesn't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
555 ;; help in this situation.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
556 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
557 ;; This routine also offers to edit .emacs for you to get rid of this
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
558 ;; complaint, like `disabled' commands do, since it's likely that non-novice
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
559 ;; users will be annoyed by this change, so we give them an easy way to get
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
560 ;; rid of it forever.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
561 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
562 (beep t 'minibuffer-limit-exceeded)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
563 (message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
564 "Minibuffer already active: abort it with `^]', enable new one with `n': ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
565 (let ((char (let ((cursor-in-echo-area t)) ; #### doesn't always work??
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
566 (read-char))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
567 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
568 ((eq char ?n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
569 (cond
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
570 ((y-or-n-p "Enable recursive minibuffers for other sessions too? ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
571 ;; This is completely disgusting, but it's basically what novice.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
572 ;; does. This kind of thing should be generalized.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
573 (setq minibuffer-max-depth nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
574 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
575 (set-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
576 (find-file-noselect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
577 (substitute-in-file-name custom-file)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
578 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
579 (if (re-search-forward
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
580 "^(setq minibuffer-max-depth \\([0-9]+\\|'?nil\\|'?()\\))\n"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
581 nil t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
582 (delete-region (match-beginning 0 ) (match-end 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
583 ;; Must have been disabled by default.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
584 (goto-char (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
585 (insert"\n(setq minibuffer-max-depth nil)\n")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
586 (save-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
587 (message "Multiple minibuffers enabled")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
588 (sit-for 1))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
589 ((eq char ?)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
590 (abort-recursive-edit))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
591 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
592 (error "Minibuffer already active")))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
593
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
594
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
595 ;;;; Guts of minibuffer completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
596
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
597
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
598 ;; Used by minibuffer-do-completion
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
599 (defvar last-exact-completion nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
600
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
601 (defun temp-minibuffer-message (m)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
602 (let ((savemax (point-max)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
603 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
604 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
605 (message nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
606 (insert m))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
607 (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
608 (sit-for 2)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
609 (delete-region savemax (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
610 ;; If the user types a ^G while we're in sit-for, then quit-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
611 ;; gets set. In this case, we want that ^G to be interpreted
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
612 ;; as a normal character, and act just like typeahead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
613 (if (and quit-flag (not unread-command-event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
614 (setq unread-command-event (character-to-event (quit-char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
615 quit-flag nil)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
616
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
617 ;; 0 'none no possible completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
618 ;; 1 'unique was already an exact and unique completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
619 ;; 3 'exact was already an exact (but nonunique) completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
620 ;; NOT USED 'completed-exact-unique completed to an exact and completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
621 ;; 4 'completed-exact completed to an exact (but nonunique) completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
622 ;; 5 'completed some completion happened
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
623 ;; 6 'uncompleted no completion happened
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
624 (defun minibuffer-do-completion-1 (buffer-string completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
625 (cond ((not completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
626 'none)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
627 ((eq completion t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
628 ;; exact and unique match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
629 'unique)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
630 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
631 ;; It did find a match. Do we match some possibility exactly now?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
632 (let ((completedp (not (string-equal completion buffer-string))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
633 (if completedp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
634 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
635 ;; Some completion happened
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
636 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
637 (insert completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
638 (setq buffer-string completion)))
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
639 (if (test-completion buffer-string minibuffer-completion-table
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
640 minibuffer-completion-predicate)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
641 ;; An exact completion was possible
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
642 (if completedp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
643 ;; Since no callers need to know the difference, don't bother
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
644 ;; with this (potentially expensive) discrimination.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
645 ;; (if (eq (try-completion completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
646 ;; minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
647 ;; minibuffer-completion-predicate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
648 ;; 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
649 ;; 'completed-exact-unique
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
650 'completed-exact
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
651 ;; )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
652 'exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
653 ;; Not an exact match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
654 (if completedp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
655 'completed
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
656 'uncompleted))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
657
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
658
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
659 (defun minibuffer-do-completion (buffer-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
660 (let* ((completion (try-completion buffer-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
661 minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
662 minibuffer-completion-predicate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
663 (status (minibuffer-do-completion-1 buffer-string completion))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
664 (last last-exact-completion))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
665 (setq last-exact-completion nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
666 (cond ((eq status 'none)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
667 ;; No completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
668 (ding nil 'no-completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
669 (temp-minibuffer-message " [No match]"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
670 ((eq status 'unique)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
671 )
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
672 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
673 ;; It did find a match. Do we match some possibility exactly now?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
674 (if (not (string-equal completion buffer-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
675 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
676 ;; Some completion happened
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
677 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
678 (insert completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
679 (setq buffer-string completion)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
680 (cond ((eq status 'exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
681 ;; If the last exact completion and this one were
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
682 ;; the same, it means we've already given a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
683 ;; "Complete but not unique" message and that the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
684 ;; user's hit TAB again, so now we give help.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
685 (setq last-exact-completion completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
686 (if (equal buffer-string last)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
687 (minibuffer-completion-help)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
688 ((eq status 'uncompleted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
689 (if completion-auto-help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
690 (minibuffer-completion-help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
691 (temp-minibuffer-message " [Next char not unique]")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
692 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
693 nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
694 status))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
695
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
697 ;;;; completing-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
698
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
699 (defun completing-read (prompt collection &optional predicate require-match
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
700 initial-contents history default)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
701 "Read a string in the minibuffer, with completion.
863
42375619fa45 [xemacs-hg @ 2002-06-04 06:03:59 by andyp]
andyp
parents: 771
diff changeset
702
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
703 PROMPT is a string to prompt with; normally it ends in a colon and a space.
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
704 COLLECTION is a set of objects that are the possible completions.
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
705 PREDICATE limits completion to a subset of COLLECTION.
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
706 See `try-completion' and `all-completions' for details of COLLECTION,
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
707 PREDICATE, and completion in general.
765
a543dd3d410f [xemacs-hg @ 2002-03-05 13:21:21 by stephent]
stephent
parents: 673
diff changeset
708
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
709 If REQUIRE-MATCH is non-nil, the user is not allowed to exit unless
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
710 the input is (or completes to) an element of COLLECTION or is null.
765
a543dd3d410f [xemacs-hg @ 2002-03-05 13:21:21 by stephent]
stephent
parents: 673
diff changeset
711 If it is also not t, Return does not exit if it does non-null completion.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
712 If INITIAL-CONTENTS is non-nil, insert it in the minibuffer initially.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
713 If it is (STRING . POSITION), the initial input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
714 is STRING, but point is placed POSITION characters into the string.
765
a543dd3d410f [xemacs-hg @ 2002-03-05 13:21:21 by stephent]
stephent
parents: 673
diff changeset
715
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
716 HISTORY, if non-nil, specifies a history list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
717 and optionally the initial position in the list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
718 It can be a symbol, which is the history list variable to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
719 or it can be a cons cell (HISTVAR . HISTPOS).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
720 In that case, HISTVAR is the history list variable to use,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
721 and HISTPOS is the initial position (the position in the list
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
722 which INITIAL-CONTENTS corresponds to).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
723 If HISTORY is `t', no history will be recorded.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
724 Positions are counted starting from 1 at the beginning of the list.
765
a543dd3d410f [xemacs-hg @ 2002-03-05 13:21:21 by stephent]
stephent
parents: 673
diff changeset
725 DEFAULT, if non-nil, will be returned when the user enters an empty
a543dd3d410f [xemacs-hg @ 2002-03-05 13:21:21 by stephent]
stephent
parents: 673
diff changeset
726 string.
a543dd3d410f [xemacs-hg @ 2002-03-05 13:21:21 by stephent]
stephent
parents: 673
diff changeset
727
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
728 Completion ignores case if the ambient value of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
729 `completion-ignore-case' is non-nil."
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
730 (let ((minibuffer-completion-table collection)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
731 (minibuffer-completion-predicate predicate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
732 (minibuffer-completion-confirm (if (eq require-match 't) nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
733 (last-exact-completion nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
734 ret)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
735 (setq ret (read-from-minibuffer prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
736 initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
737 (if (not require-match)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
738 minibuffer-local-completion-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
739 minibuffer-local-must-match-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
740 nil
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
741 history
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
742 nil
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
743 default))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
744 (if (and (string= ret "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
745 default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
746 default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
747 ret)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
748
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
749
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
750 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
751 ;;;; Minibuffer completion commands ;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
752 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
753
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
754
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
755 (defun minibuffer-complete ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
756 "Complete the minibuffer contents as far as possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
757 Return nil if there is no valid completion, else t.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
758 If no characters can be completed, display a list of possible completions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
759 If you repeat this command after it displayed such a list,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
760 scroll the window of possible completions."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
761 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
762 ;; If the previous command was not this, then mark the completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
763 ;; buffer obsolete.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
764 (or (eq last-command this-command)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
765 (setq minibuffer-scroll-window nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
766 (let ((window minibuffer-scroll-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
767 (if (and window (windowp window) (window-buffer window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
768 (buffer-name (window-buffer window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
769 ;; If there's a fresh completion window with a live buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
770 ;; and this command is repeated, scroll that window.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
771 (let ((obuf (current-buffer)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
772 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
773 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
774 (set-buffer (window-buffer window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
775 (if (pos-visible-in-window-p (point-max) window)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
776 ;; If end is in view, scroll up to the beginning.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
777 (set-window-start window (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
778 ;; Else scroll down one frame.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
779 (scroll-other-window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
780 (set-buffer obuf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
781 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
782 (let ((status (minibuffer-do-completion (buffer-string))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
783 (if (eq status 'none)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
784 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
785 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
786 (cond ((eq status 'unique)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
787 (temp-minibuffer-message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
788 " [Sole completion]"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
789 ((eq status 'exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
790 (temp-minibuffer-message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
791 " [Complete, but not unique]")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
792 t))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
793
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
794
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
795 (defun minibuffer-complete-and-exit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
796 "Complete the minibuffer contents, and maybe exit.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
797 Exit if the name is valid with no completion needed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
798 If name was completed to a valid match,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
799 a repetition of this command will exit."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
800 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
801 (if (= (point-min) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
802 ;; Crockishly allow user to specify null string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
803 (throw 'exit nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
804 (let ((buffer-string (buffer-string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
805 ;; Short-cut -- don't call minibuffer-do-completion if we already
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
806 ;; have an (possibly nonunique) exact completion.
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
807 (if (test-completion buffer-string minibuffer-completion-table
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
808 minibuffer-completion-predicate)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
809 (throw 'exit nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
810 (let ((status (minibuffer-do-completion buffer-string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
811 (if (or (eq status 'unique)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
812 (eq status 'exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
813 (if (or (eq status 'completed-exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
814 (eq status 'completed-exact-unique))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
815 (if minibuffer-completion-confirm
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
816 (progn (temp-minibuffer-message " [Confirm]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
817 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
818 t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
819 (throw 'exit nil)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
820
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
821
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
822 (defun self-insert-and-exit ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
823 "Terminate minibuffer input."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
824 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
825 (self-insert-command 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
826 (throw 'exit nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
827
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
828 (defun exit-minibuffer ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
829 "Terminate this minibuffer argument.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
830 If minibuffer-confirm-incomplete is true, and we are in a completing-read
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
831 of some kind, and the contents of the minibuffer is not an existing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
832 completion, requires an additional RET before the minibuffer will be exited
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
833 \(assuming that RET was the character that invoked this command:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
834 the character in question must be typed again)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
835 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
836 (if (not minibuffer-confirm-incomplete)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
837 (throw 'exit nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
838 (let ((buffer-string (buffer-string)))
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
839 (if (test-completion buffer-string minibuffer-completion-table
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
840 minibuffer-completion-predicate)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
841 (throw 'exit nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
842 (let ((completion (if (not minibuffer-completion-table)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
843 t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
844 (try-completion buffer-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
845 minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
846 minibuffer-completion-predicate))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
847 (if (or (eq completion 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
848 ;; Crockishly allow user to specify null string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
849 (string-equal buffer-string ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
850 (throw 'exit nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
851 (if completion ;; rewritten for I18N3 snarfing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
852 (temp-minibuffer-message " [incomplete; confirm]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
853 (temp-minibuffer-message " [no completions; confirm]"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
854 (let ((event (let ((inhibit-quit t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
855 (prog1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
856 (next-command-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
857 (setq quit-flag nil)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
858 (cond ((equal event last-command-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
859 (throw 'exit nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
860 ((equal (quit-char) (event-to-character event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
861 ;; Minibuffer abort.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
862 (throw 'exit t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
863 (dispatch-event event)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
864
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
865 ;;;; minibuffer-complete-word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
866
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
867
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
868 ;;;#### I think I have done this correctly; it certainly is simpler
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
869 ;;;#### than what the C code seemed to be trying to do.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
870 (defun minibuffer-complete-word ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
871 "Complete the minibuffer contents at most a single word.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
872 After one word is completed as much as possible, a space or hyphen
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
873 is added, provided that matches some possible completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
874 Return nil if there is no valid completion, else t."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
875 (interactive)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
876 (let* ((buffer-string (buffer-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
877 (completion (try-completion buffer-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
878 minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
879 minibuffer-completion-predicate))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
880 (status (minibuffer-do-completion-1 buffer-string completion)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
881 (cond ((eq status 'none)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
882 (ding nil 'no-completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
883 (temp-minibuffer-message " [No match]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
884 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
885 ((eq status 'unique)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
886 ;; New message, only in this new Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
887 (temp-minibuffer-message " [Sole completion]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
888 t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
889 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
890 (cond ((or (eq status 'uncompleted)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
891 (eq status 'exact))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
892 (let ((foo #'(lambda (s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
893 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
894 (if (try-completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
895 (concat buffer-string s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
896 minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
897 minibuffer-completion-predicate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
898 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
899 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
900 (insert s)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
901 t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
902 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
903 (error nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
904 (char last-command-char))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
905 ;; Try to complete by adding a word-delimiter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
906 (or (and (characterp char) (> char 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
907 (funcall foo (char-to-string char)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
908 (and (not (eq char ?\ ))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
909 (funcall foo " "))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
910 (and (not (eq char ?\-))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
911 (funcall foo "-"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
912 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
913 (if completion-auto-help
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
914 (minibuffer-completion-help)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
915 ;; New message, only in this new Lisp code
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
916 ;; rewritten for I18N3 snarfing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
917 (if (eq status 'exact)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
918 (temp-minibuffer-message
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
919 " [Complete, but not unique]")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
920 (temp-minibuffer-message " [Ambiguous]")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
921 nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
922 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
923 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
924 (insert completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
925 ;; First word-break in stuff found by completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
926 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
927 (let ((len (length buffer-string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
928 n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
929 (if (and (< len (length completion))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
930 (catch 'match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
931 (setq n 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
932 (while (< n len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
933 (if (char-equal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
934 (upcase (aref buffer-string n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
935 (upcase (aref completion n)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
936 (setq n (1+ n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
937 (throw 'match nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
938 t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
939 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
940 (goto-char (point-min))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
941 (forward-char len)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
942 (re-search-forward "\\W" nil t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
943 (delete-region (point) (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
944 (goto-char (point-max))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
945 t))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
946
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
947
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
948 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
949 ;;;; "Smart minibuffer" hackery ;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
950 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
951
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
952 ;;; ("Kludgy minibuffer hackery" is perhaps a better name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
953
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
954 ;; This works by setting `mouse-grabbed-buffer' to the minibuffer,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
955 ;; defining button2 in the minibuffer keymap to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
956 ;; `minibuffer-smart-select-highlighted-completion', and setting the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
957 ;; mode-motion-hook of the minibuffer to `minibuffer-mouse-tracker'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
958 ;; By setting `mouse-grabbed-buffer', the minibuffer's keymap and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
959 ;; mode-motion-hook apply (for mouse motion and presses) no matter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
960 ;; what buffer the mouse is over. Then, `minibuffer-mouse-tracker'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
961 ;; examines the text under the mouse looking for something that looks
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
962 ;; like a completion, and causes it to be highlighted, and
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
963 ;; `minibuffer-smart-select-highlighted-completion' looks for a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
964 ;; flagged completion under the mouse and inserts it. This has the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
965 ;; following advantages:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
966 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
967 ;; -- filenames and such in any buffer can be inserted by clicking,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
968 ;; not just completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
969 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
970 ;; but the following disadvantages:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
971 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
972 ;; -- unless you're aware of the "filename in any buffer" feature,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
973 ;; the fact that strings in arbitrary buffers get highlighted appears
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
974 ;; as a bug
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
975 ;; -- mouse motion can cause ange-ftp actions -- bad bad bad.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
976 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
977 ;; There's some hackery in minibuffer-mouse-tracker to try to avoid the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
978 ;; ange-ftp stuff, but it doesn't work.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
979 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
980
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
981 (defcustom minibuffer-smart-completion-tracking-behavior nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
982 "*If non-nil, look for completions under mouse in all buffers.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
983 This allows you to click on something that looks like a completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
984 and have it selected, regardless of what buffer it is in.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
985
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
986 This is not enabled by default because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
987
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
988 -- The \"mysterious\" highlighting in normal buffers is confusing to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
989 people not expecting it, and looks like a bug
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
990 -- If ange-ftp is enabled, this tracking sometimes causes ange-ftp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
991 action as a result of mouse motion, which is *bad bad bad*.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
992 Hopefully this bug will be fixed at some point."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
993 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
994 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
995
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
996 (defun minibuffer-smart-mouse-tracker (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
997 ;; Used as the mode-motion-hook of the minibuffer window, which is the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
998 ;; value of `mouse-grabbed-buffer' while the minibuffer is active. If
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
999 ;; the word under the mouse is a valid minibuffer completion, then it
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1000 ;; is highlighted.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1001 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1002 ;; We do some special voodoo when we're reading a pathname, because
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1003 ;; the way filename completion works is funny. Possibly there's some
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1004 ;; more general way this could be dealt with...
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1005 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1006 ;; We do some further voodoo when reading a pathname that is an
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1007 ;; ange-ftp or efs path, because causing FTP activity as a result of
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1008 ;; mouse motion is a really bad time.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1009 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1010 (and minibuffer-smart-completion-tracking-behavior
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1011 (event-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1012 ;; avoid conflict with display-completion-list extents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1013 (not (extent-at (event-point event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1014 (event-buffer event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1015 'list-mode-item))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1016 (let ((filename-kludge-p (eq minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1017 'read-file-name-internal)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1018 (mode-motion-highlight-internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1019 event
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1020 #'(lambda () (default-mouse-track-beginning-of-word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1021 (if filename-kludge-p 'nonwhite t)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1022 #'(lambda ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1023 (let ((p (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1024 (string ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1025 (default-mouse-track-end-of-word
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1026 (if filename-kludge-p 'nonwhite t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1027 (if (and (/= p (point)) minibuffer-completion-table)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1028 (setq string (buffer-substring p (point))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1029 (if (string-match "\\`[ \t\n]*\\'" string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1030 (goto-char p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1031 (if filename-kludge-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1032 (setq string (minibuffer-smart-select-kludge-filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1033 string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1034 ;; try-completion bogusly returns a string even when
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1035 ;; that string is complete if that string is also a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1036 ;; prefix for other completions. This means that we
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1037 ;; can't just do the obvious thing, (eq t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1038 ;; (try-completion ...)).
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
1039 ;;
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
1040 ;; Could be reasonable to use #'test-completion
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
1041 ;; instead. Aidan Kehoe, Mo 14 Mai 2012 08:17:10 IST
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1042 (let (comp)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1043 (if (and filename-kludge-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1044 ;; #### evil evil evil evil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1045 (or (and (fboundp 'ange-ftp-ftp-path)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1046 (declare-fboundp
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1047 (ange-ftp-ftp-path string)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1048 (and (fboundp 'efs-ftp-path)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1049 (declare-fboundp
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1050 (efs-ftp-path string)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1051 (setq comp t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1052 (setq comp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1053 (try-completion string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1054 minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1055 minibuffer-completion-predicate)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1056 (or (eq comp t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1057 (and (equal comp string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1058 (or (null minibuffer-completion-predicate)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1059 (stringp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1060 minibuffer-completion-predicate) ; ???
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1061 (funcall minibuffer-completion-predicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1062 (if (vectorp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1063 minibuffer-completion-table)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1064 (intern-soft
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1065 string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1066 minibuffer-completion-table)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1067 string))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1068 (goto-char p))))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1069
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1070 (defun minibuffer-smart-select-kludge-filename (string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1071 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1072 (set-buffer mouse-grabbed-buffer) ; the minibuf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1073 (let ((kludge-string (concat (buffer-string) string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1074 (if (or (and (fboundp 'ange-ftp-ftp-path)
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1075 (declare-fboundp (ange-ftp-ftp-path kludge-string)))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1076 (and (fboundp 'efs-ftp-path)
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1077 (declare-fboundp (efs-ftp-path kludge-string))))
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1078 ;; #### evil evil evil, but more so.
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1079 string
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1080 (append-expand-filename (buffer-string) string)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1081
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1082 (defun minibuffer-smart-select-highlighted-completion (event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1083 "Select the highlighted text under the mouse as a minibuffer response.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1084 When the minibuffer is being used to prompt the user for a completion,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1085 any valid completions which are visible on the frame will highlight
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1086 when the mouse moves over them. Clicking \\<minibuffer-local-map>\
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1087 \\[minibuffer-smart-select-highlighted-completion] will select the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1088 highlighted completion under the mouse.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1089
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1090 If the mouse is clicked while not over a highlighted completion,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1091 then the global binding of \\[minibuffer-smart-select-highlighted-completion] \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1092 will be executed instead. In this\nway you can get at the normal global \
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1093 behavior of \\[minibuffer-smart-select-highlighted-completion] as well as
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1094 the special minibuffer behavior."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1095 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1096 (if minibuffer-smart-completion-tracking-behavior
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1097 (minibuffer-smart-select-highlighted-completion-1 event t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1098 (let ((command (lookup-key global-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1099 (vector current-mouse-event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1100 (if command (call-interactively command)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1101
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1102 (defun minibuffer-smart-select-highlighted-completion-1 (event global-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1103 (let* ((filename-kludge-p (eq minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1104 'read-file-name-internal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1105 completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1106 command-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1107 (evpoint (event-point event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1108 (evextent (and evpoint (extent-at evpoint (event-buffer event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1109 'list-mode-item))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1110 (if evextent
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1111 ;; avoid conflict with display-completion-list extents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1112 ;; if we find one, do that behavior instead.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1113 (list-mode-item-selected-1 evextent event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1114 (save-excursion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1115 (let* ((buffer (window-buffer (event-window event)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1116 (p (event-point event))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1117 (extent (and p (extent-at p buffer 'mouse-face))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1118 (set-buffer buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1119 (if (not (and (extent-live-p extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1120 (eq (extent-object extent) (current-buffer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1121 (not (extent-detached-p extent))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1122 (setq command-p t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1123 ;; ...else user has selected a highlighted completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1124 (setq completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1125 (buffer-substring (extent-start-position extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1126 (extent-end-position extent)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1127 (if filename-kludge-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1128 (setq completion (minibuffer-smart-select-kludge-filename
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1129 completion)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1130 ;; remove the extent so that it's not hanging around in
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1131 ;; *Completions*
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1132 (detach-extent extent)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1133 (set-buffer mouse-grabbed-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1134 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1135 (insert completion))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1136 ;; we need to execute the command or do the throw outside of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1137 ;; save-excursion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1138 (cond ((and command-p global-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1139 (let ((command (lookup-key global-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1140 (vector current-mouse-event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1141 (if command
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1142 (call-interactively command)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1143 (if minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1144 (error
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1145 "Highlighted words are valid completions. You may select one.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1146 (error "no completions")))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1147 ((not command-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1148 ;; things get confused if the minibuffer is terminated while
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1149 ;; not selected.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1150 (select-window (minibuffer-window))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1151 (if (and filename-kludge-p (file-directory-p completion))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1152 ;; if the user clicked middle on a directory name, display the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1153 ;; files in that directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1154 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1155 (goto-char (point-max))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1156 (minibuffer-completion-help))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1157 ;; otherwise, terminate input
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1158 (throw 'exit nil)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1159
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1160 (defun minibuffer-smart-maybe-select-highlighted-completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1161 (event &optional click-count)
444
576fb035e263 Import from CVS: tag r21-2-37
cvs
parents: 442
diff changeset
1162 "Like `minibuffer-smart-select-highlighted-completion' but does nothing if
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1163 there is no completion (as opposed to executing the global binding). Useful
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1164 as the value of `mouse-track-click-hook'."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1165 (interactive "e")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1166 (minibuffer-smart-select-highlighted-completion-1 event nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1167
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1168 (define-key minibuffer-local-map 'button2
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1169 'minibuffer-smart-select-highlighted-completion)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1170
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1171
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1172 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1173 ;;;; Minibuffer History ;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1174 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1175
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1176 (defvar minibuffer-history '()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1177 "Default minibuffer history list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1178 This is used for all minibuffer input except when an alternate history
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1179 list is specified.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1181 ;; Some other history lists:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1182 ;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1183 (defvar minibuffer-history-search-history '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1184 (defvar function-history '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1185 (defvar variable-history '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1186 (defvar buffer-history '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1187 (defvar shell-command-history '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1188 (defvar file-name-history '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1189
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1190 (defvar read-expression-history nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1191
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1192 (defvar minibuffer-history-sexp-flag nil ;weird FSF Emacs kludge
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1193 "Non-nil when doing history operations on `command-history'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1194 More generally, indicates that the history list being acted on
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1195 contains expressions rather than strings.")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1196
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1197 (defun previous-matching-history-element (regexp n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1198 "Find the previous history element that matches REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1199 \(Previous history elements refer to earlier actions.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1200 With prefix argument N, search for Nth previous match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1201 If N is negative, find the next or Nth next match."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1202 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1203 (let ((enable-recursive-minibuffers t)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1204 (minibuffer-history-sexp-flag nil)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1205 (minibuffer-max-depth (and minibuffer-max-depth
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1206 (1+ minibuffer-max-depth))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1207 (if (eq 't (symbol-value minibuffer-history-variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1208 (error "History is not being recorded in this context"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1209 (list (read-from-minibuffer "Previous element matching (regexp): "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1210 (car minibuffer-history-search-history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1211 minibuffer-local-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1212 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1213 'minibuffer-history-search-history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1214 (prefix-numeric-value current-prefix-arg))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1215 (let ((history (symbol-value minibuffer-history-variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1216 prevpos
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1217 (pos minibuffer-history-position))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1218 (if (eq history t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1219 (error "History is not being recorded in this context"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1220 (while (/= n 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1221 (setq prevpos pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1222 (setq pos (min (max 1 (+ pos (if (< n 0) -1 1))) (length history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1223 (if (= pos prevpos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1224 (if (= pos 1) ;; rewritten for I18N3 snarfing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1225 (error "No later matching history item")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1226 (error "No earlier matching history item")))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1227 (if (string-match regexp
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1228 (if minibuffer-history-sexp-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1229 (let ((print-level nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1230 (prin1-to-string (nth (1- pos) history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1231 (nth (1- pos) history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1232 (setq n (+ n (if (< n 0) 1 -1)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1233 (setq minibuffer-history-position pos)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1234 (setq current-minibuffer-contents (buffer-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1235 current-minibuffer-point (point))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1236 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1237 (let ((elt (nth (1- pos) history)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1238 (insert (if minibuffer-history-sexp-flag
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1239 (let ((print-level nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1240 (prin1-to-string elt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1241 elt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1242 (goto-char (point-min)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1243 (if (or (eq (car (car command-history)) 'previous-matching-history-element)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1244 (eq (car (car command-history)) 'next-matching-history-element))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1245 (setq command-history (cdr command-history))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1246
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1247 (defun next-matching-history-element (regexp n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1248 "Find the next history element that matches REGEXP.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1249 \(The next history element refers to a more recent action.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1250 With prefix argument N, search for Nth next match.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1251 If N is negative, find the previous or Nth previous match."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1252 (interactive
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1253 (let ((enable-recursive-minibuffers t)
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1254 (minibuffer-history-sexp-flag nil)
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1255 (minibuffer-max-depth (and minibuffer-max-depth
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1256 (1+ minibuffer-max-depth))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1257 (if (eq t (symbol-value minibuffer-history-variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1258 (error "History is not being recorded in this context"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1259 (list (read-from-minibuffer "Next element matching (regexp): "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1260 (car minibuffer-history-search-history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1261 minibuffer-local-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1262 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1263 'minibuffer-history-search-history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1264 (prefix-numeric-value current-prefix-arg))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1265 (previous-matching-history-element regexp (- n)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1266
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1267 (defun next-history-element (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1268 "Insert the next element of the minibuffer history into the minibuffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1269 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1270 (if (eq 't (symbol-value minibuffer-history-variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1271 (error "History is not being recorded in this context"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1272 (unless (zerop n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1273 (when (eq minibuffer-history-position
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1274 initial-minibuffer-history-position)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1275 (setq current-minibuffer-contents (buffer-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1276 current-minibuffer-point (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1277 (let ((narg (- minibuffer-history-position n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1278 (minimum (if minibuffer-default -1 0)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1279 ;; a weird special case here; when in repeat-complex-command, we're
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1280 ;; trying to edit the top command, and minibuffer-history-position
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1281 ;; points to 1, the next-to-top command. in this case, the top
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1282 ;; command in the history is suppressed in favor of the one being
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1283 ;; edited, and there is no more command below it, except maybe the
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1284 ;; default.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1285 (if (and (zerop narg) (eq minibuffer-history-position
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1286 initial-minibuffer-history-position))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1287 (setq minimum (1+ minimum)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1288 (cond ((< narg minimum)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1289 (error (if minibuffer-default
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1290 "No following item in %s"
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1291 "No following item in %s; no default available")
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1292 minibuffer-history-variable))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1293 ((> narg (length (symbol-value minibuffer-history-variable)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1294 (error "No preceding item in %s" minibuffer-history-variable)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1295 (erase-buffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1296 (setq minibuffer-history-position narg)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1297 (if (eq narg initial-minibuffer-history-position)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1298 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1299 (insert current-minibuffer-contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1300 (goto-char current-minibuffer-point))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1301 (let ((elt (if (> narg 0)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1302 (nth (1- minibuffer-history-position)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1303 (symbol-value minibuffer-history-variable))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1304 minibuffer-default)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1305 (insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1306 (if (not (stringp elt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1307 (let ((print-level nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1308 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1309 (let ((print-readably t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1310 (print-escape-newlines t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1311 (prin1-to-string elt))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1312 (error (prin1-to-string elt))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1313 elt)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1314 ;; FSF has point-min here.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1315 (goto-char (point-max))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1316
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1317 (defun previous-history-element (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1318 "Insert the previous element of the minibuffer history into the minibuffer."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1319 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1320 (next-history-element (- n)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1321
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1322 (defun next-complete-history-element (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1323 "Get next element of history which is a completion of minibuffer contents."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1324 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1325 (let ((point-at-start (point)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1326 (next-matching-history-element
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1327 (concat "^" (regexp-quote (buffer-substring (point-min) (point)))) n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1328 ;; next-matching-history-element always puts us at (point-min).
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1329 ;; Move to the position we were at before changing the buffer contents.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1330 ;; This is still sensical, because the text before point has not changed.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1331 (goto-char point-at-start)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1332
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1333 (defun previous-complete-history-element (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1334 "Get previous element of history which is a completion of minibuffer contents."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1335 (interactive "p")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1336 (next-complete-history-element (- n)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1337
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1338
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1339 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1340 ;;;; reading various things from a minibuffer ;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1341 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1342
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1343 (defun read-expression (prompt &optional initial-contents history default-value)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1344 "Return a Lisp object read using the minibuffer, prompting with PROMPT.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1345 If non-nil, optional second arg INITIAL-CONTENTS is a string to insert
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1346 in the minibuffer before reading.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1347 Third arg HISTORY, if non-nil, specifies a history list.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1348 Fourth arg DEFAULT-VALUE is the default value. If non-nil, it is used
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1349 for history command, and as the value to return if the user enters the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1350 empty string."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1351 (let ((minibuffer-history-sexp-flag t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1352 ;; Semi-kludge to get around M-x C-x o M-ESC trying to do completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1353 (minibuffer-completion-table nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1354 (read-from-minibuffer prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1355 initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1356 read-expression-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1357 t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1358 (or history 'read-expression-history)
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1359 lisp-mode-abbrev-table
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1360 default-value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1361
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1362 (defun read-string (prompt &optional initial-contents history default-value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1363 "Return a string from the minibuffer, prompting with string PROMPT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1364 If non-nil, optional second arg INITIAL-CONTENTS is a string to insert
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1365 in the minibuffer before reading.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1366 Third arg HISTORY, if non-nil, specifies a history list.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1367 Fourth arg DEFAULT-VALUE is the default value. If non-nil, it is used
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1368 for history command, and as the value to return if the user enters the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1369 empty string."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1370 (let ((minibuffer-completion-table nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1371 (read-from-minibuffer prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1372 initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1373 minibuffer-local-map
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1374 nil history nil default-value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1375
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1376 (defun eval-minibuffer (prompt &optional initial-contents history default-value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1377 "Return value of Lisp expression read using the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1378 Prompt with PROMPT. If non-nil, optional second arg INITIAL-CONTENTS
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1379 is a string to insert in the minibuffer before reading.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1380 Third arg HISTORY, if non-nil, specifies a history list.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1381 Fourth arg DEFAULT-VALUE is the default value. If non-nil, it is used
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1382 for history command, and as the value to return if the user enters the
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1383 empty string."
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1384 (eval (read-expression prompt initial-contents history default-value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1385
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1386 ;; The name `command-history' is already taken
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1387 (defvar read-command-history '())
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1388
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1389 (defun read-command (prompt &optional default-value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1390 "Read the name of a command and return as a symbol.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1391 Prompts with PROMPT. By default, return DEFAULT-VALUE."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1392 (intern (completing-read prompt obarray 'commandp t nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1393 ;; 'command-history is not right here: that's a
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1394 ;; list of evalable forms, not a history list.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1395 'read-command-history
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1396 default-value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1397
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1398 (defun read-function (prompt &optional default-value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1399 "Read the name of a function and return as a symbol.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1400 Prompts with PROMPT. By default, return DEFAULT-VALUE."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1401 (intern (completing-read prompt obarray 'fboundp t nil
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1402 'function-history default-value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1403
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1404 (defun read-variable (prompt &optional default-value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1405 "Read the name of a user variable and return it as a symbol.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1406 Prompts with PROMPT. By default, return DEFAULT-VALUE.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1407 A user variable is one whose documentation starts with a `*' character."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1408 (intern (completing-read prompt obarray 'user-variable-p t nil
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1409 'variable-history
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1410 (if (symbolp default-value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1411 (symbol-name default-value)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1412 default-value))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1413
4734
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1414 (defun read-buffer (prompt &optional default require-match exclude)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1415 "Read the name of a buffer and return as a string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1416 Prompts with PROMPT. Optional second arg DEFAULT is value to return if user
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1417 enters an empty line. If optional third arg REQUIRE-MATCH is non-nil,
4734
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1418 only existing buffer names are allowed. Optional fourth argument EXCLUDE is
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1419 a buffer or a list of buffers to exclude from the completion list."
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1420 (when (bufferp exclude)
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1421 (setq exclude (list exclude)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1422 (let ((prompt (if default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1423 (format "%s(default %s) "
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1424 (gettext prompt) (if (bufferp default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1425 (buffer-name default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1426 default))
4734
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1427 prompt))
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1428 (alist (mapcar #'(lambda (b) (cons (buffer-name b) b))
5655
b7ae5f44b950 Remove some redundant functions, change others to labels, lisp/
Aidan Kehoe <kehoea@parhasard.net>
parents: 5567
diff changeset
1429 (set-difference (buffer-list) exclude)))
4734
74a5eaa67982 Make switch-to-buffer completion avoid current buffer.
Didier Verna <didier@xemacs.org>
parents: 4720
diff changeset
1430 result)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1431 (while (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1432 (setq result (completing-read prompt alist nil require-match
430
a5df635868b2 Import from CVS: tag r21-2-23
cvs
parents: 428
diff changeset
1433 nil 'buffer-history
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1434 (if (bufferp default)
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1435 (buffer-name default)
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1436 default)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1437 (cond ((not (equal result ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1438 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1439 ((not require-match)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1440 (setq result default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1441 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1442 ((not default)
3000
5df5ea55d3fc [xemacs-hg @ 2005-10-18 20:49:41 by malcolmp]
malcolmp
parents: 2730
diff changeset
1443 nil)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1444 ((not (get-buffer default))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1445 t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1446 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1447 (setq result default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1448 nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1449 (if (bufferp result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1450 (buffer-name result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1451 result)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1452
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1453 (defun read-number (prompt &optional integers-only default-value)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1454 "Read a number from the minibuffer, prompting with PROMPT.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1455 If optional second argument INTEGERS-ONLY is non-nil, accept
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1456 only integer input.
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1457 If DEFAULT-VALUE is non-nil, return that if user enters an empty
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1458 line."
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1459 (let ((pred (if integers-only 'integerp 'numberp))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1460 num)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1461 (while (not (funcall pred num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1462 (setq num (condition-case ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1463 (let ((minibuffer-completion-table nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1464 (read-from-minibuffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1465 prompt (if num (prin1-to-string num)) nil t
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1466 nil nil default-value))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1467 (input-error nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1468 (invalid-read-syntax nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1469 (end-of-file nil)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1470 (or (funcall pred num) (beep)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1471 num))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1472
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1473 (defun read-shell-command (prompt &optional initial-input history default-value)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1474 "Just like read-string, but uses read-shell-command-map:
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1475 \\{read-shell-command-map}"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1476 (let ((minibuffer-completion-table nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1477 (read-from-minibuffer prompt initial-input read-shell-command-map
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1478 nil (or history 'shell-command-history)
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1479 nil default-value)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1480
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1481
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1482 ;;; This read-file-name stuff probably belongs in files.el
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1483
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1484 ;; Quote "$" as "$$" to get it past substitute-in-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1485 (defun un-substitute-in-file-name (string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1486 (let ((regexp "\\$")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1487 (olen (length string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1488 new
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1489 n o ch)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1490 (if (not (string-match regexp string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1491 string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1492 (setq n 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1493 (while (string-match regexp string (match-end 0))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1494 (setq n (1+ n)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1495 (setq new (make-string (+ olen n) ?$))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1496 (setq n 0 o 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1497 (while (< o olen)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1498 (setq ch (aref string o))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1499 (aset new n ch)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1500 (setq o (1+ o) n (1+ n))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1501 (if (eq ch ?$)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1502 ;; already aset by make-string initial-value
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1503 (setq n (1+ n))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1504 new)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1505
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1506
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1507 ;; Wrapper for `directory-files' for use in generating completion lists.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1508 ;; Generates output in the same format as `file-name-all-completions'.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1509 ;;
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1510 ;; The EFS replacement for `directory-files' doesn't support the FILES-ONLY
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1511 ;; option, so it has to be faked. The listing cache will hopefully
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1512 ;; improve the performance of this operation.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1513 (defun minibuf-directory-files (dir &optional match-regexp files-only)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1514 (let ((want-file (or (eq files-only nil) (eq files-only t)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1515 (want-dirs (or (eq files-only nil) (not (eq files-only t)))))
5267
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1516 (mapcan
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1517 #'(lambda (f)
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1518 (and (not (equal "." f))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1519 (if (file-directory-p (expand-file-name f dir))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1520 (and want-dirs (list (file-name-as-directory f)))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1521 (and want-file (list f)))))
668c73e222fd Change forms like (delq nil (mapcar ...)) to (mapcan ...).
Aidan Kehoe <kehoea@parhasard.net>
parents: 4806
diff changeset
1522 (directory-files dir nil match-regexp))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1523
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1524
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1525 (defun read-file-name-2 (history prompt dir default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1526 must-match initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1527 completer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1528 (if (not dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1529 (setq dir default-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1530 (setq dir (abbreviate-file-name dir t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1531 (let* ((insert (cond ((and (not insert-default-directory)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1532 (not initial-contents))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1533 "")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1534 (initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1535 (cons (un-substitute-in-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1536 (concat dir initial-contents))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1537 (length dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1538 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1539 (un-substitute-in-file-name dir))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1540 (val
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1541 ;; Hateful, broken, case-sensitive un*x
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1542 ;;; (completing-read prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1543 ;;; completer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1544 ;;; dir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1545 ;;; must-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1546 ;;; insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1547 ;;; history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1548 ;; #### - this is essentially the guts of completing read.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1549 ;; There should be an elegant way to pass a pair of keymaps to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1550 ;; completing read, but this will do for now. All sins are
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1551 ;; relative. --Stig
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1552 (let ((minibuffer-completion-table completer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1553 (minibuffer-completion-predicate dir)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1554 (minibuffer-completion-confirm (if (eq must-match 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1555 nil t))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1556 (last-exact-completion nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1557 (read-from-minibuffer prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1558 insert
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1559 (if (not must-match)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1560 read-file-name-map
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1561 read-file-name-must-match-map)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1562 nil
434
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1563 history
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1564 nil
9d177e8d4150 Import from CVS: tag r21-2-25
cvs
parents: 430
diff changeset
1565 default))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1566 ;;; ;; Kludge! Put "/foo/bar" on history rather than "/default//foo/bar"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1567 ;;; (let ((hist (cond ((not history) 'minibuffer-history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1568 ;;; ((consp history) (car history))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1569 ;;; (t history))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1570 ;;; (if (and val
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1571 ;;; hist
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1572 ;;; (not (eq hist 't))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1573 ;;; (boundp hist)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1574 ;;; (equal (car-safe (symbol-value hist)) val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1575 ;;; (let ((e (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1576 ;;; (expand-file-name val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1577 ;;; (error nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1578 ;;; (if (and e (not (equal e val)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1579 ;;; (set hist (cons e (cdr (symbol-value hist))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1580
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1581 (cond ((not val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1582 (error "No file name specified"))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1583 ((and default
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1584 (equal val (if (consp insert) (car insert) insert)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1585 default)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1586 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1587 (substitute-in-file-name val)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1588
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1589 ;; #### this function should use minibuffer-completion-table
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1590 ;; or something. But that is sloooooow.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1591 ;; #### all this shit needs better documentation!!!!!!!!
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1592 (defun read-file-name-activate-callback (event extent dir-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1593 ;; used as the activate-callback of the filename list items
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1594 ;; in the completion buffer, in place of default-choose-completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1595 ;; if a regular file was selected, we call default-choose-completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1596 ;; (which just inserts the string in the minibuffer and calls
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1597 ;; exit-minibuffer). If a directory was selected, we display
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1598 ;; the contents of the directory.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1599 (let* ((file (extent-string extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1600 (completion-buf (extent-object extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1601 (minibuf (symbol-value-in-buffer 'completion-reference-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1602 completion-buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1603 (in-dir (file-name-directory (buffer-substring nil nil minibuf)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1604 (full (expand-file-name file in-dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1605 (if (not (file-directory-p full))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1606 (default-choose-completion event extent minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1607 (erase-buffer minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1608 (insert-string (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1609 (abbreviate-file-name full t)) minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1610 (reset-buffer completion-buf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1611 (let ((standard-output completion-buf))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1612 (display-completion-list
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1613 (minibuf-directory-files full nil (if dir-p 'directory))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1614 :user-data dir-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1615 :reference-buffer minibuf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1616 :activate-callback 'read-file-name-activate-callback)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1617 (goto-char (point-min) completion-buf)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1618
673
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1619 (defun read-file-name-1 (type history prompt dir default
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1620 must-match initial-contents
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1621 completer)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1622 (if (should-use-dialog-box-p)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1623 (condition-case nil
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1624 (let ((file
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1625 (apply #'make-dialog-box
673
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1626 type `(:title ,(capitalize-string-as-title
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1627 ;; Kludge: Delete ": " off the end.
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1628 (replace-in-string prompt ": $" ""))
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1629 ,@(and dir (list :initial-directory
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1630 dir))
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1631 :file-must-exist ,must-match
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1632 ,@(and initial-contents
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1633 (list :initial-filename
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1634 initial-contents))))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1635 ;; hack -- until we implement reading a directory properly,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1636 ;; allow a file as indicating the directory it's in
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1637 (if (and (eq completer 'read-directory-name-internal)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1638 (not (file-directory-p file)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1639 (file-name-directory file)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1640 file))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1641 (unimplemented
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1642 ;; this calls read-file-name-2
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1643 (mouse-read-file-name-1 history prompt dir default must-match
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1644 initial-contents completer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1645 ))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1646 (add-one-shot-hook
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1647 'minibuffer-setup-hook
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1648 (lambda ()
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4675
diff changeset
1649 (and (file-system-ignore-case-p (or dir default-directory))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1650 (set (make-local-variable 'completion-ignore-case) t))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1651 (set
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1652 (make-local-variable
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1653 'completion-display-completion-list-function)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1654 #'(lambda (completions)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1655 (display-completion-list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1656 completions
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1657 :user-data (not (eq completer 'read-file-name-internal))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1658 :activate-callback
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1659 'read-file-name-activate-callback)))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1660 (read-file-name-2 history prompt dir default must-match
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1661 initial-contents completer)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1662
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1663 (defun read-file-name (prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1664 &optional dir default must-match initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1665 history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1666 "Read file name, prompting with PROMPT and completing in directory DIR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1667 This will prompt with a dialog box if appropriate, according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1668 `should-use-dialog-box-p'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1669 Value is not expanded---you must call `expand-file-name' yourself.
438
84b14dcb0985 Import from CVS: tag r21-2-27
cvs
parents: 434
diff changeset
1670 Value is subject to interpretation by `substitute-in-file-name' however.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1671 Default name to DEFAULT if user enters a null string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1672 (If DEFAULT is omitted, the visited file name is used,
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1673 except that if INITIAL-CONTENTS is specified, that combined with DIR is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1674 used.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1675 Fourth arg MUST-MATCH non-nil means require existing file's name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1676 Non-nil and non-t means also require confirmation after completion.
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1677 Fifth arg INITIAL-CONTENTS specifies text to start with. If this is not
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1678 specified, and `insert-default-directory' is non-nil, DIR or the current
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1679 directory will be used.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1680 Sixth arg HISTORY specifies the history list to use. Default is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1681 `file-name-history'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1682 DIR defaults to current buffer's directory default."
673
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1683 (read-file-name-1
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1684 'file (or history 'file-name-history)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1685 prompt dir (or default
440
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1686 (and initial-contents
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1687 (abbreviate-file-name (expand-file-name
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1688 initial-contents dir) t))
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1689 (and buffer-file-truename
8de8e3f6228a Import from CVS: tag r21-2-28
cvs
parents: 438
diff changeset
1690 (abbreviate-file-name buffer-file-name t)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1691 must-match initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1692 ;; A separate function (not an anonymous lambda-expression)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1693 ;; and passed as a symbol because of disgusting kludges in various
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1694 ;; places which do stuff like (let ((filename-kludge-p (eq minibuffer-completion-table 'read-file-name-internal))) ...)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1695 'read-file-name-internal))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1696
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1697 (defun read-directory-name (prompt
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1698 &optional dir default must-match initial-contents
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1699 history)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1700 "Read directory name, prompting with PROMPT and completing in directory DIR.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1701 This will prompt with a dialog box if appropriate, according to
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1702 `should-use-dialog-box-p'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1703 Value is not expanded---you must call `expand-file-name' yourself.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1704 Value is subject to interpreted by substitute-in-file-name however.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1705 Default name to DEFAULT if user enters a null string.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1706 (If DEFAULT is omitted, the current buffer's default directory is used.)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1707 Fourth arg MUST-MATCH non-nil means require existing directory's name.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1708 Non-nil and non-t means also require confirmation after completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1709 Fifth arg INITIAL-CONTENTS specifies text to start with.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1710 Sixth arg HISTORY specifies the history list to use. Default is
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1711 `file-name-history'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1712 DIR defaults to current buffer's directory default."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1713 (read-file-name-1
673
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1714 'directory (or history 'file-name-history)
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1715 prompt dir (or default default-directory) must-match initial-contents
685b588e92d8 [xemacs-hg @ 2001-10-30 05:13:26 by andyp]
andyp
parents: 510
diff changeset
1716 'read-directory-name-internal))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1717
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1718
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1719 ;; Environment-variable and ~username completion hack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1720 (defun read-file-name-internal-1 (string dir action completer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1721 (if (not (string-match
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1722 "\\([^$]\\|\\`\\)\\(\\$\\$\\)*\\$\\([A-Za-z0-9_]*\\|{[^}]*\\)\\'"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1723 string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1724 ;; Not doing environment-variable completion hack
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1725 (let* ((orig (if (equal string "") nil string))
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4675
diff changeset
1726 (completion-ignore-case (file-system-ignore-case-p
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4675
diff changeset
1727 (or dir default-directory)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1728 (sstring (if orig (substitute-in-file-name string) string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1729 (specdir (if orig (file-name-directory sstring) nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1730 (name (if orig (file-name-nondirectory sstring) string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1731 (direct (if specdir (expand-file-name specdir dir) dir)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1732 ;; ~username completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1733 (if (and (fboundp 'user-name-completion-1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1734 (string-match "^[~]" name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1735 (let ((user (substring name 1)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1736 (cond ((eq action 'lambda)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1737 (file-directory-p name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1738 ((eq action 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1739 ;; all completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1740 (mapcar #'(lambda (p) (concat "~" p))
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1741 (declare-fboundp
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1742 (user-name-all-completions user))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1743 (t;; 'nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1744 ;; complete
502
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1745 (let* ((val+uniq (declare-fboundp
7039e6323819 [xemacs-hg @ 2001-05-04 22:41:46 by ben]
ben
parents: 462
diff changeset
1746 (user-name-completion-1 user)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1747 (val (car val+uniq))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1748 (uniq (cdr val+uniq)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1749 (cond ((stringp val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1750 (if uniq
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1751 (file-name-as-directory (concat "~" val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1752 (concat "~" val)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1753 ((eq val t)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1754 (file-name-as-directory name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1755 (t nil))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1756 (funcall completer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1757 action
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1758 orig
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1759 sstring
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1760 specdir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1761 direct
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1762 name)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1763 ;; An odd number of trailing $'s
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1764 (let* ((start (match-beginning 3))
4720
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4675
diff changeset
1765 (completion-ignore-case (file-system-ignore-case-p
3c92890f3750 Add `file-system-ignore-case-p', use it.
Aidan Kehoe <kehoea@parhasard.net>
parents: 4675
diff changeset
1766 (or dir default-directory)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1767 (env (substring string
5366
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 5267
diff changeset
1768 (cond ((eql start (length string))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1769 ;; "...$"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1770 start)
5366
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 5267
diff changeset
1771 ((eql (aref string start) ?{)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1772 ;; "...${..."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1773 (1+ start))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1774 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1775 start))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1776 (head (substring string 0 (1- start)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1777 (alist #'(lambda ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1778 (mapcar #'(lambda (x)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1779 (cons (substring x 0 (string-match "=" x))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1780 nil))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1781 process-environment))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1782
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1783 (cond ((eq action 'lambda)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1784 nil)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1785 ((eq action 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1786 ;; all completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1787 (mapcar #'(lambda (p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1788 (if (and (> (length p) 0)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1789 ;;#### Unix-specific
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1790 ;;#### -- need absolute-pathname-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1791 (/= (aref p 0) ?/))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1792 (concat "$" p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1793 (concat head "$" p)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1794 (all-completions env (funcall alist))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1795 (t ;; nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1796 ;; complete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1797 (let* ((e (funcall alist))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1798 (val (try-completion env e)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1799 (cond ((stringp val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1800 (if (string-match "[^A-Za-z0-9_]" val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1801 (concat head
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1802 "${" val
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1803 ;; completed uniquely?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1804 (if (eq (try-completion val e) 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1805 "}" ""))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1806 (concat head "$" val)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1807 ((eql val 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1808 (concat head
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1809 (un-substitute-in-file-name (getenv env))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1810 (t nil))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1811
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1812
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1813 (defun read-file-name-internal (string dir action)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1814 (read-file-name-internal-1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1815 string dir action
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1816 #'(lambda (action orig string specdir dir name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1817 (cond ((eq action 'lambda)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1818 (if (not orig)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1819 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1820 (let ((sstring (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1821 (expand-file-name string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1822 (error nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1823 (if (not sstring)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1824 ;; Some pathname syntax error in string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1825 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1826 (file-exists-p sstring)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1827 ((eq action 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1828 ;; all completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1829 (mapcar #'un-substitute-in-file-name
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1830 (if (string= name "")
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1831 (delete "./" (file-name-all-completions "" dir))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1832 (file-name-all-completions name dir))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1833 (t;; nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1834 ;; complete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1835 (let* ((d (or dir default-directory))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1836 (val (file-name-completion name d)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1837 (if (and (eq val 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1838 (not (null completion-ignored-extensions)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1839 ;;#### (file-name-completion "foo") returns 't
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1840 ;; when both "foo" and "foo~" exist and the latter
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1841 ;; is "pruned" by completion-ignored-extensions.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1842 ;; I think this is a bug in file-name-completion.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1843 (setq val (let ((completion-ignored-extensions '()))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1844 (file-name-completion name d))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1845 (if (stringp val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1846 (un-substitute-in-file-name (if specdir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1847 (concat specdir val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1848 val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1849 (let ((tem (un-substitute-in-file-name string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1850 (if (not (equal tem orig))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1851 ;; substitute-in-file-name did something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1852 tem
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1853 val)))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1854
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1855 (defun read-directory-name-internal (string dir action)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1856 (read-file-name-internal-1
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1857 string dir action
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1858 #'(lambda (action orig string specdir dir name)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1859 (let* ((dirs #'(lambda (fn)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1860 (let ((l (if (equal name "")
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1861 (minibuf-directory-files
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1862 dir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1863 ""
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1864 'directories)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1865 (minibuf-directory-files
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1866 dir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1867 (concat "\\`" (regexp-quote name))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1868 'directories))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1869 (mapcar fn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1870 ;; Wretched unix
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1871 (delete "." l))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1872 (cond ((eq action 'lambda)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1873 ;; complete?
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1874 (if (not orig)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1875 nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1876 (file-directory-p string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1877 ((eq action 't)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1878 ;; all completions
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1879 (funcall dirs #'(lambda (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1880 (un-substitute-in-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1881 (file-name-as-directory n)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1882 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1883 ;; complete
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1884 (let ((val (try-completion
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1885 name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1886 (funcall dirs
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1887 #'(lambda (n)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1888 (list (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1889 n)))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1890 (if (stringp val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1891 (un-substitute-in-file-name (if specdir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1892 (concat specdir val)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1893 val))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1894 (let ((tem (un-substitute-in-file-name string)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1895 (if (not (equal tem orig))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1896 ;; substitute-in-file-name did something
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1897 tem
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1898 val))))))))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1899
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1900 (defun append-expand-filename (file-string string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1901 "Append STRING to FILE-STRING differently depending on whether STRING
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1902 is a username (~string), an environment variable ($string),
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1903 or a filename (/string). The resultant string is returned with the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1904 environment variable or username expanded and resolved to indicate
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1905 whether it is a file(/result) or a directory (/result/)."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1906 (let ((file
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1907 (cond ((string-match "\\([~$]\\)\\([^~$/]*\\)$" file-string)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1908 (cond ((string= (substring file-string
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1909 (match-beginning 1)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1910 (match-end 1)) "~")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1911 (concat (substring file-string 0 (match-end 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1912 string))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1913 (t (substitute-in-file-name
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1914 (concat (substring file-string 0 (match-end 1))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1915 string)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1916 (t (concat (file-name-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1917 (substitute-in-file-name file-string)) string))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1918 result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1919
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1920 (cond ((stringp (setq result (and (file-exists-p (expand-file-name file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1921 (read-file-name-internal
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1922 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1923 (expand-file-name file)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1924 (error file))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1925 "" nil))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1926 result)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1927 (t file))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1928
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1929 (defun mouse-rfn-setup-vars (prompt)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1930 ;; a specifier would be nice.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1931 (set (make-local-variable 'frame-title-format)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1932 (capitalize-string-as-title
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1933 ;; Kludge: Delete ": " off the end.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1934 (replace-in-string prompt ": $" "")))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1935 ;; ensure that killing the frame works right,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1936 ;; instead of leaving us in the minibuffer.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1937 (add-local-hook 'delete-frame-hook
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1938 #'(lambda (frame)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1939 (abort-recursive-edit))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1940
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1941 (defun mouse-file-display-completion-list (window dir minibuf user-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1942 (let ((standard-output (window-buffer window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1943 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1944 (display-completion-list
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1945 (minibuf-directory-files dir nil t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1946 :window-width (window-width window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1947 :window-height (window-text-area-height window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1948 :completion-string ""
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1949 :activate-callback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1950 'mouse-read-file-name-activate-callback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1951 :user-data user-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1952 :reference-buffer minibuf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1953 :help-string "")
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1954 (t nil))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1955 ))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1956
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1957 (defun mouse-directory-display-completion-list (window dir minibuf user-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1958 (let ((standard-output (window-buffer window)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1959 (condition-case nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1960 (display-completion-list
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1961 (minibuf-directory-files dir nil 1)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1962 :window-width (window-width window)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1963 :window-height (window-text-area-height window)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1964 :completion-string ""
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1965 :activate-callback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1966 'mouse-read-file-name-activate-callback
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1967 :user-data user-data
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1968 :reference-buffer minibuf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1969 :help-string "")
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1970 (t nil))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1971 ))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1972
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1973 (defun mouse-read-file-name-activate-callback (event extent user-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1974 (let* ((file (extent-string extent))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1975 (minibuf (symbol-value-in-buffer 'completion-reference-buffer
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1976 (extent-object extent)))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1977 (ministring (buffer-substring nil nil minibuf))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1978 (in-dir (file-name-directory ministring))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1979 (full (expand-file-name file in-dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1980 (filebuf (nth 0 user-data))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1981 (dirbuf (nth 1 user-data))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1982 (filewin (nth 2 user-data))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1983 (dirwin (nth 3 user-data)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1984 (if (file-regular-p full)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1985 (default-choose-completion event extent minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1986 (erase-buffer minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1987 (insert-string (file-name-as-directory
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1988 (abbreviate-file-name full t)) minibuf)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1989 (reset-buffer filebuf)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1990 (if (not dirbuf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1991 (mouse-directory-display-completion-list filewin full minibuf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1992 user-data)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1993 (mouse-file-display-completion-list filewin full minibuf user-data)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1994 (reset-buffer dirbuf)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1995 (mouse-directory-display-completion-list dirwin full minibuf
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1996 user-data)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
1997
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1998 ;; our cheesy but god-awful time consuming file dialog box implementation.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
1999 ;; this will be replaced with use of the native file dialog box (when
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2000 ;; available).
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2001 (defun mouse-read-file-name-1 (history prompt dir default
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2002 must-match initial-contents
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2003 completer)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2004 ;; file-p is t if we're reading files, nil if directories.
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2005 (let* ((file-p (eq 'read-file-name-internal completer))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2006 (filebuf (get-buffer-create "*Completions*"))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2007 (dirbuf (and file-p (generate-new-buffer " *mouse-read-file*")))
4376
53e507d77416 Fix problem with file dialog box.
Mike Sperber <sperber@deinprogramm.de>
parents: 4222
diff changeset
2008 (butbuf (generate-new-buffer " *mouse-read-file-buttons*"))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2009 (frame (make-dialog-frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2010 filewin dirwin
4384
c7e65155cb35 Improve upon previous patch to minibuf.el.
Mike Sperber <sperber@deinprogramm.de>
parents: 4376
diff changeset
2011 user-data
c7e65155cb35 Improve upon previous patch to minibuf.el.
Mike Sperber <sperber@deinprogramm.de>
parents: 4376
diff changeset
2012 (window-min-height 1)) ; allow button window to be height 2
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2013 (unwind-protect
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2014 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2015 (reset-buffer filebuf)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2016
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2017 ;; set up the frame.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2018 (focus-frame frame)
4384
c7e65155cb35 Improve upon previous patch to minibuf.el.
Mike Sperber <sperber@deinprogramm.de>
parents: 4376
diff changeset
2019 (split-window nil (- (window-height) 2))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2020 (if file-p
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2021 (progn
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2022 (split-window-horizontally 16)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2023 (setq filewin (frame-rightmost-window frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2024 dirwin (frame-leftmost-window frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2025 (set-window-buffer filewin filebuf)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2026 (set-window-buffer dirwin dirbuf))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2027 (setq filewin (frame-highest-window frame))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2028 (set-window-buffer filewin filebuf))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2029 (setq user-data (list filebuf dirbuf filewin dirwin))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2030 (set-window-buffer (frame-lowest-window frame) butbuf)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2031
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2032 ;; set up completion buffers.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2033 (let ((rfcshookfun
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2034 ;; kludge!
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2035 ;; #### I really need to flesh out the object
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2036 ;; hierarchy better to avoid these kludges.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2037 ;; (?? I wrote this comment above some time ago,
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2038 ;; and I don't understand what I'm referring to
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2039 ;; any more. --ben
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2040 (lambda ()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2041 (mouse-rfn-setup-vars prompt)
5368
ed74d2ca7082 Use ', not #', when a given symbol may not have a function binding at read time
Aidan Kehoe <kehoea@parhasard.net>
parents: 5366
diff changeset
2042 (when-boundp 'scrollbar-width
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2043 (set-specifier scrollbar-width 0 (current-buffer)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2044 (setq truncate-lines t))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2045
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2046 (set-buffer filebuf)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2047 (add-local-hook 'completion-setup-hook rfcshookfun)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2048 (when file-p
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2049 (set-buffer dirbuf)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2050 (add-local-hook 'completion-setup-hook rfcshookfun)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2051
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2052 ;; set up minibuffer.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2053 (add-one-shot-hook
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2054 'minibuffer-setup-hook
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2055 (lambda ()
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2056 (if (not file-p)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2057 (mouse-directory-display-completion-list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2058 filewin dir (current-buffer) user-data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2059 (mouse-file-display-completion-list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2060 filewin dir (current-buffer) user-data)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2061 (mouse-directory-display-completion-list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2062 dirwin dir (current-buffer) user-data))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2063 (set
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2064 (make-local-variable
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2065 'completion-display-completion-list-function)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2066 (lambda (completions)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2067 (display-completion-list
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2068 completions
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2069 :help-string ""
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2070 :window-width (window-width filewin)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2071 :window-height (window-text-area-height filewin)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2072 :completion-string ""
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2073 :activate-callback
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2074 'mouse-read-file-name-activate-callback
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2075 :user-data user-data)))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2076 (mouse-rfn-setup-vars prompt)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2077 (save-selected-window
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2078 ;; kludge to ensure the frame title is correct.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2079 ;; the minibuffer leaves the frame title the way
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2080 ;; it was before (i.e. of the selected window before
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2081 ;; the dialog box was opened), so to get it correct
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2082 ;; we have to be tricky.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2083 (select-window filewin)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2084 (redisplay-frame nil t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2085 ;; #### another kludge. sometimes the focus ends up
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2086 ;; back in the main window, not the dialog box. it
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2087 ;; occurs randomly and it's not possible to reliably
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2088 ;; reproduce. We try to fix it by draining non-user
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2089 ;; events and then setting the focus back on the frame.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2090 (sit-for 0 t)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2091 (focus-frame frame))))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2092
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2093 ;; set up button buffer.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2094 (set-buffer butbuf)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2095 (mouse-rfn-setup-vars prompt)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2096 (when dir
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2097 (setq default-directory dir))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2098 (when (featurep 'scrollbar)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2099 (set-specifier scrollbar-width 0 butbuf))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2100 (insert " ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2101 (insert-gui-button (make-gui-button "OK"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2102 (lambda (foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2103 (exit-minibuffer))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2104 (insert " ")
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2105 (insert-gui-button (make-gui-button "Cancel"
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2106 (lambda (foo)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2107 (abort-recursive-edit))))
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2108
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2109 ;; now start reading filename.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2110 (read-file-name-2 history prompt dir default
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2111 must-match initial-contents
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2112 completer))
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2113
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2114 ;; always clean up.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2115 ;; get rid of our hook that calls abort-recursive-edit -- not a good
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2116 ;; idea here.
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2117 (kill-local-variable 'delete-frame-hook)
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2118 (delete-frame frame)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2119 (kill-buffer filebuf)
442
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2120 (kill-buffer butbuf)
abe6d1db359e Import from CVS: tag r21-2-36
cvs
parents: 440
diff changeset
2121 (and dirbuf (kill-buffer dirbuf)))))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2122
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2123 (defun read-face (prompt &optional must-match)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2124 "Read the name of a face from the minibuffer and return it as a symbol."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2125 (intern (completing-read prompt obarray 'find-face must-match)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2126
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2127 (defun read-color-completion-table ()
2527
491f8cf78a9c [xemacs-hg @ 2005-01-28 02:58:38 by ben]
ben
parents: 2021
diff changeset
2128 (mapcar #'list (color-list)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2129
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2130 (defun read-color (prompt &optional must-match initial-contents)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2131 "Read the name of a color from the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2132 On X devices, this uses `x-library-search-path' to find rgb.txt in order
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2133 to build a completion table.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2134 On TTY devices, this uses `tty-color-list'.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2135 On mswindows devices, this uses `mswindows-color-list'."
5666
daf5accfe973 Use #'test-completion, minibuf.el, instead of implementing same.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5655
diff changeset
2136 (let ((table (color-list)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2137 (completing-read prompt table nil (and table must-match)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2138 initial-contents)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2139
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2140
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2141 (defun read-coding-system (prompt &optional default-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2142 "Read a coding-system (or nil) from the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2143 Prompting with string PROMPT.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2144 If the user enters null input, return second argument DEFAULT-CODING-SYSTEM.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2145 DEFAULT-CODING-SYSTEM can be a string, symbol, or coding-system object."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2146 (intern (completing-read prompt obarray 'find-coding-system t nil nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2147 (cond ((symbolp default-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2148 (symbol-name default-coding-system))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2149 ((coding-system-p default-coding-system)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2150 (symbol-name (coding-system-name default-coding-system)))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2151 (t
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2152 default-coding-system)))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2153
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2154 (defun read-non-nil-coding-system (prompt)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2155 "Read a non-nil coding-system from the minibuffer.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2156 Prompt with string PROMPT."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2157 (let ((retval (intern "")))
5366
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 5267
diff changeset
2158 (while (eql 0 (length (symbol-name retval)))
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2159 (setq retval (intern (completing-read prompt obarray
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2160 'find-coding-system
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2161 t))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2162 retval))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2163
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2164
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2165
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2166 (defcustom force-dialog-box-use nil
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2167 "*If non-nil, always use a dialog box for asking questions, if possible.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2168 You should *bind* this, not set it. This is useful if you're doing
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2169 something mousy but which wasn't actually invoked using the mouse."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2170 :type 'boolean
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2171 :group 'minibuffer)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2172
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2173 ;; We include this here rather than dialog.el so it is defined
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2174 ;; even when dialog boxes are not present.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2175 (defun should-use-dialog-box-p ()
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2176 "If non-nil, questions should be asked with a dialog box instead of the
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2177 minibuffer. This looks at `last-command-event' to see if it was a mouse
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2178 event, and checks whether dialog-support exists and the current device
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2179 supports dialog boxes.
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2180
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2181 The dialog box is totally disabled if the variable `use-dialog-box'
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2182 is set to nil."
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2183 (and (featurep 'dialog)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2184 (device-on-window-system-p)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2185 use-dialog-box
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2186 (or force-dialog-box-use
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2187 (button-press-event-p last-command-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2188 (button-release-event-p last-command-event)
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2189 (misc-user-event-p last-command-event))))
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2190
2730
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2191 (defun get-user-response (position question answers)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2192 "Ask a question and get a response from the user, in minibuffer or dialog box.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2193 POSITION specifies which frame to use.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2194 This is normally an event or a window or frame.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2195 If POSITION is t or nil, it means to use the frame the mouse is on.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2196 The dialog box appears in the middle of the specified frame.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2197
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2198 QUESTION is the question to ask (it should end with a question mark followed
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2199 by a space).
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2200
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2201 ANSWERS are the possible answers. It is a list; each item looks like
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2202
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2203 (KEY BUTTON-TEXT RESPONSE)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2204
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2205 where KEY is the key to be pressed in the minibuffer, BUTTON-TEXT is the
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2206 text to be displayed in a dialog box button (you should put %_ in it to
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2207 indicate the accelerator), and RESPONSE is a value (typically a symbol)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2208 to be returned if the user selects this response. KEY should be either a
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2209 single character or a string; which one you use needs to be consistent for
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2210 all responses and determines whether the user responds by hitting a single
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2211 key or typing in a string and hitting ENTER.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2212
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2213 An item may also be just a string--that makes a nonselectable item in the
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2214 dialog box and is ignored in the minibuffer.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2215
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2216 An item may also be nil -- that means to put all preceding items
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2217 on the left of the dialog box and all following items on the right; ignored
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2218 in the minibuffer."
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2219 (if (should-use-dialog-box-p)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2220 (get-dialog-box-response
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2221 position
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2222 (cons question
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2223 (mapcar #'(lambda (x)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2224 (cond
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2225 ((null x) nil)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2226 ((stringp x) x)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2227 (t (cons (second x) (third x)))))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2228 answers)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2229 (save-excursion
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2230 (let* ((answers (remove-if-not #'consp answers))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2231 (possible
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2232 (gettext
5567
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5474
diff changeset
2233 (labels ((car-to-string-if (x)
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5474
diff changeset
2234 (setq x (car x))
3bc58dc9d688 Replace #'flet by #'labels where appropriate, core code.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5474
diff changeset
2235 (if (stringp x) x (char-to-string x))))
2730
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2236 (concat (mapconcat #'car-to-string-if
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2237 (butlast answers) ", ") " or "
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2238 (car-to-string-if (car (last answers)))))))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2239 (question (gettext question))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2240 (p (format "%s(%s) " question possible)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2241 (block nil
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2242 (if (stringp (caar answers))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2243 ;; based on yes-or-no-p.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2244 (while t
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2245 (let* ((ans (downcase (read-string p nil t))) ;no history
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2246 (res (member* ans answers :test #'equal :key #'car)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2247 (if res (return (third (car res)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2248 (ding nil 'yes-or-no-p)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2249 (discard-input)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2250 (message "Please answer %s." possible)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2251 (sleep-for 2))))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2252 ;; based on y-or-n-p.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2253 (save-excursion
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2254 (let* ((pre "") event)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2255 (while t
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2256 (if (let ((cursor-in-echo-area t)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2257 (inhibit-quit t))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2258 (message "%s%s(%s) " pre question possible)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2259 (setq event (next-command-event event))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2260 (condition-case nil
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2261 (prog1
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2262 (or quit-flag (eq 'keyboard-quit
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2263 (key-binding event)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2264 (setq quit-flag nil))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2265 (wrong-type-argument t)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2266 (progn
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2267 (message "%s%s(%s) %s" pre question possible
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2268 (single-key-description event))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2269 (setq quit-flag nil)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2270 (signal 'quit '())))
5745
f9e4d44504a4 Document #'events-to-keys some more, use it less.
Aidan Kehoe <kehoea@parhasard.net>
parents: 5666
diff changeset
2271 (let ((def (lookup-key query-replace-map (vector event))))
2730
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2272 (cond
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2273 ((eq def 'recenter)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2274 (recenter))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2275 ((or (eq def 'quit) (eq def 'exit-prefix))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2276 (signal 'quit '()))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2277 ((button-release-event-p event) ; ignore them
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2278 nil)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2279 (t
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2280 (let ((res (member* (event-to-character event) answers
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2281 :key #'car)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2282 (if res (return (third (car res)))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2283 (message "%s%s(%s) %s" pre question possible
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2284 (single-key-description event))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2285 (ding nil 'y-or-n-p)
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2286 (discard-input)
5366
f00192e1cd49 Examining the result of #'length: `eql', not `=', it's better style & cheaper
Aidan Kehoe <kehoea@parhasard.net>
parents: 5267
diff changeset
2287 (if (eql (length pre) 0)
2730
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2288 (setq pre (format "Please answer %s. "
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2289 ;; 17 parens! a record in
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2290 ;; our lisp code.
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2291 possible)))))))))))))))))
7031e143e4ee [xemacs-hg @ 2005-04-14 05:58:45 by michaels]
michaels
parents: 2611
diff changeset
2292
428
3ecd8885ac67 Import from CVS: tag r21-2-22
cvs
parents:
diff changeset
2293 ;;; minibuf.el ends here