Mercurial > emacs
changeset 864:fe5f6b7c9727
*** empty log message ***
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Fri, 24 Jul 1992 08:17:31 +0000 |
parents | 427299469901 |
children | 637812e90946 |
files | lisp/comint.el lisp/progmodes/compile.el lisp/replace.el lisp/simple.el src/minibuf.c |
diffstat | 5 files changed, 189 insertions(+), 55 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/comint.el Fri Jul 24 07:15:18 1992 +0000 +++ b/lisp/comint.el Fri Jul 24 08:17:31 1992 +0000 @@ -538,8 +538,8 @@ "Searches backwards through input history for substring match." (interactive (let* ((last-command last-command) ; preserve around r-f-m (s (read-from-minibuffer - (format "Command substring (default %s): " - comint-last-input-match)))) + (format "Command substring (default %s): " + comint-last-input-match)))) (list (if (string= s "") comint-last-input-match s)))) ; (interactive "sCommand substring: ") (setq comint-last-input-match str) ; update default
--- a/lisp/progmodes/compile.el Fri Jul 24 07:15:18 1992 +0000 +++ b/lisp/progmodes/compile.el Fri Jul 24 08:17:31 1992 +0000 @@ -139,12 +139,6 @@ (concat \"make -k \" buffer-file-name))))))") -;;;###autoload -(defvar grep-command "grep -n " - "Last shell command used to do a grep search; default for next search. -Typically \"grep -n\" or \"egrep -n\". -\(The \"-n\" option tells grep to output line numbers.)") - (defconst compilation-enter-directory-regexp ": Entering directory `\\(.*\\)'$" "Regular expression for a line in the compilation log that @@ -169,6 +163,11 @@ \`compilation-leave-directory-regexp'. The head element is the directory the compilation was started in.") +;; History of compile commands. +(defvar compile-history nil) +;; History of grep commands. +(defvar grep-history nil) + ;;;###autoload (defun compile (command) "Compile the program including the current buffer. Default: run `make'. @@ -185,7 +184,9 @@ The name used for the buffer is actually whatever is returned by the function in `compilation-buffer-name-function', so you can set that to a function that generates a unique name." - (interactive (list (read-string "Compile command: " compile-command))) + (interactive (list (read-from-minibuffer "Compile command: " + compile-command nil + '(compile-history . 1)))) (setq compile-command command) (save-some-buffers nil nil) (compile-internal compile-command "No more errors")) @@ -196,26 +197,12 @@ While grep runs asynchronously, you can use the \\[next-error] command to find the text that grep hits refer to. -The variable `grep-command' holds the last grep command run, -and is the default for future runs. The command should use the `-n' -flag, so that line numbers are displayed for each match. -What the user enters in response to the prompt for grep args is -appended to everything up to and including the `-n' in `grep-command'." +This command uses a special history list for its arguments, so you can +easily repeat a grep command." (interactive - (list (read-string (concat "Run " - (substring grep-command 0 - (string-match "[\t ]+" grep-command)) - " (with args): ") - (progn - (string-match "-n[\t ]+" grep-command) - (substring grep-command (match-end 0)))))) - ;; why a redundant string-match? It might not be interactive ... - (setq grep-command (concat (substring grep-command 0 - (progn - (string-match "-n" grep-command) - (match-end 0))) - " " command-args)) - (compile-internal (concat grep-command " /dev/null") + (list (read-from-minibuffer "Run grep (like this): " + "grep -n " nil nil 'grep-history))) + (compile-internal (concat command-args " /dev/null") "No more grep hits" "grep")) (defun compile-internal (command error-message
--- a/lisp/replace.el Fri Jul 24 07:15:18 1992 +0000 +++ b/lisp/replace.el Fri Jul 24 08:17:31 1992 +0000 @@ -23,6 +23,18 @@ (defconst case-replace t "\ *Non-nil means query-replace should preserve case in replacements.") +(defvar query-replace-history nil) + +(defun query-replace-read-args (string) + (let (from to) + (setq from (read-from-minibuffer (format "%s: " string) + nil nil nil + 'query-replace-history)) + (setq to (read-from-minibuffer (format "%s %s with: " string from) + nil nil nil + 'query-replace-history)) + (list from to current-prefix-arg))) + (defun query-replace (from-string to-string &optional arg) "Replace some occurrences of FROM-STRING with TO-STRING. As each match is found, the user must type a character saying @@ -32,7 +44,7 @@ are non-nil and FROM-STRING has no uppercase letters. Third arg DELIMITED (prefix arg if interactive) non-nil means replace only matches surrounded by word boundaries." - (interactive "sQuery replace: \nsQuery replace %s with: \nP") + (interactive (query-replace-read-args "Query replace")) (perform-replace from-string to-string t nil arg) (message "Done")) (define-key esc-map "%" 'query-replace) @@ -48,7 +60,7 @@ only matches surrounded by word boundaries. In TO-STRING, \\& means insert what matched REGEXP, and \\=\\<n> means insert what matched <n>th \\(...\\) in REGEXP." - (interactive "sQuery replace regexp: \nsQuery replace regexp %s with: \nP") + (interactive (query-replace-read-args "Query replace regexp")) (perform-replace regexp to-string t t arg) (message "Done")) @@ -63,7 +75,17 @@ A prefix argument N says to use each replacement string N times before rotating to the next." - (interactive "sMap query replace (regexp): \nsQuery replace %s with (space-separated strings): \nP") + (interactive + (let (from to) + (setq from (read-from-minibuffer "Map query replace (regexp): " + nil nil nil + 'query-replace-history)) + (setq to (read-from-minibuffer + (format "Query replace %s with (space-separated strings): " + from) + nil nil nil + 'query-replace-history)) + (list from to current-prefix-arg))) (let (replacements) (if (listp to-strings) (setq replacements to-strings) @@ -92,7 +114,7 @@ (while (search-forward OLD-STRING nil t) (replace-match REPLACEMENT nil t)) which will run faster and will not set the mark or print anything." - (interactive "sReplace string: \nsReplace string %s with: \nP") + (interactive (query-replace-read-args "Replace string")) (perform-replace from-string to-string nil nil delimited) (message "Done")) @@ -110,7 +132,7 @@ (while (re-search-forward REGEXP nil t) (replace-match REPLACEMENT nil nil)) which will run faster and will not set the mark or print anything." - (interactive "sReplace regexp: \nsReplace regexp %s with: \nP") + (interactive (query-replace-read-args "Replace regexp")) (perform-replace regexp to-string nil t delimited) (message "Done"))
--- a/lisp/simple.el Fri Jul 24 07:15:18 1992 +0000 +++ b/lisp/simple.el Fri Jul 24 08:17:31 1992 +0000 @@ -391,7 +391,9 @@ (setq newcmd (read-from-minibuffer "Redo: " (prin1-to-string elt) minibuffer-local-map - t)) + t + (cons 'command-history + arg))) ;; If command to be redone does not match front of history, ;; add it to the history. (or (equal newcmd (car command-history)) @@ -415,7 +417,7 @@ (insert (if minibuffer-history-sexp-flag (prin1-to-string elt) - elt)))) + elt))) (goto-char (point-min))))) (defun previous-history-element (n)
--- a/src/minibuf.c Fri Jul 24 07:15:18 1992 +0000 +++ b/src/minibuf.c Fri Jul 24 08:17:31 1992 +0000 @@ -41,6 +41,8 @@ int prompt_width; Lisp_Object help_form; Lisp_Object current_prefix_arg; + Lisp_Object history_position; + Lisp_Object history_variable; }; int minibuf_save_vector_size; @@ -63,6 +65,16 @@ Lisp_Object Vminibuffer_help_form; +/* Variable which is the history list to add minibuffer values to. */ + +Lisp_Object Vminibuffer_history_variable; + +/* Current position in the history list (adjusted by M-n and M-p). */ + +Lisp_Object Vminibuffer_history_position; + +Lisp_Object Qminibuffer_history; + /* Nonzero means completion ignores case. */ int completion_ignore_case; @@ -81,13 +93,23 @@ Lisp_Object get_minibuffer (); Lisp_Object read_minibuf (); +/* Read from the minibuffer using keymap MAP, initial contents INITIAL + (a string), putting point BACKUP_N chars from the end of INITIAL, + prompting with PROMPT (a string), using history list HISTVAR + with initial position HISTPOS. + + Normally return the result as a string (the text that was read), + but if EXPFLAG is non-nil, read it and return the object read. */ + Lisp_Object -read_minibuf (map, initial, prompt, backup_n, expflag) +read_minibuf (map, initial, prompt, backup_n, expflag, histvar, histpos) Lisp_Object map; Lisp_Object initial; Lisp_Object prompt; Lisp_Object backup_n; int expflag; + Lisp_Object histvar; + Lisp_Object histpos; { register Lisp_Object val; int count = specpdl_ptr - specpdl; @@ -121,6 +143,8 @@ /* >> Why is this done this way rather than binding these variables? */ minibuf_save_vector[minibuf_level].help_form = Vhelp_form; minibuf_save_vector[minibuf_level].current_prefix_arg = Vcurrent_prefix_arg; + minibuf_save_vector[minibuf_level].history_position = Vminibuffer_history_position; + minibuf_save_vector[minibuf_level].history_variable = Vminibuffer_history_variable; GCPRO2 (minibuf_save_vector[minibuf_level].help_form, minibuf_save_vector[minibuf_level].current_prefix_arg); @@ -180,6 +204,8 @@ Vhelp_form = Vminibuffer_help_form; current_buffer->keymap = map; + Vminibuffer_history_position = histpos; + Vminibuffer_history_variable = histvar; /* ??? MCC did redraw_screen here if switching screens. */ recursive_edit_1 (); @@ -197,13 +223,19 @@ /* Make minibuffer contents into a string */ val = make_buffer_string (1, Z); bcopy (GAP_END_ADDR, XSTRING (val)->data + GPT - BEG, Z - GPT); + + /* Add the value to the appropriate history list. */ + if (XTYPE (Vminibuffer_history_variable) == Lisp_Symbol + && XSYMBOL (Vminibuffer_history_variable)->value != Qunbound) + Fset (Vminibuffer_history_variable, + Fcons (val, Fsymbol_value (Vminibuffer_history_variable))); + unbind_to (count, Qnil); /* The appropriate frame will get selected in set-window-configuration. */ UNGCPRO; /* VAL is the string of minibuffer text. */ - last_minibuf_string = val; /* If Lisp form desired instead of string, parse it */ @@ -270,6 +302,10 @@ minibuf_prompt_width = minibuf_save_vector[minibuf_level].prompt_width; Vhelp_form = minibuf_save_vector[minibuf_level].help_form; Vcurrent_prefix_arg = minibuf_save_vector[minibuf_level].current_prefix_arg; + Vminibuffer_history_position + = minibuf_save_vector[minibuf_level].history_position; + Vminibuffer_history_variable + = minibuf_save_vector[minibuf_level].history_variable; #ifdef MULTI_FRAME /* Redirect the focus of the frame that called the minibuffer. */ @@ -282,21 +318,36 @@ "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\ + If INITIAL-CONTENTS is (STRING . POSITION), the initial input\n\ + is STRING, but point is placed POSITION characters into the string.\n\ Third arg KEYMAP is a keymap to use whilst reading;\n\ if omitted or nil, the default is `minibuffer-local-map'.\n\ If fourth arg READ is non-nil, then interpret the result as a lisp object\n\ and return that object:\n\ in other words, do `(car (read-from-string INPUT-STRING))'\n\ -Fifth arg POSITION, if non-nil, is where to put point\n\ - in the minibuffer after inserting INITIAL-CONTENTS.") - (prompt, initial_input, keymap, read, position) - Lisp_Object prompt, initial_input, keymap, read, position; +Fifth arg HIST, if non-nil, specifies a history list\n\ + and optionally the initial position in the list.\n\ + It can be a symbol, which is the history list variable to use,\n\ + or it can be a cons cell (HISTVAR . HISTPOS).\n\ + In that case, HISTVAR is the history list variable to use,\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.") + (prompt, initial_input, keymap, read, hist) + Lisp_Object prompt, initial_input, keymap, read, hist; { int pos = 0; + Lisp_Object histvar, histpos, position; + position = Qnil; CHECK_STRING (prompt, 0); if (!NILP (initial_input)) { + if (XTYPE (initial_input) == Lisp_Cons) + { + position = Fcdr (initial_input); + initial_input = Fcar (initial_input); + } CHECK_STRING (initial_input, 1); if (!NILP (position)) { @@ -310,8 +361,24 @@ keymap = Vminibuffer_local_map; else keymap = get_keymap (keymap,2); + + if (XTYPE (hist) == Lisp_Symbol) + { + histvar = hist; + histpos = Qnil; + } + else + { + histvar = Fcar_safe (hist); + histpos = Fcdr_safe (hist); + } + if (NILP (histvar)) + histvar = Qminibuffer_history; + if (NILP (histpos)) + XFASTINT (histpos) = 0; + return read_minibuf (keymap, initial_input, prompt, - pos, !NILP (read)); + pos, !NILP (read), histvar, histpos); } DEFUN ("read-minibuffer", Fread_minibuffer, Sread_minibuffer, 1, 2, 0, @@ -324,7 +391,8 @@ CHECK_STRING (prompt, 0); if (!NILP (initial_contents)) CHECK_STRING (initial_contents, 1) - return read_minibuf (Vminibuffer_local_map, initial_contents, prompt, Qnil, 1); + return read_minibuf (Vminibuffer_local_map, initial_contents, + prompt, Qnil, 1, Qminibuffer_history, make_number (0)); } DEFUN ("eval-minibuffer", Feval_minibuffer, Seval_minibuffer, 1, 2, 0, @@ -358,7 +426,8 @@ if (! NILP (init)) CHECK_STRING (init, 1); - return read_minibuf (Vminibuffer_local_ns_map, init, prompt, Qnil, 0); + return read_minibuf (Vminibuffer_local_ns_map, init, prompt, Qnil, 0, + Qminibuffer_history, make_number (0)); } DEFUN ("read-command", Fread_command, Sread_command, 1, 1, 0, @@ -732,7 +801,7 @@ DEFUN ("completing-read", Fcompleting_read, Scompleting_read, 2, 6, 0, "Read a string in the minibuffer, with completion.\n\ -Args: PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, BACKUP-N.\n\ +Args: PROMPT, TABLE, PREDICATE, REQUIRE-MATCH, INITIAL-INPUT, HIST.\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\ PREDICATE limits completion to a subset of TABLE.\n\ @@ -741,25 +810,67 @@ the input is (or completes to) an element of TABLE.\n\ If it is also not t, Return does not exit if it does non-null completion.\n\ If INITIAL-INPUT is non-nil, insert it in the minibuffer initially.\n\ -Case is ignored if ambient value of `completion-ignore-case' is non-nil.\n\ -If BACKUP-N is specified, point should be placed that many spaces from\n\ -the end of the buffer. This is useful when providing default values,\n\ -because you can put point before the last component of a filename or any\n\ -other component that is likely to be deleted.") - (prompt, table, pred, require_match, init, backup_n) - Lisp_Object prompt, table, pred, require_match, init, backup_n; + If it is (STRING . POSITION), the initial input\n\ + is STRING, but point is placed POSITION characters into the string.\n\ +HIST, if non-nil, specifies a history list\n\ + and optionally the initial position in the list.\n\ + It can be a symbol, which is the history list variable to use,\n\ + or it can be a cons cell (HISTVAR . HISTPOS).\n\ + In that case, HISTVAR is the history list variable to use,\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\ +Completion ignores case if the ambient value of\n\ + `completion-ignore-case' is non-nil.") + (prompt, table, pred, require_match, init, hist) + Lisp_Object prompt, table, pred, require_match, init, hist; { - Lisp_Object val; + Lisp_Object val, histvar, histpos, position; + int pos = 0; int count = specpdl_ptr - specpdl; specbind (Qminibuffer_completion_table, table); specbind (Qminibuffer_completion_predicate, pred); specbind (Qminibuffer_completion_confirm, EQ (require_match, Qt) ? Qnil : Qt); last_exact_completion = Qnil; + + position = Qnil; + if (!NILP (init)) + { + if (XTYPE (init) == Lisp_Cons) + { + position = Fcdr (init); + init = Fcar (init); + } + CHECK_STRING (init, 0); + if (!NILP (position)) + { + CHECK_NUMBER (position, 0); + /* Convert to distance from end of input. */ + pos = XINT (position) - 1 - XSTRING (init)->size; + } + } + + if (XTYPE (hist) == Lisp_Symbol) + { + histvar = hist; + histpos = Qnil; + } + else + { + histvar = Fcar_safe (hist); + histpos = Fcdr_safe (hist); + } + if (NILP (histvar)) + histvar = Qminibuffer_history; + if (NILP (histpos)) + XFASTINT (histpos) = 0; + val = read_minibuf (NILP (require_match) ? Vminibuffer_local_completion_map : Vminibuffer_local_must_match_map, - init, prompt, backup_n, 0); + init, prompt, pos, 0, + histvar, histpos); return unbind_to (count, val); } @@ -1252,7 +1363,8 @@ Quser_variable_p = intern ("user-variable-p"); staticpro (&Quser_variable_p); - + Qminibuffer_history = intern ("minibuffer-history"); + staticpro (&Qminibuffer_history); DEFVAR_BOOL ("completion-auto-help", &auto_help, "*Non-nil means automatically provide help for invalid completion input."); @@ -1295,6 +1407,17 @@ "Value that `help-form' takes on inside the minibuffer."); Vminibuffer_help_form = Qnil; + DEFVAR_LISP ("minibuffer-history-variable", &Vminibuffer_history_variable, + "History list symbol to add minibuffer values to.\n\ +Each minibuffer output is added with\n\ + (set minibuffer-history-variable\n\ + (cons STRING (symbol-value minibuffer-history-variable)))"); + XFASTINT (Vminibuffer_history_variable) = 0; + + DEFVAR_LISP ("minibuffer-history-position", &Vminibuffer_history_position, + "Current position of redoing in the history list."); + Vminibuffer_history_position = Qnil; + defsubr (&Sread_from_minibuffer); defsubr (&Seval_minibuffer); defsubr (&Sread_minibuffer);