|
|
1.1 root 1: ;; Non-primitive commands for keyboard macros.
2: ;; Copyright (C) 1985, 1986, 1987 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: (defun name-last-kbd-macro (symbol)
22: "Assign a name to the last keyboard macro defined.
23: One arg, a symbol, which is the name to define.
24: The symbol's function definition becomes the keyboard macro string.
25: Such a \"function\" cannot be called from Lisp, but it is a valid command
26: definition for the editor command loop."
27: (interactive "SName for last kbd macro: ")
28: (or last-kbd-macro
29: (error "No keyboard macro defined"))
30: (and (fboundp symbol)
31: (not (stringp (symbol-function symbol)))
32: (error "Function %s is already defined and not a keyboard macro."
33: symbol))
34: (fset symbol last-kbd-macro))
35:
36: (defun insert-kbd-macro (macroname &optional keys)
37: "Insert in buffer the definition of kbd macro NAME, as Lisp code.
38: Second argument KEYS non-nil means also record the keys it is on.
39: (This is the prefix argument, when calling interactively.)
40:
41: This Lisp code will, when executed, define the kbd macro with the
42: same definition it has now. If you say to record the keys,
43: the Lisp code will also rebind those keys to the macro.
44: Only global key bindings are recorded since executing this Lisp code
45: always makes global bindings.
46:
47: To save a kbd macro, visit a file of Lisp code such as your ~/.emacs,
48: use this command, and then save the file."
49: (interactive "CInsert kbd macro (name): \nP")
50: (insert "(fset '")
51: (prin1 macroname (current-buffer))
52: (insert "\n ")
53: (prin1 (symbol-function macroname) (current-buffer))
54: (insert ")\n")
55: (if keys
56: (let ((keys (where-is-internal macroname nil)))
57: (while keys
58: (insert "(global-set-key ")
59: (prin1 (car keys) (current-buffer))
60: (insert " '")
61: (prin1 macroname (current-buffer))
62: (insert ")\n")
63: (setq keys (cdr keys))))))
64:
65: (defun kbd-macro-query (flag)
66: "Query user during kbd macro execution.
67: With prefix argument, enters recursive edit,
68: reading keyboard commands even within a kbd macro.
69: You can give different commands each time the macro executes.
70: Without prefix argument, reads a character. Your options are:
71: Space -- execute the rest of the macro.
72: DEL -- skip the rest of the macro; start next repetition.
73: C-d -- skip rest of the macro and don't repeat it any more.
74: C-r -- enter a recursive edit, then on exit ask again for a character
75: C-l -- redisplay screen and ask again."
76: (interactive "P")
77: (or executing-macro
78: defining-kbd-macro
79: (error "Not defining or executing kbd macro"))
80: (if flag
81: (let (executing-macro defining-kbd-macro)
82: (recursive-edit))
83: (if (not executing-macro)
84: nil
85: (let ((loop t))
86: (while loop
87: (let ((char (let ((executing-macro nil)
88: (defining-kbd-macro nil))
89: (message "Proceed with macro? (Space, DEL, C-d, C-r or C-l) ")
90: (read-char))))
91: (cond ((= char ? )
92: (setq loop nil))
93: ((= char ?\177)
94: (setq loop nil)
95: (setq executing-macro ""))
96: ((= char ?\C-d)
97: (setq loop nil)
98: (setq executing-macro t))
99: ((= char ?\C-l)
100: (recenter nil))
101: ((= char ?\C-r)
102: (let (executing-macro defining-kbd-macro)
103: (recursive-edit))))))))))
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.