/* Minibuffer input and completion.
- Copyright (C) 1985, 1986, 93, 94, 95, 1996 Free Software Foundation, Inc.
+ Copyright (C) 1985, 1986, 1993, 1994, 1995, 1996, 1997
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
Lisp_Object Qminibuffer_setup_hook, Vminibuffer_setup_hook;
Lisp_Object Qminibuffer_exit_hook, Vminibuffer_exit_hook;
+/* Function to call to read a buffer name. */
+Lisp_Object Vread_buffer_function;
+
/* Nonzero means completion ignores case. */
int completion_ignore_case;
extern Lisp_Object Vminibuf_scroll_window;
extern Lisp_Object Voverriding_local_map;
+
+Lisp_Object Qcurrent_input_method, Qactivate_input_method;
+
\f
/* Put minibuf on currently selected frame's minibuffer.
We do this whenever the user starts a new minibuffer
}
}
+Lisp_Object
+choose_minibuf_frame_1 (ignore)
+ Lisp_Object ignore;
+{
+ choose_minibuf_frame ();
+ return Qnil;
+}
+
DEFUN ("set-minibuffer-window", Fset_minibuffer_window,
Sset_minibuffer_window, 1, 1, 0,
"Specify which minibuffer window to use for the minibuffer.\n\
\f
/* Actual minibuffer invocation. */
-static void read_minibuf_unwind ();
+static Lisp_Object read_minibuf_unwind ();
Lisp_Object get_minibuffer ();
static Lisp_Object read_minibuf ();
DEFALT specifies te default value for the sake of history commands.
- If ALLOW_PROPS is nonzero, we do not throw away text properties. */
+ If ALLOW_PROPS is nonzero, we do not throw away text properties.
+
+ if INHERIT_INPUT_METHOD is nonzeor, the minibuffer inherit the
+ current input method. */
static Lisp_Object
read_minibuf (map, initial, prompt, backup_n, expflag,
- histvar, histpos, defalt, allow_props)
+ histvar, histpos, defalt, allow_props, inherit_input_method)
Lisp_Object map;
Lisp_Object initial;
Lisp_Object prompt;
Lisp_Object histvar;
Lisp_Object histpos;
Lisp_Object defalt;
+ int inherit_input_method;
{
Lisp_Object val;
int count = specpdl_ptr - specpdl;
- Lisp_Object mini_frame, ambient_dir, minibuffer;
- struct gcpro gcpro1, gcpro2, gcpro3, gcpro4;
+ Lisp_Object mini_frame, ambient_dir, minibuffer, input_method;
+ struct gcpro gcpro1, gcpro2, gcpro3, gcpro4, gcpro5;
+ Lisp_Object enable_multibyte;
specbind (Qminibuffer_default, defalt);
val = Qnil;
ambient_dir = current_buffer->directory;
+ input_method = Qnil;
+ enable_multibyte = Qnil;
/* Don't need to protect PROMPT, HISTVAR, and HISTPOS because we
store them away before we can GC. Don't need to protect
BACKUP_N because we use the value only if it is an integer. */
- GCPRO4 (map, initial, val, ambient_dir);
+ GCPRO5 (map, initial, val, ambient_dir, input_method);
if (!STRINGP (prompt))
prompt = build_string ("");
choose_minibuf_frame ();
+ record_unwind_protect (choose_minibuf_frame_1, Qnil);
+
record_unwind_protect (Fset_window_configuration,
Fcurrent_window_configuration (Qnil));
Vminibuffer_history_variable = histvar;
Vhelp_form = Vminibuffer_help_form;
+ if (inherit_input_method)
+ {
+ /* `current-input-method' is buffer local. So, remeber it in
+ INPUT_METHOD before changing the current buffer. */
+ input_method = Fsymbol_value (Qcurrent_input_method);
+ enable_multibyte = current_buffer->enable_multibyte_characters;
+ }
+
/* Switch to the minibuffer. */
minibuffer = get_minibuffer (minibuf_level);
current_buffer->keymap = map;
+ /* Turn on an input method stored in INPUT_METHOD if any. */
+ if (STRINGP (input_method) && !NILP (Ffboundp (Qactivate_input_method)))
+ call1 (Qactivate_input_method, input_method);
+
+ /* If appropriate, copy enable-multibyte-characters into the minibuffer. */
+ if (inherit_input_method)
+ current_buffer->enable_multibyte_characters = enable_multibyte;
+
/* Run our hook, but not if it is empty.
(run-hooks would do nothing if it is empty,
but it's important to save time here in the usual case). */
#endif
/* VAL is the string of minibuffer text. */
+
+ if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (defalt))
+ val = defalt;
+
last_minibuf_string = val;
/* Add the value to the appropriate history list unless it is empty. */
/* This function is called on exiting minibuffer, whether normally or not,
and it restores the current window, buffer, etc. */
-static void
+static Lisp_Object
read_minibuf_unwind (data)
Lisp_Object data;
{
unbind_to (count, Qnil);
}
- /* Make the minibuffer follow the selected frame
- (in case we are exiting a recursive minibuffer). */
- choose_minibuf_frame ();
-
/* Make sure minibuffer window is erased, not ignored. */
windows_or_buffers_changed++;
XSETFASTINT (XWINDOW (window)->last_modified, 0);
XSETFASTINT (XWINDOW (window)->last_overlay_modified, 0);
+
+ return Qnil;
}
\f
for make-docfile to see. We cannot put this in the real DEFUN
due to limits in the Unix cpp.
-DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 6, 0,
+DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 7, 0,
"Read a string from the minibuffer, prompting with string PROMPT.\n\
If optional second arg INITIAL-CONTENTS is non-nil, it is a string\n\
to be inserted into the minibuffer before reading input.\n\
Sixth arg DEFAULT-VALUE is the default value. If non-nil, it is used\n\
for history commands, and as the value to return if the user enters\n\
the empty string.\n\
+Seventh arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits\n\
+ the current input method and the setting of enable-multibyte-characters.\n\
If the variable `minibuffer-allow-text-properties is non-nil,\n\
then the string which is returned includes whatever text properties\n\
- were present in the minibuffer. Otherwise the value has no text properties. */
+ were present in the minibuffer. Otherwise the value has no text properties.")
+ (prompt, initial_contents, keymap, read, hist, default_value, inherit_input_method)
+ */
-DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 6, 0,
+DEFUN ("read-from-minibuffer", Fread_from_minibuffer, Sread_from_minibuffer, 1, 7, 0,
0 /* See immediately above */)
- (prompt, initial_contents, keymap, read, hist, default_value)
+ (prompt, initial_contents, keymap, read, hist, default_value, inherit_input_method)
Lisp_Object prompt, initial_contents, keymap, read, hist, default_value;
+ Lisp_Object inherit_input_method;
{
int pos = 0;
Lisp_Object histvar, histpos, position, val;
val = read_minibuf (keymap, initial_contents, prompt,
make_number (pos), !NILP (read),
histvar, histpos, default_value,
- minibuffer_allow_text_properties);
- if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (default_value))
- val = default_value;
+ minibuffer_allow_text_properties,
+ !NILP (inherit_input_method));
UNGCPRO;
return val;
}
CHECK_STRING (initial_contents, 1);
return read_minibuf (Vminibuffer_local_map, initial_contents,
prompt, Qnil, 1, Qminibuffer_history,
- make_number (0), Qnil, 0);
+ make_number (0), Qnil, 0, 0);
}
DEFUN ("eval-minibuffer", Feval_minibuffer, Seval_minibuffer, 1, 2, 0,
/* Functions that use the minibuffer to read various things. */
-DEFUN ("read-string", Fread_string, Sread_string, 1, 4, 0,
+DEFUN ("read-string", Fread_string, Sread_string, 1, 5, 0,
"Read a string from the minibuffer, prompting with string PROMPT.\n\
If non-nil, second arg INITIAL-INPUT is a string to insert before reading.\n\
The third arg HISTORY, if non-nil, specifies a history list\n\
and optionally the initial position in the list.\n\
-See `read-from-minibuffer' for details of HISTORY argument.")
- (prompt, initial_input, history, default_value)
+See `read-from-minibuffer' for details of HISTORY argument.\n\
+Fourth arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits\n\
+ the current input method and the setting of enable-multibyte-characters.")
+ (prompt, initial_input, history, default_value, inherit_input_method)
Lisp_Object prompt, initial_input, history, default_value;
+ Lisp_Object inherit_input_method;
{
return Fread_from_minibuffer (prompt, initial_input, Qnil,
- Qnil, history, default_value);
+ Qnil, history, default_value,
+ inherit_input_method);
}
-DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 2, 0,
+DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 3, 0,
"Args PROMPT and INIT, strings. Read a string from the terminal, not allowing blanks.\n\
-Prompt with PROMPT, and provide INIT as an initial value of the input string.")
- (prompt, init)
- Lisp_Object prompt, init;
+Prompt with PROMPT, and provide INIT as an initial value of the input string.\n\
+Third arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits\n\
+the current input method and the setting of enable-multibyte-characters.")
+ (prompt, init, inherit_input_method)
+ Lisp_Object prompt, init, inherit_input_method;
{
CHECK_STRING (prompt, 0);
if (! NILP (init))
CHECK_STRING (init, 1);
return read_minibuf (Vminibuffer_local_ns_map, init, prompt, Qnil,
- 0, Qminibuffer_history, make_number (0), Qnil, 0);
+ 0, Qminibuffer_history, make_number (0), Qnil, 0,
+ !NILP (inherit_input_method));
}
DEFUN ("read-command", Fread_command, Sread_command, 1, 2, 0,
(prompt, default_value)
Lisp_Object prompt, default_value;
{
- return Fintern (Fcompleting_read (prompt, Vobarray, Qcommandp, Qt,
- Qnil, Qnil, default_value),
- Qnil);
+ Lisp_Object name, default_string;
+
+ if (NILP (default_value))
+ default_string = Qnil;
+ else if (SYMBOLP (default_value))
+ default_string = XSYMBOL (default_value)->name;
+ else
+ default_string = default_value;
+
+ name = Fcompleting_read (prompt, Vobarray, Qcommandp, Qt,
+ Qnil, Qnil, default_string, Qnil);
+ if (NILP (name))
+ return name;
+ return Fintern (name, Qnil);
}
#ifdef NOTDEF
(prompt)
Lisp_Object prompt;
{
- return Fintern (Fcompleting_read (prompt, Vobarray, Qfboundp, Qt, Qnil, Qnil, Qnil),
+ return Fintern (Fcompleting_read (prompt, Vobarray, Qfboundp, Qt, Qnil, Qnil, Qnil, Qnil),
Qnil);
}
#endif /* NOTDEF */
(prompt, default_value)
Lisp_Object prompt, default_value;
{
- return Fintern (Fcompleting_read (prompt, Vobarray,
- Quser_variable_p, Qt,
- Qnil, Qnil, default_value),
- Qnil);
+ Lisp_Object name, default_string;
+
+ if (NILP (default_value))
+ default_string = Qnil;
+ else if (SYMBOLP (default_value))
+ default_string = XSYMBOL (default_value)->name;
+ else
+ default_string = default_value;
+
+ name = Fcompleting_read (prompt, Vobarray,
+ Quser_variable_p, Qt,
+ Qnil, Qnil, default_string, Qnil);
+ if (NILP (name))
+ return name;
+ return Fintern (name, Qnil);
}
DEFUN ("read-buffer", Fread_buffer, Sread_buffer, 1, 3, 0,
Lisp_Object prompt, def, require_match;
{
Lisp_Object tem;
- Lisp_Object args[3];
-
+ Lisp_Object args[4];
+
if (BUFFERP (def))
def = XBUFFER (def)->name;
- if (!NILP (def))
+
+ if (NILP (Vread_buffer_function))
{
- args[0] = build_string ("%s(default %s) ");
+ if (!NILP (def))
+ {
+ args[0] = build_string ("%s(default %s) ");
+ args[1] = prompt;
+ args[2] = def;
+ prompt = Fformat (3, args);
+ }
+
+ return Fcompleting_read (prompt, Vbuffer_alist, Qnil,
+ require_match, Qnil, Qnil, def, Qnil);
+ }
+ else
+ {
+ args[0] = Vread_buffer_function;
args[1] = prompt;
args[2] = def;
- prompt = Fformat (3, args);
+ args[3] = require_match;
+ return Ffuncall(4, args);
}
- return Fcompleting_read (prompt, Vbuffer_alist, Qnil,
- require_match, Qnil, Qnil, def);
}
\f
DEFUN ("try-completion", Ftry_completion, Stry_completion, 2, 3, 0,
for make-docfile to see. We cannot put this in the real DEFUN
due to limits in the Unix cpp.
-DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 7, 0,
+DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 8, 0,
"Read a string in the minibuffer, with completion.\n\
PROMPT is a string to prompt with; normally it ends in a colon and a space.\n\
TABLE is an alist whose elements' cars are strings, or an obarray.\n\
and HISTPOS is the initial position (the position in the list\n\
which INITIAL-CONTENTS corresponds to).\n\
Positions are counted starting from 1 at the beginning of the list.\n\
-DEF, if non-nil, is the default value.
-
+DEF, if non-nil, is the default value.\n\
+\n\
+If INHERIT-INPUT-METHOD is non-nil, the minibuffer inherits\n\
+ the current input method and the setting of enable-multibyte-characters.\n\
+\n\
Completion ignores case if the ambient value of\n\
`completion-ignore-case' is non-nil."
*/
-DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 7, 0,
+DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 8, 0,
0 /* See immediately above */)
- (prompt, table, predicate, require_match, init, hist, def)
+ (prompt, table, predicate, require_match, init, hist, def, inherit_input_method)
Lisp_Object prompt, table, predicate, require_match, init, hist, def;
+ Lisp_Object inherit_input_method;
{
Lisp_Object val, histvar, histpos, position;
int pos = 0;
int count = specpdl_ptr - specpdl;
+ struct gcpro gcpro1;
+ int disable_multibyte = EQ (table, Qread_file_name_internal);
+
+ GCPRO1 (def);
+
specbind (Qminibuffer_completion_table, table);
specbind (Qminibuffer_completion_predicate, predicate);
specbind (Qminibuffer_completion_confirm,
? Vminibuffer_local_completion_map
: Vminibuffer_local_must_match_map,
init, prompt, make_number (pos), 0,
- histvar, histpos, def, 0);
- if (STRINGP (val) && XSTRING (val)->size == 0 && ! NILP (def))
- val = def;
- return unbind_to (count, val);
+ histvar, histpos, def, 0,
+ !NILP (inherit_input_method));
+ RETURN_UNGCPRO (unbind_to (count, val));
}
\f
Lisp_Object Fminibuffer_completion_help ();
that has no possible completions, and other quick, unobtrusive
messages. */
+void
temp_echo_area_glyphs (m)
char *m;
{
return Qnil;
}
\f
+void
init_minibuf_once ()
{
Vminibuffer_list = Qnil;
staticpro (&Vminibuffer_list);
}
+void
syms_of_minibuf ()
{
minibuf_level = 0;
Qhistory_length = intern ("history-length");
staticpro (&Qhistory_length);
+ Qcurrent_input_method = intern ("current-input-method");
+ staticpro (&Qcurrent_input_method);
+
+ Qactivate_input_method = intern ("activate-input-method");
+ staticpro (&Qactivate_input_method);
+
+ DEFVAR_LISP ("read-buffer-function", &Vread_buffer_function,
+ "If this is non-nil, `read-buffer' does its work by calling this function.");
+ Vread_buffer_function = Qnil;
+
DEFVAR_LISP ("minibuffer-setup-hook", &Vminibuffer_setup_hook,
"Normal hook run just after entry to minibuffer.");
Vminibuffer_setup_hook = Qnil;
DEFVAR_BOOL ("enable-recursive-minibuffers", &enable_recursive_minibuffers,
"*Non-nil means to allow minibuffer commands while in the minibuffer.\n\
-More precisely, this variable makes a difference when the minibuffer window\n\
-is the selected window. If you are in some other window, minibuffer commands\n\
-are allowed even if a minibuffer is active.");
+This variable makes a difference whenever the minibuffer window is active.");
enable_recursive_minibuffers = 0;
DEFVAR_LISP ("minibuffer-completion-table", &Vminibuffer_completion_table,
defsubr (&Sminibuffer_message);
}
+void
keys_of_minibuf ()
{
initial_define_key (Vminibuffer_local_map, Ctl ('g'),