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) */