X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/a89654f8f34114db543cb91363e8fded6d73e986..56adbe62a5c90ec0935d751fa311d41eb6d86a39:/src/minibuf.c diff --git a/src/minibuf.c b/src/minibuf.c index c3a49bff0a..4b9c0a32f8 100644 --- a/src/minibuf.c +++ b/src/minibuf.c @@ -25,6 +25,7 @@ along with GNU Emacs. If not, see . */ #include "lisp.h" #include "commands.h" +#include "character.h" #include "buffer.h" #include "dispextern.h" #include "keyboard.h" @@ -72,7 +73,7 @@ Lisp_Object Qcompletion_ignore_case; static Lisp_Object Qminibuffer_completion_table; static Lisp_Object Qminibuffer_completion_predicate; static Lisp_Object Qminibuffer_completion_confirm; -static Lisp_Object Quser_variable_p; +static Lisp_Object Qcustom_variable_p; static Lisp_Object Qminibuffer_default; @@ -101,23 +102,23 @@ choose_minibuf_frame (void) { if (FRAMEP (selected_frame) && FRAME_LIVE_P (XFRAME (selected_frame)) - && !EQ (minibuf_window, XFRAME (selected_frame)->minibuffer_window)) + && !EQ (minibuf_window, FVAR (XFRAME (selected_frame), minibuffer_window))) { struct frame *sf = XFRAME (selected_frame); Lisp_Object buffer; /* I don't think that any frames may validly have a null minibuffer window anymore. */ - if (NILP (sf->minibuffer_window)) + if (NILP (FVAR (sf, minibuffer_window))) abort (); /* Under X, we come here with minibuf_window being the minibuffer window of the unused termcap window created in init_window_once. That window doesn't have a buffer. */ - buffer = XWINDOW (minibuf_window)->buffer; + buffer = WVAR (XWINDOW (minibuf_window), buffer); if (BUFFERP (buffer)) - Fset_window_buffer (sf->minibuffer_window, buffer, Qnil); - minibuf_window = sf->minibuffer_window; + Fset_window_buffer (FVAR (sf, minibuffer_window), buffer, Qnil); + minibuf_window = FVAR (sf, minibuffer_window); } /* Make sure no other frame has a minibuffer as its selected window, @@ -247,7 +248,7 @@ read_minibuf_noninteractive (Lisp_Object map, Lisp_Object initial, val = Qnil; size = 100; len = 0; - line = (char *) xmalloc (size); + line = xmalloc (size); while ((c = getchar ()) != '\n') { @@ -423,8 +424,8 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, { if (CONSP (initial)) { - Lisp_Object backup_n = Fcdr (initial); - initial = Fcar (initial); + Lisp_Object backup_n = XCDR (initial); + initial = XCAR (initial); CHECK_STRING (initial); if (!NILP (backup_n)) { @@ -611,7 +612,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, FOR_EACH_FRAME (dummy, frame) { Lisp_Object root_window = Fframe_root_window (frame); - Lisp_Object mini_window = XWINDOW (root_window)->next; + Lisp_Object mini_window = WVAR (XWINDOW (root_window), next); if (! NILP (mini_window) && ! EQ (mini_window, minibuf_window) && !NILP (Fwindow_minibuffer_p (mini_window))) @@ -621,7 +622,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, /* Display this minibuffer in the proper window. */ Fset_window_buffer (minibuf_window, Fcurrent_buffer (), Qnil); Fselect_window (minibuf_window, Qnil); - XSETFASTINT (XWINDOW (minibuf_window)->hscroll, 0); + XWINDOW (minibuf_window)->hscroll = 0; Fmake_local_variable (Qprint_escape_newlines); print_escape_newlines = 1; @@ -686,7 +687,7 @@ read_minibuf (Lisp_Object map, Lisp_Object initial, Lisp_Object prompt, XWINDOW (minibuf_window)->must_be_updated_p = 1; update_frame (XFRAME (selected_frame), 1, 1); { - struct frame *f = XFRAME (XWINDOW (minibuf_window)->frame); + struct frame *f = XFRAME (WVAR (XWINDOW (minibuf_window), frame)); struct redisplay_interface *rif = FRAME_RIF (f); if (rif && rif->flush_display) rif->flush_display (f); @@ -791,8 +792,8 @@ get_minibuffer (EMACS_INT depth) buf = Fcar (tail); if (NILP (buf) || NILP (BVAR (XBUFFER (buf), name))) { - sprintf (name, " *Minibuf-%"pI"d*", depth); - buf = Fget_buffer_create (build_string (name)); + buf = Fget_buffer_create + (make_formatted_string (name, " *Minibuf-%"pI"d*", depth)); /* Although the buffer's name starts with a space, undo should be enabled in it. */ @@ -803,10 +804,9 @@ get_minibuffer (EMACS_INT depth) else { ptrdiff_t count = SPECPDL_INDEX (); - /* `reset_buffer' blindly sets the list of overlays to NULL, so we - have to empty the list, otherwise we end up with overlays that - think they belong to this buffer while the buffer doesn't know about - them any more. */ + /* We have to empty both overlay lists. Otherwise we end + up with overlays that think they belong to this buffer + while the buffer doesn't know about them any more. */ delete_all_overlays (XBUFFER (buf)); reset_buffer (XBUFFER (buf)); record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); @@ -844,7 +844,7 @@ read_minibuf_unwind (Lisp_Object data) window = minibuf_window; /* To keep things predictable, in case it matters, let's be in the minibuffer when we reset the relevant variables. */ - Fset_buffer (XWINDOW (window)->buffer); + Fset_buffer (WVAR (XWINDOW (window), buffer)); /* Restore prompt, etc, from outer minibuffer level. */ minibuf_prompt = Fcar (minibuf_save_list); @@ -887,8 +887,8 @@ read_minibuf_unwind (Lisp_Object data) /* 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); + XWINDOW (window)->last_modified = 0; + XWINDOW (window)->last_overlay_modified = 0; /* In case the previous minibuffer displayed in this miniwindow is dead, we may keep displaying this buffer (tho it's inactive), so reset it, @@ -1034,12 +1034,20 @@ Fifth arg INHERIT-INPUT-METHOD, if non-nil, means the minibuffer inherits (Lisp_Object prompt, Lisp_Object initial_input, Lisp_Object history, Lisp_Object default_value, Lisp_Object inherit_input_method) { Lisp_Object val; + ptrdiff_t count = SPECPDL_INDEX (); + + /* Just in case we're in a recursive minibuffer, make it clear that the + previous minibuffer's completion table does not apply to the new + minibuffer. + FIXME: `minibuffer-completion-table' should be buffer-local instead. */ + specbind (Qminibuffer_completion_table, Qnil); + val = Fread_from_minibuffer (prompt, initial_input, Qnil, Qnil, history, default_value, inherit_input_method); if (STRINGP (val) && SCHARS (val) == 0 && ! NILP (default_value)) val = CONSP (default_value) ? XCAR (default_value) : default_value; - return val; + return unbind_to (count, val); } DEFUN ("read-no-blanks-input", Fread_no_blanks_input, Sread_no_blanks_input, 1, 3, 0, @@ -1094,10 +1102,11 @@ Prompt with PROMPT. */) #endif /* NOTDEF */ DEFUN ("read-variable", Fread_variable, Sread_variable, 1, 2, 0, - doc: /* Read the name of a user variable and return it as a symbol. + doc: /* Read the name of a user option and return it as a symbol. 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. */) +A user option, or customizable variable, is one for which +`custom-variable-p' returns non-nil. */) (Lisp_Object prompt, Lisp_Object default_value) { Lisp_Object name, default_string; @@ -1110,7 +1119,7 @@ A user variable is one for which `user-variable-p' returns non-nil. */) default_string = default_value; name = Fcompleting_read (prompt, Vobarray, - Quser_variable_p, Qt, + Qcustom_variable_p, Qt, Qnil, Qnil, default_string, Qnil); if (NILP (name)) return name; @@ -1264,7 +1273,7 @@ is used to further constrain the set of candidates. */) { collection = check_obarray (collection); obsize = ASIZE (collection); - bucket = XVECTOR (collection)->contents[idx]; + bucket = AREF (collection, idx); } while (1) @@ -1299,7 +1308,7 @@ is used to further constrain the set of candidates. */) break; else { - bucket = XVECTOR (collection)->contents[idx]; + bucket = AREF (collection, idx); continue; } } @@ -1527,7 +1536,7 @@ with a space are ignored unless STRING itself starts with a space. */) { collection = check_obarray (collection); obsize = ASIZE (collection); - bucket = XVECTOR (collection)->contents[idx]; + bucket = AREF (collection, idx); } while (1) @@ -1562,7 +1571,7 @@ with a space are ignored unless STRING itself starts with a space. */) break; else { - bucket = XVECTOR (collection)->contents[idx]; + bucket = AREF (collection, idx); continue; } } @@ -1725,8 +1734,6 @@ See also `completing-read-function'. */) return Ffuncall (9, args); } -Lisp_Object Fassoc_string (register Lisp_Object key, Lisp_Object list, Lisp_Object case_fold); - /* Test whether TXT is an exact completion. */ DEFUN ("test-completion", Ftest_completion, Stest_completion, 2, 3, 0, doc: /* Return non-nil if STRING is a valid completion. @@ -1772,7 +1779,7 @@ the values STRING, PREDICATE and `lambda'. */) { for (i = ASIZE (collection) - 1; i >= 0; i--) { - tail = XVECTOR (collection)->contents[i]; + tail = AREF (collection, i); if (SYMBOLP (tail)) while (1) { @@ -1975,11 +1982,11 @@ syms_of_minibuf (void) staticpro (&last_minibuf_string); last_minibuf_string = Qnil; - DEFSYM (Quser_variable_p, "user-variable-p"); DEFSYM (Qminibuffer_history, "minibuffer-history"); DEFSYM (Qbuffer_name_history, "buffer-name-history"); Fset (Qbuffer_name_history, Qnil); + DEFSYM (Qcustom_variable_p, "custom-variable-p"); DEFSYM (Qminibuffer_setup_hook, "minibuffer-setup-hook"); DEFSYM (Qminibuffer_exit_hook, "minibuffer-exit-hook"); DEFSYM (Qhistory_length, "history-length");