annotate lisp/minibuf.el @ 502:7039e6323819

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