annotate lisp/edmacro.el @ 67086:7ae3d744378e

(Custom-reset-standard): Make it handle Custom group buffers correctly. (It used to throw an error in such buffers.) Make it ask for confirmation in group buffers and other Custom buffers containing more than one customization item.
author Luc Teirlinck <teirllm@auburn.edu>
date Tue, 22 Nov 2005 23:28:28 +0000
parents 41bb365f41c4
children 3bd95f4f2941 532e0a9335a9 2d92f5c9d6ae
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
1 ;;; edmacro.el --- keyboard macro editor
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
2
64762
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64091
diff changeset
3 ;; Copyright (C) 1993, 1994, 2002, 2003, 2004,
41bb365f41c4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64091
diff changeset
4 ;; 2005 Free Software Foundation, Inc.
845
213978acbc1e entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
5
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
6 ;; Author: Dave Gillespie <daveg@synaptics.com>
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
7 ;; Maintainer: Dave Gillespie <daveg@synaptics.com>
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
8 ;; Version: 2.01
2247
2c7997f249eb Add or correct keywords
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 845
diff changeset
9 ;; Keywords: abbrev
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
10
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
11 ;; This file is part of GNU Emacs.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
12
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
15 ;; the Free Software Foundation; either version 2, or (at your option)
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
16 ;; any later version.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
17
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
22
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 12955
diff changeset
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64091
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62402
diff changeset
25 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
6fb026ad601f Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 62402
diff changeset
26 ;; Boston, MA 02110-1301, USA.
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
27
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
28 ;;; Commentary:
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
29
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
30 ;;; Usage:
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
31 ;;
58836
89cc919b0ccd `edit-kbd-macro' is now bound to `C-x C-k e'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 57292
diff changeset
32 ;; The `C-x C-k e' (`edit-kbd-macro') command edits a keyboard macro
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
33 ;; in a special buffer. It prompts you to type a key sequence,
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
34 ;; which should be one of:
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
35 ;;
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47404
diff changeset
36 ;; * RET or `C-x e' (call-last-kbd-macro), to edit the most
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
37 ;; recently defined keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
38 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
39 ;; * `M-x' followed by a command name, to edit a named command
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
40 ;; whose definition is a keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
41 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
42 ;; * `C-h l' (view-lossage), to edit the 100 most recent keystrokes
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
43 ;; and install them as the "current" macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
44 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
45 ;; * any key sequence whose definition is a keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
46 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
47 ;; This file includes a version of `insert-kbd-macro' that uses the
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
48 ;; more readable format defined by these routines.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
49 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
50 ;; Also, the `read-kbd-macro' command parses the region as
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
51 ;; a keyboard macro, and installs it as the "current" macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
52 ;; This and `format-kbd-macro' can also be called directly as
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
53 ;; Lisp functions.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
54
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
55 ;; Type `C-h m', or see the documentation for `edmacro-mode' below,
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
56 ;; for information about the format of written keyboard macros.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
57
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
58 ;; `edit-kbd-macro' formats the macro with one command per line,
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
59 ;; including the command names as comments on the right. If the
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
60 ;; formatter gets confused about which keymap was used for the
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
61 ;; characters, the command-name comments will be wrong but that
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
62 ;; won't hurt anything.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
63
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
64 ;; With a prefix argument, `edit-kbd-macro' will format the
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
65 ;; macro in a more concise way that omits the comments.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
66
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
67 ;; This package requires GNU Emacs 19 or later, and daveg's CL
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
68 ;; package 2.02 or later. (CL 2.02 comes standard starting with
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
69 ;; Emacs 19.18.) This package does not work with Emacs 18 or
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
70 ;; Lucid Emacs.
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
71
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
72 ;;; Code:
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
73
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
74 (eval-when-compile
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
75 (require 'cl))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
76
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
77 (require 'kmacro)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
78
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
79 ;;; The user-level commands for editing macros.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
80
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
81 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
82 (defvar edmacro-eight-bits nil
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
83 "*Non-nil if edit-kbd-macro should leave 8-bit characters intact.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
84 Default nil means to write characters above \\177 in octal notation.")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
85
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
86 (defvar edmacro-mode-map nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
87 (unless edmacro-mode-map
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
88 (setq edmacro-mode-map (make-sparse-keymap))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
89 (define-key edmacro-mode-map "\C-c\C-c" 'edmacro-finish-edit)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
90 (define-key edmacro-mode-map "\C-c\C-q" 'edmacro-insert-key))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
91
14464
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
92 (defvar edmacro-store-hook)
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
93 (defvar edmacro-finish-hook)
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
94 (defvar edmacro-original-buffer)
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
95
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 199
diff changeset
96 ;;;###autoload
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
97 (defun edit-kbd-macro (keys &optional prefix finish-hook store-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
98 "Edit a keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
99 At the prompt, type any key sequence which is bound to a keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
100 Or, type `C-x e' or RET to edit the last keyboard macro, `C-h l' to edit
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
101 the last 100 keystrokes as a keyboard macro, or `M-x' to edit a macro by
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
102 its command name.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
103 With a prefix argument, format the macro in a more concise way."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
104 (interactive "kKeyboard macro to edit (C-x e, M-x, C-h l, or keys): \nP")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
105 (when keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
106 (let ((cmd (if (arrayp keys) (key-binding keys) keys))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
107 (mac nil) (mac-counter nil) (mac-format nil)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
108 kmacro)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
109 (cond (store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
110 (setq mac keys)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
111 (setq cmd nil))
49588
37645a051842 Trailing whitespace deleted.
Juanma Barranquero <lekktu@gmail.com>
parents: 47404
diff changeset
112 ((or (memq cmd '(call-last-kbd-macro kmacro-call-macro
47404
51b92fc1f484 (edit-kbd-macro): Recognize new C-x e binding, kmacro-end-and-call-macro.
Kim F. Storm <storm@cua.dk>
parents: 47294
diff changeset
113 kmacro-end-or-call-macro kmacro-end-and-call-macro))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
114 (member keys '("\r" [return])))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
115 (or last-kbd-macro
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
116 (y-or-n-p "No keyboard macro defined. Create one? ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
117 (keyboard-quit))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
118 (setq mac (or last-kbd-macro ""))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
119 (setq keys nil)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
120 (setq cmd 'last-kbd-macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
121 ((eq cmd 'execute-extended-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
122 (setq cmd (read-command "Name of keyboard macro to edit: "))
14397
49d961cdc9d6 (edit-kbd-macro): Reject empty cmd name.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
123 (if (string-equal cmd "")
49d961cdc9d6 (edit-kbd-macro): Reject empty cmd name.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
124 (error "No command name given"))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
125 (setq keys nil)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
126 (setq mac (symbol-function cmd)))
23945
688314651e5a (edit-kbd-macro): Recognize electric-view-lossage.
Richard M. Stallman <rms@gnu.org>
parents: 16977
diff changeset
127 ((memq cmd '(view-lossage electric-view-lossage))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
128 (setq mac (recent-keys))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
129 (setq keys nil)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
130 (setq cmd 'last-kbd-macro))
11870
993431cf1f89 (edit-kbd-macro): Better error messages for undefined keys
Karl Heuer <kwzh@gnu.org>
parents: 10692
diff changeset
131 ((null cmd)
993431cf1f89 (edit-kbd-macro): Better error messages for undefined keys
Karl Heuer <kwzh@gnu.org>
parents: 10692
diff changeset
132 (error "Key sequence %s is not defined" (key-description keys)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
133 ((symbolp cmd)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
134 (setq mac (symbol-function cmd)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
135 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
136 (setq mac cmd)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
137 (setq cmd nil)))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
138 (when (setq kmacro (kmacro-extract-lambda mac))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
139 (setq mac (car kmacro)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
140 mac-counter (nth 1 kmacro)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
141 mac-format (nth 2 kmacro)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
142 (unless (arrayp mac)
11870
993431cf1f89 (edit-kbd-macro): Better error messages for undefined keys
Karl Heuer <kwzh@gnu.org>
parents: 10692
diff changeset
143 (error "Key sequence %s is not a keyboard macro"
993431cf1f89 (edit-kbd-macro): Better error messages for undefined keys
Karl Heuer <kwzh@gnu.org>
parents: 10692
diff changeset
144 (key-description keys)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
145 (message "Formatting keyboard macro...")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
146 (let* ((oldbuf (current-buffer))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
147 (mmac (edmacro-fix-menu-commands mac))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
148 (fmt (edmacro-format-keys mmac 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
149 (fmtv (edmacro-format-keys mmac (not prefix)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
150 (buf (get-buffer-create "*Edit Macro*")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
151 (message "Formatting keyboard macro...done")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
152 (switch-to-buffer buf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
153 (kill-all-local-variables)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
154 (use-local-map edmacro-mode-map)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
155 (setq buffer-read-only nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
156 (setq major-mode 'edmacro-mode)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
157 (setq mode-name "Edit Macro")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
158 (set (make-local-variable 'edmacro-original-buffer) oldbuf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
159 (set (make-local-variable 'edmacro-finish-hook) finish-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
160 (set (make-local-variable 'edmacro-store-hook) store-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
161 (erase-buffer)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
162 (insert ";; Keyboard Macro Editor. Press C-c C-c to finish; "
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
163 "press C-x k RET to cancel.\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
164 (insert ";; Original keys: " fmt "\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
165 (unless store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
166 (insert "\nCommand: " (if cmd (symbol-name cmd) "none") "\n")
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
167 (let ((gkeys (where-is-internal (or cmd mac) '(keymap))))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
168 (if (and keys (not (member keys gkeys)))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
169 (setq gkeys (cons keys gkeys)))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
170 (if gkeys
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
171 (while gkeys
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
172 (insert "Key: " (edmacro-format-keys (pop gkeys) 1) "\n"))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
173 (insert "Key: none\n")))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
174 (when (and mac-counter mac-format)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
175 (insert (format "Counter: %d\nFormat: \"%s\"\n" mac-counter mac-format))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
176 (insert "\nMacro:\n\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
177 (save-excursion
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
178 (insert fmtv "\n"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
179 (recenter '(4))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
180 (when (eq mac mmac)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
181 (set-buffer-modified-p nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
182 (run-hooks 'edmacro-format-hook)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
183
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
184 ;;; The next two commands are provided for convenience and backward
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
185 ;;; compatibility.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
186
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
187 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
188 (defun edit-last-kbd-macro (&optional prefix)
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
189 "Edit the most recently defined keyboard macro."
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
190 (interactive "P")
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
191 (edit-kbd-macro 'call-last-kbd-macro prefix))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
192
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
193 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
194 (defun edit-named-kbd-macro (&optional prefix)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
195 "Edit a keyboard macro which has been given a name by `name-last-kbd-macro'."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
196 (interactive "P")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
197 (edit-kbd-macro 'execute-extended-command prefix))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
198
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
199 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
200 (defun read-kbd-macro (start &optional end)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
201 "Read the region as a keyboard macro definition.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
202 The region is interpreted as spelled-out keystrokes, e.g., \"M-x abc RET\".
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
203 See documentation for `edmacro-mode' for details.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
204 Leading/trailing \"C-x (\" and \"C-x )\" in the text are allowed and ignored.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
205 The resulting macro is installed as the \"current\" keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
206
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
207 In Lisp, may also be called with a single STRING argument in which case
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
208 the result is returned rather than being installed as the current macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
209 The result will be a string if possible, otherwise an event vector.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
210 Second argument NEED-VECTOR means to return an event vector always."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
211 (interactive "r")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
212 (if (stringp start)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
213 (edmacro-parse-keys start end)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
214 (setq last-kbd-macro (edmacro-parse-keys (buffer-substring start end)))))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
215
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 199
diff changeset
216 ;;;###autoload
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
217 (defun format-kbd-macro (&optional macro verbose)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
218 "Return the keyboard macro MACRO as a human-readable string.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
219 This string is suitable for passing to `read-kbd-macro'.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
220 Second argument VERBOSE means to put one command per line with comments.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
221 If VERBOSE is `1', put everything on one line. If VERBOSE is omitted
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
222 or nil, use a compact 80-column format."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
223 (and macro (symbolp macro) (setq macro (symbol-function macro)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
224 (edmacro-format-keys (or macro last-kbd-macro) verbose))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
225
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
226 ;;; Commands for *Edit Macro* buffer.
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
227
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
228 (defun edmacro-finish-edit ()
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
229 (interactive)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
230 (unless (eq major-mode 'edmacro-mode)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
231 (error
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
232 "This command is valid only in buffers created by `edit-kbd-macro'"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
233 (run-hooks 'edmacro-finish-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
234 (let ((cmd nil) (keys nil) (no-keys nil)
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
235 (mac-counter nil) (mac-format nil) (kmacro nil)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
236 (top (point-min)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
237 (goto-char top)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
238 (let ((case-fold-search nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
239 (while (cond ((looking-at "[ \t]*\\($\\|;;\\|REM[ \t\n]\\)")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
240 t)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
241 ((looking-at "Command:[ \t]*\\([^ \t\n]*\\)[ \t]*$")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
242 (when edmacro-store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
243 (error "\"Command\" line not allowed in this context"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
244 (let ((str (buffer-substring (match-beginning 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
245 (match-end 1))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
246 (unless (equal str "")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
247 (setq cmd (and (not (equal str "none"))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
248 (intern str)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
249 (and (fboundp cmd) (not (arrayp (symbol-function cmd)))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
250 (not (setq kmacro (get cmd 'kmacro)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
251 (not (y-or-n-p
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
252 (format "Command %s is already defined; %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
253 cmd "proceed? ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
254 (keyboard-quit))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
255 t)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
256 ((looking-at "Key:\\(.*\\)$")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
257 (when edmacro-store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
258 (error "\"Key\" line not allowed in this context"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
259 (let ((key (edmacro-parse-keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
260 (buffer-substring (match-beginning 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
261 (match-end 1)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
262 (unless (equal key "")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
263 (if (equal key "none")
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
264 (setq no-keys t)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
265 (push key keys)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
266 (let ((b (key-binding key)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
267 (and b (commandp b) (not (arrayp b))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
268 (not (kmacro-extract-lambda b))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
269 (or (not (fboundp b))
58836
89cc919b0ccd `edit-kbd-macro' is now bound to `C-x C-k e'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 57292
diff changeset
270 (not (or (arrayp (symbol-function b))
89cc919b0ccd `edit-kbd-macro' is now bound to `C-x C-k e'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 57292
diff changeset
271 (get b 'kmacro))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
272 (not (y-or-n-p
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
273 (format "Key %s is already defined; %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
274 (edmacro-format-keys key 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
275 "proceed? ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
276 (keyboard-quit))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
277 t)
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
278 ((looking-at "Counter:[ \t]*\\([^ \t\n]*\\)[ \t]*$")
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
279 (when edmacro-store-hook
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
280 (error "\"Counter\" line not allowed in this context"))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
281 (let ((str (buffer-substring (match-beginning 1)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
282 (match-end 1))))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
283 (unless (equal str "")
62402
a7e02ef1e3d6 Replace `string-to-int' by `string-to-number'.
Juanma Barranquero <lekktu@gmail.com>
parents: 58836
diff changeset
284 (setq mac-counter (string-to-number str))))
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
285 t)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
286 ((looking-at "Format:[ \t]*\"\\([^\n]*\\)\"[ \t]*$")
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
287 (when edmacro-store-hook
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
288 (error "\"Format\" line not allowed in this context"))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
289 (let ((str (buffer-substring (match-beginning 1)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
290 (match-end 1))))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
291 (unless (equal str "")
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
292 (setq mac-format str)))
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
293 t)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
294 ((looking-at "Macro:[ \t\n]*")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
295 (goto-char (match-end 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
296 nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
297 ((eobp) nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
298 (t (error "Expected a `Macro:' line")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
299 (forward-line 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
300 (setq top (point)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
301 (let* ((buf (current-buffer))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
302 (str (buffer-substring top (point-max)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
303 (modp (buffer-modified-p))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
304 (obuf edmacro-original-buffer)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
305 (store-hook edmacro-store-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
306 (finish-hook edmacro-finish-hook))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
307 (unless (or cmd keys store-hook (equal str ""))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
308 (error "No command name or keys specified"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
309 (when modp
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
310 (when (buffer-name obuf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
311 (set-buffer obuf))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
312 (message "Compiling keyboard macro...")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
313 (let ((mac (edmacro-parse-keys str)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
314 (message "Compiling keyboard macro...done")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
315 (if store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
316 (funcall store-hook mac)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
317 (when (eq cmd 'last-kbd-macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
318 (setq last-kbd-macro (and (> (length mac) 0) mac))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
319 (setq cmd nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
320 (when cmd
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
321 (if (= (length mac) 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
322 (fmakunbound cmd)
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
323 (fset cmd
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
324 (if (and mac-counter mac-format)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
325 (kmacro-lambda-form mac mac-counter mac-format)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
326 mac))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
327 (if no-keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
328 (when cmd
5772
daac61915408 (edit-kbd-macro, edmacro-finish-edit, insert-kbd-macro):
Richard M. Stallman <rms@gnu.org>
parents: 5307
diff changeset
329 (loop for key in (where-is-internal cmd '(keymap)) do
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
330 (global-unset-key key)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
331 (when keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
332 (if (= (length mac) 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
333 (loop for key in keys do (global-unset-key key))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
334 (loop for key in keys do
57292
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
335 (global-set-key key
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
336 (or cmd
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
337 (if (and mac-counter mac-format)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
338 (kmacro-lambda-form mac mac-counter mac-format)
00748c19ee41 Require kmacro to use the new kmacro-lambda-form and
Kim F. Storm <storm@cua.dk>
parents: 52401
diff changeset
339 mac))))))))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
340 (kill-buffer buf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
341 (when (buffer-name obuf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
342 (switch-to-buffer obuf))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
343 (when finish-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
344 (funcall finish-hook)))))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
345
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
346 (defun edmacro-insert-key (key)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
347 "Insert the written name of a key in the buffer."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
348 (interactive "kKey to insert: ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
349 (if (bolp)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
350 (insert (edmacro-format-keys key t) "\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
351 (insert (edmacro-format-keys key) " ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
352
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
353 (defun edmacro-mode ()
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
354 "\\<edmacro-mode-map>Keyboard Macro Editing mode. Press
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
355 \\[edmacro-finish-edit] to save and exit.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
356 To abort the edit, just kill this buffer with \\[kill-buffer] RET.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
357
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
358 Press \\[edmacro-insert-key] to insert the name of any key by typing the key.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
359
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
360 The editing buffer contains a \"Command:\" line and any number of
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
361 \"Key:\" lines at the top. These are followed by a \"Macro:\" line
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
362 and the macro itself as spelled-out keystrokes: `C-x C-f foo RET'.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
363
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
364 The \"Command:\" line specifies the command name to which the macro
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
365 is bound, or \"none\" for no command name. Write \"last-kbd-macro\"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
366 to refer to the current keyboard macro (as used by \\[call-last-kbd-macro]).
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
367
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
368 The \"Key:\" lines specify key sequences to which the macro is bound,
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
369 or \"none\" for no key bindings.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
370
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
371 You can edit these lines to change the places where the new macro
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
372 is stored.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
373
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
374
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
375 Format of keyboard macros during editing:
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
376
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
377 Text is divided into \"words\" separated by whitespace. Except for
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
378 the words described below, the characters of each word go directly
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
379 as characters of the macro. The whitespace that separates words
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
380 is ignored. Whitespace in the macro must be written explicitly,
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
381 as in \"foo SPC bar RET\".
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
382
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
383 * The special words RET, SPC, TAB, DEL, LFD, ESC, and NUL represent
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
384 special control characters. The words must be written in uppercase.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
385
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
386 * A word in angle brackets, e.g., <return>, <down>, or <f1>, represents
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
387 a function key. (Note that in the standard configuration, the
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
388 function key <return> and the control key RET are synonymous.)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
389 You can use angle brackets on the words RET, SPC, etc., but they
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
390 are not required there.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
391
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
392 * Keys can be written by their ASCII code, using a backslash followed
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
393 by up to six octal digits. This is the only way to represent keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
394 with codes above \\377.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
395
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
396 * One or more prefixes M- (meta), C- (control), S- (shift), A- (alt),
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
397 H- (hyper), and s- (super) may precede a character or key notation.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
398 For function keys, the prefixes may go inside or outside of the
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
399 brackets: C-<down> = <C-down>. The prefixes may be written in
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
400 any order: M-C-x = C-M-x.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
401
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
402 Prefixes are not allowed on multi-key words, e.g., C-abc, except
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
403 that the Meta prefix is allowed on a sequence of digits and optional
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
404 minus sign: M--123 = M-- M-1 M-2 M-3.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
405
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
406 * The `^' notation for control characters also works: ^M = C-m.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
407
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
408 * Double angle brackets enclose command names: <<next-line>> is
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
409 shorthand for M-x next-line RET.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
410
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
411 * Finally, REM or ;; causes the rest of the line to be ignored as a
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
412 comment.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
413
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
414 Any word may be prefixed by a multiplier in the form of a decimal
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
415 number and `*': 3*<right> = <right> <right> <right>, and
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
416 10*foo = foofoofoofoofoofoofoofoofoofoo.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
417
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
418 Multiple text keys can normally be strung together to form a word,
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
419 but you may need to add whitespace if the word would look like one
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
420 of the above notations: `; ; ;' is a keyboard macro with three
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
421 semicolons, but `;;;' is a comment. Likewise, `\\ 1 2 3' is four
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
422 keys but `\\123' is a single key written in octal, and `< right >'
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
423 is seven keys but `<right>' is a single function key. When in
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
424 doubt, use whitespace."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
425 (interactive)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
426 (error "This mode can be enabled only by `edit-kbd-macro'"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
427 (put 'edmacro-mode 'mode-class 'special)
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
428
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
429 ;;; Formatting a keyboard macro as human-readable text.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
430
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
431 (defun edmacro-format-keys (macro &optional verbose)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
432 (setq macro (edmacro-fix-menu-commands macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
433 (let* ((maps (append (current-minor-mode-maps)
9199
712e13833ad8 (edmacro-format-keys): Cope if local keymap is nil.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
434 (if (current-local-map)
712e13833ad8 (edmacro-format-keys): Cope if local keymap is nil.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
435 (list (current-local-map)))
712e13833ad8 (edmacro-format-keys): Cope if local keymap is nil.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
436 (list (current-global-map))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
437 (pkeys '(end-macro ?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9 ?- ?\C-u
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
438 ?\M-- ?\M-0 ?\M-1 ?\M-2 ?\M-3 ?\M-4 ?\M-5 ?\M-6
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
439 ?\M-7 ?\M-8 ?\M-9))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
440 (mdigs (nthcdr 13 pkeys))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
441 (maxkey (if edmacro-eight-bits 255 127))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
442 (case-fold-search nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
443 (res-words '("NUL" "TAB" "LFD" "RET" "ESC" "SPC" "DEL" "REM"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
444 (rest-mac (vconcat macro [end-macro]))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
445 (res "")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
446 (len 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
447 (one-line (eq verbose 1)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
448 (if one-line (setq verbose nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
449 (when (stringp macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
450 (loop for i below (length macro) do
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
451 (when (>= (aref rest-mac i) 128)
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
452 (incf (aref rest-mac i) (- ?\M-\^@ 128)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
453 (while (not (eq (aref rest-mac 0) 'end-macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
454 (let* ((prefix
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
455 (or (and (integerp (aref rest-mac 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
456 (memq (aref rest-mac 0) mdigs)
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
457 (memq (key-binding (edmacro-subseq rest-mac 0 1))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
458 '(digit-argument negative-argument))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
459 (let ((i 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
460 (while (memq (aref rest-mac i) (cdr mdigs))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
461 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
462 (and (not (memq (aref rest-mac i) pkeys))
52131
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
463 (prog1 (vconcat "M-" (edmacro-subseq rest-mac 0 i) " ")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
464 (callf edmacro-subseq rest-mac i)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
465 (and (eq (aref rest-mac 0) ?\C-u)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
466 (eq (key-binding [?\C-u]) 'universal-argument)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
467 (let ((i 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
468 (while (eq (aref rest-mac i) ?\C-u)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
469 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
470 (and (not (memq (aref rest-mac i) pkeys))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
471 (prog1 (loop repeat i concat "C-u ")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
472 (callf edmacro-subseq rest-mac i)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
473 (and (eq (aref rest-mac 0) ?\C-u)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
474 (eq (key-binding [?\C-u]) 'universal-argument)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
475 (let ((i 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
476 (when (eq (aref rest-mac i) ?-)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
477 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
478 (while (memq (aref rest-mac i)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
479 '(?0 ?1 ?2 ?3 ?4 ?5 ?6 ?7 ?8 ?9))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
480 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
481 (and (not (memq (aref rest-mac i) pkeys))
52131
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
482 (prog1 (vconcat "C-u " (edmacro-subseq rest-mac 1 i) " ")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
483 (callf edmacro-subseq rest-mac i)))))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
484 (bind-len (apply 'max 1
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
485 (loop for map in maps
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
486 for b = (lookup-key map rest-mac)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
487 when b collect b)))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
488 (key (edmacro-subseq rest-mac 0 bind-len))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
489 (fkey nil) tlen tkey
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
490 (bind (or (loop for map in maps for b = (lookup-key map key)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
491 thereis (and (not (integerp b)) b))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
492 (and (setq fkey (lookup-key function-key-map rest-mac))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
493 (setq tlen fkey tkey (edmacro-subseq rest-mac 0 tlen)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
494 fkey (lookup-key function-key-map tkey))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
495 (loop for map in maps
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
496 for b = (lookup-key map fkey)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
497 when (and (not (integerp b)) b)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
498 do (setq bind-len tlen key tkey)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
499 and return b
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
500 finally do (setq fkey nil)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
501 (first (aref key 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
502 (text (loop for i from bind-len below (length rest-mac)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
503 for ch = (aref rest-mac i)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
504 while (and (integerp ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
505 (> ch 32) (< ch maxkey) (/= ch 92)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
506 (eq (key-binding (char-to-string ch))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
507 'self-insert-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
508 (or (> i (- (length rest-mac) 2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
509 (not (eq ch (aref rest-mac (+ i 1))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
510 (not (eq ch (aref rest-mac (+ i 2))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
511 finally return i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
512 desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
513 (if (stringp bind) (setq bind nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
514 (cond ((and (eq bind 'self-insert-command) (not prefix)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
515 (> text 1) (integerp first)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
516 (> first 32) (<= first maxkey) (/= first 92)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
517 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
518 (if (> text 30) (setq text 30))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
519 (setq desc (concat (edmacro-subseq rest-mac 0 text)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
520 (when (string-match "^[ACHMsS]-." desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
521 (setq text 2)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
522 (callf substring desc 0 2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
523 (not (string-match
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
524 "^;;\\|^<.*>$\\|^\\\\[0-9]+$\\|^[0-9]+\\*."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
525 desc))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
526 (when (or (string-match "^\\^.$" desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
527 (member desc res-words))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
528 (setq desc (mapconcat 'char-to-string desc " ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
529 (when verbose
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
530 (setq bind (format "%s * %d" bind text)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
531 (setq bind-len text))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
532 ((and (eq bind 'execute-extended-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
533 (> text bind-len)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
534 (memq (aref rest-mac text) '(return 13))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
535 (progn
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
536 (setq desc (concat (edmacro-subseq rest-mac bind-len text)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
537 (commandp (intern-soft desc))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
538 (if (commandp (intern-soft desc)) (setq bind desc))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
539 (setq desc (format "<<%s>>" desc))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
540 (setq bind-len (1+ text)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
541 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
542 (setq desc (mapconcat
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
543 (function
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
544 (lambda (ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
545 (cond
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
546 ((integerp ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
547 (concat
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
548 (loop for pf across "ACHMsS"
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
549 for bit in '(?\A-\^@ ?\C-\^@ ?\H-\^@
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
550 ?\M-\^@ ?\s-\^@ ?\S-\^@)
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
551 when (/= (logand ch bit) 0)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
552 concat (format "%c-" pf))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
553 (let ((ch2 (logand ch (1- (lsh 1 18)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
554 (cond ((<= ch2 32)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
555 (case ch2
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
556 (0 "NUL") (9 "TAB") (10 "LFD")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
557 (13 "RET") (27 "ESC") (32 "SPC")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
558 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
559 (format "C-%c"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
560 (+ (if (<= ch2 26) 96 64)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
561 ch2)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
562 ((= ch2 127) "DEL")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
563 ((<= ch2 maxkey) (char-to-string ch2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
564 (t (format "\\%o" ch2))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
565 ((symbolp ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
566 (format "<%s>" ch))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
567 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
568 (error "Unrecognized item in macro: %s" ch)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
569 (or fkey key) " "))))
52131
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
570 (if prefix
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
571 (setq desc (concat (edmacro-sanitize-for-string prefix) desc)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
572 (unless (string-match " " desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
573 (let ((times 1) (pos bind-len))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
574 (while (not (edmacro-mismatch rest-mac rest-mac
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
575 0 bind-len pos (+ bind-len pos)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
576 (incf times)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
577 (incf pos bind-len))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
578 (when (> times 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
579 (setq desc (format "%d*%s" times desc))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
580 (setq bind-len (* bind-len times)))))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
581 (setq rest-mac (edmacro-subseq rest-mac bind-len))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
582 (if verbose
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
583 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
584 (unless (equal res "") (callf concat res "\n"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
585 (callf concat res desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
586 (when (and bind (or (stringp bind) (symbolp bind)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
587 (callf concat res
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
588 (make-string (max (- 3 (/ (length desc) 8)) 1) 9)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
589 ";; " (if (stringp bind) bind (symbol-name bind))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
590 (setq len 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
591 (if (and (> (+ len (length desc) 2) 72) (not one-line))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
592 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
593 (callf concat res "\n ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
594 (setq len 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
595 (unless (equal res "")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
596 (callf concat res " ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
597 (incf len)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
598 (callf concat res desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
599 (incf len (length desc)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
600 res))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
601
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
602 (defun edmacro-mismatch (cl-seq1 cl-seq2 cl-start1 cl-end1 cl-start2 cl-end2)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
603 "Compare SEQ1 with SEQ2, return index of first mismatching element.
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
604 Return nil if the sequences match. If one sequence is a prefix of the
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
605 other, the return value indicates the end of the shorted sequence."
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
606 (let (cl-test cl-test-not cl-key cl-from-end)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
607 (or cl-end1 (setq cl-end1 (length cl-seq1)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
608 (or cl-end2 (setq cl-end2 (length cl-seq2)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
609 (if cl-from-end
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
610 (progn
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
611 (while (and (< cl-start1 cl-end1) (< cl-start2 cl-end2)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
612 (cl-check-match (elt cl-seq1 (1- cl-end1))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
613 (elt cl-seq2 (1- cl-end2))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
614 (setq cl-end1 (1- cl-end1) cl-end2 (1- cl-end2)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
615 (and (or (< cl-start1 cl-end1) (< cl-start2 cl-end2))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
616 (1- cl-end1)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
617 (let ((cl-p1 (and (listp cl-seq1) (nthcdr cl-start1 cl-seq1)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
618 (cl-p2 (and (listp cl-seq2) (nthcdr cl-start2 cl-seq2))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
619 (while (and (< cl-start1 cl-end1) (< cl-start2 cl-end2)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
620 (cl-check-match (if cl-p1 (car cl-p1)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
621 (aref cl-seq1 cl-start1))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
622 (if cl-p2 (car cl-p2)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
623 (aref cl-seq2 cl-start2))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
624 (setq cl-p1 (cdr cl-p1) cl-p2 (cdr cl-p2)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
625 cl-start1 (1+ cl-start1) cl-start2 (1+ cl-start2)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
626 (and (or (< cl-start1 cl-end1) (< cl-start2 cl-end2))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
627 cl-start1)))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
628
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
629 (defun edmacro-subseq (seq start &optional end)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
630 "Return the subsequence of SEQ from START to END.
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
631 If END is omitted, it defaults to the length of the sequence.
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
632 If START or END is negative, it counts from the end."
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
633 (if (stringp seq) (substring seq start end)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
634 (let (len)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
635 (and end (< end 0) (setq end (+ end (setq len (length seq)))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
636 (if (< start 0) (setq start (+ start (or len (setq len (length seq))))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
637 (cond ((listp seq)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
638 (if (> start 0) (setq seq (nthcdr start seq)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
639 (if end
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
640 (let ((res nil))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
641 (while (>= (setq end (1- end)) start)
47294
15e9f75f55b0 (edmacro-subseq): Don't use cl-push/cl-pop.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 47197
diff changeset
642 (push (pop seq) res))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
643 (nreverse res))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
644 (copy-sequence seq)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
645 (t
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
646 (or end (setq end (or len (length seq))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
647 (let ((res (make-vector (max (- end start) 0) nil))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
648 (i 0))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
649 (while (< start end)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
650 (aset res i (aref seq start))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
651 (setq i (1+ i) start (1+ start)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
652 res))))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
653
52131
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
654 (defun edmacro-sanitize-for-string (seq)
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
655 "Convert a key sequence vector into a string.
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
656 The string represents the same events; Meta is indicated by bit 7.
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
657 This function assumes that the events can be stored in a string."
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
658 (setq seq (copy-sequence seq))
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
659 (loop for i below (length seq) do
58836
89cc919b0ccd `edit-kbd-macro' is now bound to `C-x C-k e'.
Luc Teirlinck <teirllm@auburn.edu>
parents: 57292
diff changeset
660 (when (logand (aref seq i) 128)
52131
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
661 (setf (aref seq i) (logand (aref seq i) 127))))
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
662 seq)
6be32b5661a6 (edmacro-format-keys): Use edmacro-sanitize-for-string.
Richard M. Stallman <rms@gnu.org>
parents: 49588
diff changeset
663
45939
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
664 (defun edmacro-fix-menu-commands (macro &optional noerror)
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
665 (if (vectorp macro)
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
666 (let (result)
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
667 ;; Make a list of the elements.
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
668 (setq macro (append macro nil))
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
669 (dolist (ev macro)
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
670 (cond ((atom ev)
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
671 (push ev result))
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
672 ((eq (car ev) 'help-echo))
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
673 ((equal ev '(menu-bar))
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
674 (push 'menu-bar result))
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
675 ((equal (cadadr ev) '(menu-bar))
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
676 (push (vector 'menu-bar (car ev)) result))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
677 ;; It would be nice to do pop-up menus, too, but not enough
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
678 ;; info is recorded in macros to make this possible.
45939
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
679 (noerror
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
680 ;; Just ignore mouse events.
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
681 nil)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
682 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
683 (error "Macros with mouse clicks are not %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
684 "supported by this command"))))
45939
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
685 ;; Reverse them again and make them back into a vector.
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
686 (vconcat (nreverse result)))
6ccb89338ab1 (edmacro-fix-menu-commands):
Richard M. Stallman <rms@gnu.org>
parents: 38436
diff changeset
687 macro))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
688
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
689 ;;; Parsing a human-readable keyboard macro.
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
690
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
691 (defun edmacro-parse-keys (string &optional need-vector)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
692 (let ((case-fold-search nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
693 (pos 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
694 (res []))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
695 (while (and (< pos (length string))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
696 (string-match "[^ \t\n\f]+" string pos))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
697 (let ((word (substring string (match-beginning 0) (match-end 0)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
698 (key nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
699 (times 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
700 (setq pos (match-end 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
701 (when (string-match "\\([0-9]+\\)\\*." word)
62402
a7e02ef1e3d6 Replace `string-to-int' by `string-to-number'.
Juanma Barranquero <lekktu@gmail.com>
parents: 58836
diff changeset
702 (setq times (string-to-number (substring word 0 (match-end 1))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
703 (setq word (substring word (1+ (match-end 1)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
704 (cond ((string-match "^<<.+>>$" word)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
705 (setq key (vconcat (if (eq (key-binding [?\M-x])
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
706 'execute-extended-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
707 [?\M-x]
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
708 (or (car (where-is-internal
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
709 'execute-extended-command))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
710 [?\M-x]))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
711 (substring word 2 -2) "\r")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
712 ((and (string-match "^\\(\\([ACHMsS]-\\)*\\)<\\(.+\\)>$" word)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
713 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
714 (setq word (concat (substring word (match-beginning 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
715 (match-end 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
716 (substring word (match-beginning 3)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
717 (match-end 3))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
718 (not (string-match
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
719 "\\<\\(NUL\\|RET\\|LFD\\|ESC\\|SPC\\|DEL\\)$"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
720 word))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
721 (setq key (list (intern word))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
722 ((or (equal word "REM") (string-match "^;;" word))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
723 (setq pos (string-match "$" string pos)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
724 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
725 (let ((orig-word word) (prefix 0) (bits 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
726 (while (string-match "^[ACHMsS]-." word)
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
727 (incf bits (cdr (assq (aref word 0)
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
728 '((?A . ?\A-\^@) (?C . ?\C-\^@)
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
729 (?H . ?\H-\^@) (?M . ?\M-\^@)
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
730 (?s . ?\s-\^@) (?S . ?\S-\^@)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
731 (incf prefix 2)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
732 (callf substring word 2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
733 (when (string-match "^\\^.$" word)
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
734 (incf bits ?\C-\^@)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
735 (incf prefix)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
736 (callf substring word 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
737 (let ((found (assoc word '(("NUL" . "\0") ("RET" . "\r")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
738 ("LFD" . "\n") ("TAB" . "\t")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
739 ("ESC" . "\e") ("SPC" . " ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
740 ("DEL" . "\177")))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
741 (when found (setq word (cdr found))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
742 (when (string-match "^\\\\[0-7]+$" word)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
743 (loop for ch across word
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
744 for n = 0 then (+ (* n 8) ch -48)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
745 finally do (setq word (vector n))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
746 (cond ((= bits 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
747 (setq key word))
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
748 ((and (= bits ?\M-\^@) (stringp word)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
749 (string-match "^-?[0-9]+$" word))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
750 (setq key (loop for x across word collect (+ x bits))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
751 ((/= (length word) 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
752 (error "%s must prefix a single character, not %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
753 (substring orig-word 0 prefix) word))
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
754 ((and (/= (logand bits ?\C-\^@) 0) (stringp word)
16951
156fd377c7d0 (edmacro-parse-keys): Don't treat C-. or C-? as ASCII control char.
Richard M. Stallman <rms@gnu.org>
parents: 16283
diff changeset
755 ;; We used to accept . and ? here,
156fd377c7d0 (edmacro-parse-keys): Don't treat C-. or C-? as ASCII control char.
Richard M. Stallman <rms@gnu.org>
parents: 16283
diff changeset
756 ;; but . is simply wrong,
156fd377c7d0 (edmacro-parse-keys): Don't treat C-. or C-? as ASCII control char.
Richard M. Stallman <rms@gnu.org>
parents: 16283
diff changeset
757 ;; and C-? is not used (we use DEL instead).
156fd377c7d0 (edmacro-parse-keys): Don't treat C-. or C-? as ASCII control char.
Richard M. Stallman <rms@gnu.org>
parents: 16283
diff changeset
758 (string-match "[@-_a-z]" word))
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
759 (setq key (list (+ bits (- ?\C-\^@)
16977
e97bdda07a30 (edmacro-parse-keys): Remove redundant test for ?.
Erik Naggum <erik@naggum.no>
parents: 16951
diff changeset
760 (logand (aref word 0) 31)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
761 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
762 (setq key (list (+ bits (aref word 0)))))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
763 (when key
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
764 (loop repeat times do (callf vconcat res key)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
765 (when (and (>= (length res) 4)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
766 (eq (aref res 0) ?\C-x)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
767 (eq (aref res 1) ?\()
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
768 (eq (aref res (- (length res) 2)) ?\C-x)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
769 (eq (aref res (- (length res) 1)) ?\)))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
770 (setq res (edmacro-subseq res 2 -2)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
771 (if (and (not need-vector)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
772 (loop for ch across res
29060
26c9122ca008 (edmacro-parse-keys): Return vector if any elements are invalid
Dave Love <fx@gnu.org>
parents: 23945
diff changeset
773 always (and (char-valid-p ch)
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
774 (let ((ch2 (logand ch (lognot ?\M-\^@))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
775 (and (>= ch2 0) (<= ch2 127))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
776 (concat (loop for ch across res
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
777 collect (if (= (logand ch ?\M-\^@) 0)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
778 ch (+ ch 128))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
779 res)))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
780
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
781 (provide 'edmacro)
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 258
diff changeset
782
52401
695cf19ef79e Add arch taglines
Miles Bader <miles@gnu.org>
parents: 52131
diff changeset
783 ;;; arch-tag: 726807b4-3ae6-49de-b0ae-b9590973e0d7
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 258
diff changeset
784 ;;; edmacro.el ends here