X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/ba5ff07b2a19846cc8624bfe7f802bc9d38a4867..9250c1e82544edcc8bf62ec9a5149e575fa3c73f:/src/minibuf.c
diff --git a/src/minibuf.c b/src/minibuf.c
index dae6918e07..138581fb83 100644
--- a/src/minibuf.c
+++ b/src/minibuf.c
@@ -1,14 +1,14 @@
/* Minibuffer input and completion.
- Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2001, 2002, 2003, 2004, 2005,
- 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997, 1998, 1999,
+ 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+ 2008, 2009 Free Software Foundation, Inc.
This file is part of GNU Emacs.
-GNU Emacs is free software; you can redistribute it and/or modify
+GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -16,9 +16,7 @@ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA. */
+along with GNU Emacs. If not, see . */
#include
@@ -115,6 +113,7 @@ Lisp_Object Vread_buffer_function;
int completion_ignore_case;
Lisp_Object Qcompletion_ignore_case;
+int read_buffer_completion_ignore_case;
/* List of regexps that should restrict possible completions. */
@@ -188,7 +187,7 @@ choose_minibuf_frame ()
if (MINI_WINDOW_P (XWINDOW (FRAME_SELECTED_WINDOW (XFRAME (frame))))
&& !(EQ (frame, selected_frame)
&& minibuf_level > 0))
- Fset_frame_selected_window (frame, Fframe_first_window (frame));
+ Fset_frame_selected_window (frame, Fframe_first_window (frame), Qnil);
}
}
@@ -526,7 +525,11 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
build_string ("Command attempted to use minibuffer while in minibuffer"));
}
- if (noninteractive && NILP (Vexecuting_kbd_macro))
+ if ((noninteractive
+ /* In case we are running as a daemon, only do this before
+ detaching from the terminal. */
+ || (IS_DAEMON && (daemon_pipe[1] >= 0)))
+ && NILP (Vexecuting_kbd_macro))
{
val = read_minibuf_noninteractive (map, initial, prompt,
make_number (pos),
@@ -783,10 +786,10 @@ read_minibuf (map, initial, prompt, backup_n, expflag,
Lisp_Object histval;
/* If variable is unbound, make it nil. */
- if (EQ (SYMBOL_VALUE (Vminibuffer_history_variable), Qunbound))
- Fset (Vminibuffer_history_variable, Qnil);
- histval = Fsymbol_value (Vminibuffer_history_variable);
+ histval = find_symbol_value (Vminibuffer_history_variable);
+ if (EQ (histval, Qunbound))
+ Fset (Vminibuffer_history_variable, Qnil);
/* The value of the history variable must be a cons or nil. Other
values are unacceptable. We silently ignore these values. */
@@ -974,10 +977,12 @@ Fifth arg HIST, if non-nil, specifies a history list and optionally
history commands. For consistency, you should also specify that
element of the history as the value of INITIAL-CONTENTS. Positions
are counted starting from 1 at the beginning of the list.
-Sixth arg DEFAULT-VALUE is the default value. If non-nil, it is available
- for history commands; but, unless READ is non-nil, `read-from-minibuffer'
- does NOT return DEFAULT-VALUE if the user enters empty input! It returns
- the empty string.
+Sixth arg DEFAULT-VALUE is the default value or the list of default values.
+ If non-nil, it is available for history commands, and as the value
+ (or the first element of the list of default values) to return
+ if the user enters the empty string. But, unless READ is non-nil,
+ `read-from-minibuffer' does NOT return DEFAULT-VALUE if the user enters
+ empty input! It returns the empty string.
Seventh arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits
the current input method and the setting of `enable-multibyte-characters'.
If the variable `minibuffer-allow-text-properties' is non-nil,
@@ -1073,9 +1078,10 @@ If non-nil, second arg INITIAL-INPUT is a string to insert before reading.
The third arg HISTORY, if non-nil, specifies a history list
and optionally the initial position in the list.
See `read-from-minibuffer' for details of HISTORY argument.
-Fourth arg DEFAULT-VALUE is the default value. If non-nil, it is used
- for history commands, and as the value to return if the user enters
- the empty string.
+Fourth arg DEFAULT-VALUE is the default value or the list of default values.
+ If non-nil, it is used for history commands, and as the value (or the first
+ element of the list of default values) to return if the user enters the
+ empty string.
Fifth arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits
the current input method and the setting of `enable-multibyte-characters'. */)
(prompt, initial_input, history, default_value, inherit_input_method)
@@ -1112,7 +1118,8 @@ the current input method and the setting of`enable-multibyte-characters'. */)
DEFUN ("read-command", Fread_command, Sread_command, 1, 2, 0,
doc: /* Read the name of a command and return as a symbol.
-Prompt with PROMPT. By default, return DEFAULT-VALUE. */)
+Prompt with PROMPT. By default, return DEFAULT-VALUE or its first element
+if it is a list. */)
(prompt, default_value)
Lisp_Object prompt, default_value;
{
@@ -1146,7 +1153,8 @@ Prompt with PROMPT. */)
DEFUN ("read-variable", Fread_variable, Sread_variable, 1, 2, 0,
doc: /* Read the name of a user variable and return it as a symbol.
-Prompt with PROMPT. By default, return DEFAULT-VALUE.
+Prompt with PROMPT. By default, return DEFAULT-VALUE or its first element
+if it is a list.
A user variable is one for which `user-variable-p' returns non-nil. */)
(prompt, default_value)
Lisp_Object prompt, default_value;
@@ -1172,19 +1180,29 @@ DEFUN ("read-buffer", Fread_buffer, Sread_buffer, 1, 3, 0,
doc: /* Read the name of a buffer and return as a string.
Prompt with PROMPT.
Optional second arg DEF is value to return if user enters an empty line.
-If optional third arg REQUIRE-MATCH is non-nil,
- only existing buffer names are allowed.
-The argument PROMPT should be a string ending with a colon and a space. */)
+ If DEF is a list of default values, return its first element.
+Optional third arg REQUIRE-MATCH determines whether non-existing
+ buffer names are allowed. It has the same meaning as the
+ REQUIRE-MATCH argument of `confirm-after-completion'.
+The argument PROMPT should be a string ending with a colon and a space.
+If `read-buffer-completion-ignore-case' is non-nil, completion ignores
+case while reading the buffer name.
+If `read-buffer-function' is non-nil, this works by calling it as a
+function, instead of the usual behavior. */)
(prompt, def, require_match)
Lisp_Object prompt, def, require_match;
{
- Lisp_Object args[4];
+ Lisp_Object args[4], result;
unsigned char *s;
int len;
+ int count = SPECPDL_INDEX ();
if (BUFFERP (def))
def = XBUFFER (def)->name;
+ specbind (Qcompletion_ignore_case,
+ read_buffer_completion_ignore_case ? Qt : Qnil);
+
if (NILP (Vread_buffer_function))
{
if (!NILP (def))
@@ -1214,9 +1232,9 @@ The argument PROMPT should be a string ending with a colon and a space. */)
prompt = Fformat (3, args);
}
- return Fcompleting_read (prompt, intern ("internal-complete-buffer"),
- Qnil, require_match, Qnil, Qbuffer_name_history,
- def, Qnil);
+ result = Fcompleting_read (prompt, intern ("internal-complete-buffer"),
+ Qnil, require_match, Qnil, Qbuffer_name_history,
+ def, Qnil);
}
else
{
@@ -1224,8 +1242,9 @@ The argument PROMPT should be a string ending with a colon and a space. */)
args[1] = prompt;
args[2] = def;
args[3] = require_match;
- return Ffuncall(4, args);
+ result = Ffuncall(4, args);
}
+ return unbind_to (count, result);
}
static Lisp_Object
@@ -1439,9 +1458,6 @@ is used to further constrain the set of candidates. */)
else
matchsize = XINT (tem) - 1;
- if (matchsize < 0)
- /* When can this happen ? -stef */
- matchsize = compare;
if (completion_ignore_case)
{
/* If this is an exact match except for case,
@@ -1507,13 +1523,7 @@ is used to further constrain the set of candidates. */)
/* Return t if the supplied string is an exact match (counting case);
it does not require any change to be made. */
- if (matchcount == 1 && bestmatchsize == SCHARS (string)
- && (tem = Fcompare_strings (bestmatch, make_number (0),
- make_number (bestmatchsize),
- string, make_number (0),
- make_number (bestmatchsize),
- Qnil),
- EQ (Qt, tem)))
+ if (matchcount == 1 && !NILP (Fequal (bestmatch, string)))
return Qt;
XSETFASTINT (zero, 0); /* Else extract the part in which */
@@ -1718,13 +1728,18 @@ REQUIRE-MATCH can take the following values:
- t means that the user is not allowed to exit unless
the input is (or completes to) an element of COLLECTION or is null.
- nil means that the user can exit with any input.
-- `confirm-only' means that the user can exit with any input, but she will
- need to confirm her choice if the input is not an element of COLLECTION.
+- `confirm' means that the user can exit with any input, but she needs
+ to confirm her choice if the input is not an element of COLLECTION.
+- `confirm-after-completion' means that the user can exit with any
+ input, but she needs to confirm her choice if she called
+ `minibuffer-complete' right before `minibuffer-complete-and-exit'
+ and the input is not an element of COLLECTION.
- anything else behaves like t except that typing RET does not exit if it
does non-null completion.
-If the input is null, `completing-read' returns DEF, or an empty string
- if DEF is nil, regardless of the value of REQUIRE-MATCH.
+If the input is null, `completing-read' returns DEF, or the first element
+of the list of default values, or an empty string if DEF is nil,
+regardless of the value of REQUIRE-MATCH.
If INITIAL-INPUT is non-nil, insert it in the minibuffer initially,
with point positioned at the end.
@@ -1748,7 +1763,7 @@ HIST, if non-nil, specifies a history list and optionally the initial
1 at the beginning of the list. The variable `history-length'
controls the maximum length of a history list.
-DEF, if non-nil, is the default value.
+DEF, if non-nil, is the default value or the list of default values.
If INHERIT-INPUT-METHOD is non-nil, the minibuffer inherits
the current input method and the setting of `enable-multibyte-characters'.
@@ -1813,7 +1828,7 @@ Completion ignores case if the ambient value of
: (NILP (Vminibuffer_completing_file_name)
|| EQ (Vminibuffer_completing_file_name, Qlambda)
? Vminibuffer_local_must_match_map
- : Vminibuffer_local_must_match_filename_map),
+ : Vminibuffer_local_filename_must_match_map),
init, prompt, make_number (pos), 0,
histvar, histpos, def, 0,
!NILP (inherit_input_method));
@@ -1957,7 +1972,28 @@ The arguments STRING and PREDICATE are as in `try-completion',
if (NILP (flag))
return Ftry_completion (string, Vbuffer_alist, predicate);
else if (EQ (flag, Qt))
- return Fall_completions (string, Vbuffer_alist, predicate, Qt);
+ {
+ Lisp_Object res = Fall_completions (string, Vbuffer_alist, predicate, Qnil);
+ if (SCHARS (string) > 0)
+ return res;
+ else
+ { /* Strip out internal buffers. */
+ Lisp_Object bufs = res;
+ /* First, look for a non-internal buffer in `res'. */
+ while (CONSP (bufs) && SREF (XCAR (bufs), 0) == ' ')
+ bufs = XCDR (bufs);
+ if (NILP (bufs))
+ /* All bufs in `res' are internal, so don't trip them out. */
+ return res;
+ res = bufs;
+ while (CONSP (XCDR (bufs)))
+ if (SREF (XCAR (XCDR (bufs)), 0) == ' ')
+ XSETCDR (bufs, XCDR (XCDR (bufs)));
+ else
+ bufs = XCDR (bufs);
+ return res;
+ }
+ }
else /* assume `lambda' */
return Ftest_completion (string, Vbuffer_alist, predicate);
}
@@ -2094,6 +2130,11 @@ syms_of_minibuf ()
doc: /* If this is non-nil, `read-buffer' does its work by calling this function. */);
Vread_buffer_function = Qnil;
+ DEFVAR_BOOL ("read-buffer-completion-ignore-case",
+ &read_buffer_completion_ignore_case,
+ doc: /* *Non-nil means completion ignores case when reading a buffer name. */);
+ read_buffer_completion_ignore_case = 0;
+
DEFVAR_LISP ("minibuffer-setup-hook", &Vminibuffer_setup_hook,
doc: /* Normal hook run just after entry to minibuffer. */);
Vminibuffer_setup_hook = Qnil;
@@ -2124,8 +2165,9 @@ history list, so it is possible to do this afterwards by calling
DEFVAR_BOOL ("completion-ignore-case", &completion_ignore_case,
doc: /* Non-nil means don't consider case significant in completion.
-
-For file-name completion, the variable `read-file-name-completion-ignore-case'
+For file-name completion, `read-file-name-completion-ignore-case'
+controls the behavior, rather than this variable.
+For buffer name completion, `read-buffer-completion-ignore-case'
controls the behavior, rather than this variable. */);
completion_ignore_case = 0;
@@ -2154,12 +2196,19 @@ CODE can be nil, t or `lambda':
Vminibuffer_completion_predicate = Qnil;
DEFVAR_LISP ("minibuffer-completion-confirm", &Vminibuffer_completion_confirm,
- doc: /* Non-nil means to demand confirmation of completion before exiting minibuffer. */);
+ doc: /* Whether to demand confirmation of completion before exiting minibuffer.
+If nil, confirmation is not required.
+If the value is `confirm', the user may exit with an input that is not
+ a valid completion alternative, but Emacs asks for confirmation.
+If the value is `confirm-after-completion', the user may exit with an
+ input that is not a valid completion alternative, but Emacs asks for
+ confirmation if the user submitted the input right after any of the
+ completion commands listed in `minibuffer-confirm-exit-commands'. */);
Vminibuffer_completion_confirm = Qnil;
DEFVAR_LISP ("minibuffer-completing-file-name",
&Vminibuffer_completing_file_name,
- doc: /* Non-nil and non-`lambda' means completing file names. */);
+ doc: /* Non-nil means completing file names. */);
Vminibuffer_completing_file_name = Qnil;
DEFVAR_LISP ("minibuffer-help-form", &Vminibuffer_help_form,
@@ -2239,41 +2288,5 @@ properties. */);
defsubr (&Scompleting_read);
}
-void
-keys_of_minibuf ()
-{
- initial_define_key (Vminibuffer_local_map, Ctl ('g'),
- "abort-recursive-edit");
- initial_define_key (Vminibuffer_local_map, Ctl ('m'),
- "exit-minibuffer");
- initial_define_key (Vminibuffer_local_map, Ctl ('j'),
- "exit-minibuffer");
-
- initial_define_key (Vminibuffer_local_ns_map, ' ',
- "exit-minibuffer");
- initial_define_key (Vminibuffer_local_ns_map, '\t',
- "exit-minibuffer");
- initial_define_key (Vminibuffer_local_ns_map, '?',
- "self-insert-and-exit");
-
- initial_define_key (Vminibuffer_local_completion_map, '\t',
- "minibuffer-complete");
- initial_define_key (Vminibuffer_local_completion_map, ' ',
- "minibuffer-complete-word");
- initial_define_key (Vminibuffer_local_completion_map, '?',
- "minibuffer-completion-help");
-
- Fdefine_key (Vminibuffer_local_filename_completion_map,
- build_string (" "), Qnil);
-
- initial_define_key (Vminibuffer_local_must_match_map, Ctl ('m'),
- "minibuffer-complete-and-exit");
- initial_define_key (Vminibuffer_local_must_match_map, Ctl ('j'),
- "minibuffer-complete-and-exit");
-
- Fdefine_key (Vminibuffer_local_must_match_filename_map,
- build_string (" "), Qnil);
-}
-
/* arch-tag: 8f69b601-fba3-484c-a6dd-ceaee54a7a73
(do not change this comment) */