|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.