Mercurial > emacs
changeset 10940:40a1812dcbad
(current_prefix_partial): New var.
(Funiversal_argument): New function, formerly inlined in keyboard.c.
(Fnegative_argument, Fdigit_argument): Likewise.
(clear_prefix_arg): Moved here from keyboard.c.
Don't clear the internal state if we're still building a prefix arg.
(finalize_prefix_arg, describe_prefix_arg): Moved from keyboard.c.
(syms_of_callint): defsubr the new lisp-callable functions.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Wed, 08 Mar 1995 03:32:30 +0000 |
parents | d2971946a3d2 |
children | af873f542492 |
files | src/callint.c |
diffstat | 1 files changed, 105 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/src/callint.c Wed Mar 08 03:31:18 1995 +0000 +++ b/src/callint.c Wed Mar 08 03:32:30 1995 +0000 @@ -28,6 +28,7 @@ extern char *index (); +int current_prefix_partial; Lisp_Object Vprefix_arg, Vcurrent_prefix_arg, Qminus, Qplus; Lisp_Object Qcall_interactively; Lisp_Object Vcommand_history; @@ -47,6 +48,48 @@ /* Marker used within call-interactively to refer to point. */ static Lisp_Object point_marker; + +void +clear_prefix_arg () +{ + if (!current_perdisplay) + abort (); + Vprefix_arg = Qnil; + if (!current_prefix_partial) + { + current_perdisplay->prefix_factor = Qnil; + current_perdisplay->prefix_value = Qnil; + current_perdisplay->prefix_sign = 1; + current_perdisplay->prefix_partial = 0; + } +} + +void +finalize_prefix_arg () +{ + if (!NILP (current_perdisplay->prefix_factor)) + Vprefix_arg = Fcons (current_perdisplay->prefix_factor, Qnil); + else if (NILP (current_perdisplay->prefix_value)) + Vprefix_arg = (current_perdisplay->prefix_sign > 0 ? Qnil : Qminus); + else if (current_perdisplay->prefix_sign > 0) + Vprefix_arg = current_perdisplay->prefix_value; + else + XSETINT (Vprefix_arg, -XINT (current_perdisplay->prefix_value)); + current_perdisplay->prefix_partial = 0; +} + +static void +describe_prefix_arg () +{ + if (INTEGERP (Vprefix_arg)) + message ("Arg: %d", Vprefix_arg); + else if (CONSP (Vprefix_arg)) + message ("Arg: [%d]", XCONS (Vprefix_arg)->car); + else if (EQ (Vprefix_arg, Qminus)) + message ("Arg: -"); +} + + /* This comment supplies the doc string for interactive, for make-docfile to see. We cannot put this in the real DEFUN due to limits in the Unix cpp. @@ -652,6 +695,65 @@ return val; } +DEFUN ("universal-argument", Funiversal_argument, Suniversal_argument, 0, 0, "", + "Begin a numeric argument for the following command.\n\ +Digits or minus sign following \\[universal-argument] make up the numeric argument.\n\ +\\[universal-argument] following the digits or minus sign ends the argument.\n\ +\\[universal-argument] without digits or minus sign provides 4 as argument.\n\ +Repeating \\[universal-argument] without digits or minus sign\n\ + multiplies the argument by 4 each time.") + () +{ + if (!current_prefix_partial) + { + /* First C-u */ + XSETFASTINT (current_perdisplay->prefix_factor, 4); + current_perdisplay->prefix_value = Qnil; + current_perdisplay->prefix_sign = 1; + current_perdisplay->prefix_partial = 1; + } + else if (!NILP (current_perdisplay->prefix_factor)) + { + /* Subsequent C-u */ + XSETINT (current_perdisplay->prefix_factor, + XINT (current_perdisplay->prefix_factor) * 4); + current_perdisplay->prefix_partial = 1; + } + else + { + /* Terminating C-u */ + finalize_prefix_arg (); + describe_prefix_arg (); + } +} + +DEFUN ("negative-argument", Fnegative_argument, Snegative_argument, 0, 0, "", + "Begin a negative numeric argument for the next command.\n\ +\\[universal-argument] following digits or minus sign ends the argument.") + () +{ + current_perdisplay->prefix_factor = Qnil; + current_perdisplay->prefix_sign *= -1; + current_perdisplay->prefix_partial = 1; +} + +DEFUN ("digit-argument", Fdigit_argument, Sdigit_argument, 0, 0, "", + "Part of the numeric argument for the next command.\n\ +\\[universal-argument] following digits or minus sign ends the argument.") + () +{ + int c; + if (!(INTEGERP (last_command_char) + && (c = (XINT (last_command_char) & 0177)) >= '0' && c <= '9')) + error("digit-argument must be bound to a digit key"); + current_perdisplay->prefix_factor = Qnil; + if (NILP (current_perdisplay->prefix_value)) + XSETFASTINT (current_perdisplay->prefix_value, 0); + XSETINT (current_perdisplay->prefix_value, + XINT (current_perdisplay->prefix_value) * 10 + (c - '0')); + current_perdisplay->prefix_partial = 1; +} + syms_of_callint () { point_marker = Fmake_marker (); @@ -732,4 +834,7 @@ defsubr (&Sinteractive); defsubr (&Scall_interactively); defsubr (&Sprefix_numeric_value); + defsubr (&Suniversal_argument); + defsubr (&Snegative_argument); + defsubr (&Sdigit_argument); }