diff options
author | Richard M. Stallman <rms@gnu.org> | 1995-10-27 21:55:33 +0000 |
---|---|---|
committer | Richard M. Stallman <rms@gnu.org> | 1995-10-27 21:55:33 +0000 |
commit | 5765d8295738494fe1cfe1820497482ec24905e7 (patch) | |
tree | cd5b265ecbd0f7bd13b3d005daaa51e2e08b1ff0 /src/callint.c | |
parent | c92764fcfd744e143656e6a2b2ec954e6be3de04 (diff) | |
download | emacs-5765d8295738494fe1cfe1820497482ec24905e7.tar.gz |
(Fcall_interactively): New arg KEYS.
Diffstat (limited to 'src/callint.c')
-rw-r--r-- | src/callint.c | 30 |
1 files changed, 19 insertions, 11 deletions
diff --git a/src/callint.c b/src/callint.c index 5368ba84cf7..7519d42521d 100644 --- a/src/callint.c +++ b/src/callint.c @@ -164,7 +164,7 @@ check_mark () } -DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 2, 0, +DEFUN ("call-interactively", Fcall_interactively, Scall_interactively, 1, 3, 0, "Call FUNCTION, reading args according to its interactive calling specs.\n\ Return the value FUNCTION returns.\n\ The function contains a specification of how to do the argument reading.\n\ @@ -175,8 +175,8 @@ See `interactive'.\n\ Optional second arg RECORD-FLAG non-nil\n\ means unconditionally put this command in the command-history.\n\ Otherwise, this is done only if an arg is read using the minibuffer.") - (function, record) - Lisp_Object function, record; + (function, record, keys) + Lisp_Object function, record, keys; { Lisp_Object *args, *visargs; unsigned char **argstrings; @@ -206,6 +206,15 @@ Otherwise, this is done only if an arg is read using the minibuffer.") char *tem1; int arg_from_tty = 0; struct gcpro gcpro1, gcpro2, gcpro3, gcpro4; + int key_count; + + if (NILP (keys)) + keys = this_command_keys, key_count = this_command_key_count; + else + { + CHECK_VECTOR (keys, 3); + key_count = XVECTOR (keys)->size; + } /* Save this now, since use of minibuffer will clobber it. */ prefix_arg = Vcurrent_prefix_arg; @@ -322,9 +331,8 @@ Otherwise, this is done only if an arg is read using the minibuffer.") /* Here if function specifies a string to control parsing the defaults */ /* Set next_event to point to the first event with parameters. */ - for (next_event = 0; next_event < this_command_key_count; next_event++) - if (EVENT_HAS_PARAMETERS - (XVECTOR (this_command_keys)->contents[next_event])) + for (next_event = 0; next_event < key_count; next_event++) + if (EVENT_HAS_PARAMETERS (XVECTOR (keys)->contents[next_event])) break; /* Handle special starting chars `*' and `@'. Also `-'. */ @@ -346,7 +354,7 @@ Otherwise, this is done only if an arg is read using the minibuffer.") { Lisp_Object event; - event = XVECTOR (this_command_keys)->contents[next_event]; + event = XVECTOR (keys)->contents[next_event]; if (EVENT_HAS_PARAMETERS (event) && (event = XCONS (event)->cdr, CONSP (event)) && (event = XCONS (event)->car, CONSP (event)) @@ -509,18 +517,18 @@ Otherwise, this is done only if an arg is read using the minibuffer.") break; case 'e': /* The invoking event. */ - if (next_event >= this_command_key_count) + if (next_event >= key_count) error ("%s must be bound to an event with parameters", (SYMBOLP (function) ? (char *) XSYMBOL (function)->name->data : "command")); - args[i] = XVECTOR (this_command_keys)->contents[next_event++]; + args[i] = XVECTOR (keys)->contents[next_event++]; varies[i] = -1; /* Find the next parameterized event. */ - while (next_event < this_command_key_count + while (next_event < key_count && ! (EVENT_HAS_PARAMETERS - (XVECTOR (this_command_keys)->contents[next_event]))) + (XVECTOR (keys)->contents[next_event]))) next_event++; break; |