Annotation of GNUtools/emacs/src/macros.c, revision 1.1

1.1     ! root        1: /* Keyboard macros.
        !             2:    Copyright (C) 1985, 1986 Free Software Foundation, Inc.
        !             3: 
        !             4: This file is part of GNU Emacs.
        !             5: 
        !             6: GNU Emacs is free software; you can redistribute it and/or modify
        !             7: it under the terms of the GNU General Public License as published by
        !             8: the Free Software Foundation; either version 1, or (at your option)
        !             9: any later version.
        !            10: 
        !            11: GNU Emacs is distributed in the hope that it will be useful,
        !            12: but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            14: GNU General Public License for more details.
        !            15: 
        !            16: You should have received a copy of the GNU General Public License
        !            17: along with GNU Emacs; see the file COPYING.  If not, write to
        !            18: the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
        !            19: 
        !            20: 
        !            21: #include "config.h"
        !            22: #include "lisp.h"
        !            23: #include "macros.h"
        !            24: #include "commands.h"
        !            25: #include "buffer.h"
        !            26: #include "window.h"
        !            27: 
        !            28: int defining_kbd_macro;
        !            29: 
        !            30: char *kbd_macro_buffer;
        !            31: char *kbd_macro_ptr;
        !            32: char *kbd_macro_end;
        !            33: int kbd_macro_bufsize;
        !            34: Lisp_Object Vlast_kbd_macro;
        !            35: 
        !            36: Lisp_Object Vexecuting_macro;
        !            37: int executing_macro_index;
        !            38: 
        !            39: Lisp_Object Fexecute_kbd_macro ();
        !            40: 
        !            41: DEFUN ("start-kbd-macro", Fstart_kbd_macro, Sstart_kbd_macro, 1, 1, "P",
        !            42:   "Record subsequent keyboard input, defining a keyboard macro.\n\
        !            43: The commands are recorded even as they are executed.\n\
        !            44: Use \\[end-kbd-macro] to finish recording and make the macro available.\n\
        !            45: Use \\[name-last-kbd-macro] to give it a permanent name.\n\
        !            46: Non-nil arg (prefix arg) means append to last macro defined;\n\
        !            47:  This begins by re-executing that macro as if you typed it again.")
        !            48:   (append)
        !            49:      Lisp_Object append;
        !            50: {
        !            51:   if (defining_kbd_macro)
        !            52:     error ("Already defining kbd macro");
        !            53: 
        !            54:   update_mode_lines++;
        !            55:   if (NULL (append))
        !            56:     {
        !            57:       kbd_macro_ptr = kbd_macro_buffer;
        !            58:       kbd_macro_end = kbd_macro_buffer;
        !            59:       message("Defining kbd macro...");
        !            60:     }
        !            61:   else
        !            62:     {
        !            63:       message("Appending to kbd macro...");
        !            64:       kbd_macro_ptr = kbd_macro_end;
        !            65:       Fexecute_kbd_macro (Vlast_kbd_macro, make_number (1));
        !            66:     }
        !            67:   defining_kbd_macro = 1;
        !            68: 
        !            69:   return Qnil;
        !            70: }
        !            71: 
        !            72: DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 1, "p",
        !            73:   "Finish defining a keyboard macro.\n\
        !            74: The definition was started by \\[start-kbd-macro].\n\
        !            75: The macro is now available for use via \\[call-last-kbd-macro],\n\
        !            76: or it can be given a name with \\[name-last-kbd-macro] and then invoked\n\
        !            77: under that name.\n\
        !            78: With numeric arg, repeat macro now that many times,\n\
        !            79: counting the definition just completed as the first repetition.")
        !            80:   (arg)
        !            81:      Lisp_Object arg;
        !            82: {
        !            83:   if (!defining_kbd_macro)
        !            84:       error ("Not defining kbd macro.");
        !            85: 
        !            86:   if (NULL (arg))
        !            87:     XFASTINT (arg) = 1;
        !            88:   else
        !            89:     CHECK_NUMBER (arg, 0);
        !            90: 
        !            91:   if (defining_kbd_macro)
        !            92:     {
        !            93:       defining_kbd_macro = 0;
        !            94:       update_mode_lines++;
        !            95:       Vlast_kbd_macro = make_string (kbd_macro_buffer,
        !            96:                                     kbd_macro_end - kbd_macro_buffer);
        !            97:       message("Keyboard macro defined");
        !            98:     }
        !            99: 
        !           100:   if (XFASTINT (arg) == 0)
        !           101:     Fexecute_kbd_macro (Vlast_kbd_macro, arg);
        !           102:   else
        !           103:     {
        !           104:       XFASTINT (arg)--;
        !           105:       if (XFASTINT (arg) > 0)
        !           106:        Fexecute_kbd_macro (Vlast_kbd_macro, arg);
        !           107:     }
        !           108:   return Qnil;
        !           109: }
        !           110: 
        !           111: /* Store character c into kbd macro being defined */
        !           112: 
        !           113: store_kbd_macro_char (c)
        !           114:      unsigned char c;
        !           115: {
        !           116:   if (defining_kbd_macro)
        !           117:     {
        !           118:       if (kbd_macro_ptr - kbd_macro_buffer == kbd_macro_bufsize)
        !           119:        {
        !           120:          register char *new = (char *) xrealloc (kbd_macro_buffer, kbd_macro_bufsize *= 2);
        !           121:          kbd_macro_ptr += new - kbd_macro_buffer;
        !           122:          kbd_macro_end = new + kbd_macro_bufsize;
        !           123:          kbd_macro_buffer = new;
        !           124:        }
        !           125:       *kbd_macro_ptr++ = c;
        !           126:     }
        !           127: }
        !           128: 
        !           129: /* Declare that all chars stored so far in the kbd macro being defined
        !           130:  really belong to it.  This is done in between editor commands.  */
        !           131: 
        !           132: finalize_kbd_macro_chars ()
        !           133: {
        !           134:   kbd_macro_end = kbd_macro_ptr;
        !           135: }
        !           136: 
        !           137: DEFUN ("call-last-kbd-macro", Fcall_last_kbd_macro, Scall_last_kbd_macro,
        !           138:   0, 1, "p",
        !           139:   "Call the last keyboard macro that you defined with \\[start-kbd-macro].\n\
        !           140: To make a macro permanent so you can call it even after\n\
        !           141: defining others, use \\[name-last-kbd-macro].")
        !           142:   (prefix)
        !           143:      Lisp_Object prefix;
        !           144: {
        !           145:   if (defining_kbd_macro)
        !           146:     error ("Can't execute anonymous macro while defining one");
        !           147:   else if (NULL (Vlast_kbd_macro))
        !           148:     error ("No kbd macro has been defined");
        !           149:   else
        !           150:     Fexecute_kbd_macro (Vlast_kbd_macro, prefix);
        !           151:   return Qnil;
        !           152: }
        !           153: 
        !           154: static Lisp_Object
        !           155: pop_kbd_macro (info)
        !           156:      Lisp_Object info;
        !           157: {
        !           158:   Lisp_Object tem;
        !           159:   Vexecuting_macro = Fcar (info);
        !           160:   tem = Fcdr (info);
        !           161:   executing_macro_index = XINT (tem);
        !           162:   return Qnil;
        !           163: }
        !           164: 
        !           165: DEFUN ("execute-kbd-macro", Fexecute_kbd_macro, Sexecute_kbd_macro, 1, 2, 0,
        !           166:   "Execute MACRO as string of editor command characters.\n\
        !           167: If MACRO is a symbol, its function definition is used.\n\
        !           168: COUNT is a repeat count, or nil for once, or 0 for infinite loop.")
        !           169:   (macro, prefixarg)
        !           170:      Lisp_Object macro, prefixarg;
        !           171: {
        !           172:   Lisp_Object final;
        !           173:   Lisp_Object tem;
        !           174:   int count = specpdl_ptr - specpdl;
        !           175:   int repeat = 1;
        !           176:   struct gcpro gcpro1;
        !           177: 
        !           178:   if (!NULL (prefixarg))
        !           179:     prefixarg = Fprefix_numeric_value (prefixarg),
        !           180:     repeat = XINT (prefixarg);
        !           181: 
        !           182:   final = macro;
        !           183:   while (XTYPE (final) == Lisp_Symbol && !EQ (final, Qunbound))
        !           184:     final = XSYMBOL (final)->function;
        !           185:   CHECK_STRING (final, 0);
        !           186: 
        !           187:   XFASTINT (tem) = executing_macro_index;
        !           188:   tem = Fcons (Vexecuting_macro, tem);
        !           189:   record_unwind_protect (pop_kbd_macro, tem);
        !           190: 
        !           191:   GCPRO1 (final);
        !           192:   do
        !           193:     {
        !           194:       Vexecuting_macro = final;
        !           195:       executing_macro_index = 0;
        !           196: 
        !           197:       command_loop_1 ();
        !           198:     }
        !           199:   while (--repeat && XTYPE (Vexecuting_macro) == Lisp_String);
        !           200: 
        !           201:   UNGCPRO;
        !           202:   unbind_to (count);
        !           203: 
        !           204:   return Qnil;
        !           205: }
        !           206: 
        !           207: init_macros ()
        !           208: {
        !           209:   Vlast_kbd_macro = Qnil;
        !           210:   defining_kbd_macro = 0;
        !           211: 
        !           212:   Vexecuting_macro = Qnil;
        !           213: }
        !           214: 
        !           215: syms_of_macros ()
        !           216: {
        !           217:   kbd_macro_bufsize = 100;
        !           218:   kbd_macro_buffer = (char *) malloc (kbd_macro_bufsize);
        !           219: 
        !           220:   defsubr (&Sstart_kbd_macro);
        !           221:   defsubr (&Send_kbd_macro);
        !           222:   defsubr (&Scall_last_kbd_macro);
        !           223:   defsubr (&Sexecute_kbd_macro);
        !           224: 
        !           225:   DEFVAR_BOOL ("defining-kbd-macro", &defining_kbd_macro,
        !           226:     "Non-nil means store keyboard input into kbd macro being defined.");
        !           227: 
        !           228:   DEFVAR_LISP ("executing-macro", &Vexecuting_macro,
        !           229:     "Currently executing keyboard macro (a string); nil if none executing.");
        !           230: 
        !           231:   DEFVAR_LISP_NOPRO ("executing-kbd-macro", &Vexecuting_macro,
        !           232:     "Currently executing keyboard macro (a string); nil if none executing.");
        !           233: 
        !           234:   DEFVAR_LISP ("last-kbd-macro", &Vlast_kbd_macro,
        !           235:     "Last kbd macro defined, as a string; nil if none defined.");
        !           236: }
        !           237: 
        !           238: keys_of_macros ()
        !           239: {
        !           240:   ndefkey (Vctl_x_map, ('e'), "call-last-kbd-macro");
        !           241:   ndefkey (Vctl_x_map, ('('), "start-kbd-macro");
        !           242:   ndefkey (Vctl_x_map, (')'), "end-kbd-macro");
        !           243: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.