annotate lisp/edmacro.el @ 14854:291cdb9b5e03 libc-960322 libc-960323 libc-960324 libc-960325 libc-960326 libc-960327 libc-960328

(os): sunos[3456] -> sunos[34], sunos[56] have their own entries
author Doug Evans <dje@gnu.org>
date Thu, 21 Mar 1996 23:26:26 +0000
parents fea038c6da68
children e71331297a43
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
7300
cc7cd83ccf3f Update copyright.
Karl Heuer <kwzh@gnu.org>
parents: 5772
diff changeset
3 ;; Copyright (C) 1993, 1994 Free Software Foundation, Inc.
845
213978acbc1e entered into RCS
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 807
diff changeset
4
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
5 ;; Author: Dave Gillespie <daveg@synaptics.com>
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
6 ;; Maintainer: Dave Gillespie <daveg@synaptics.com>
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
7 ;; Version: 2.01
2247
2c7997f249eb Add or correct keywords
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 845
diff changeset
8 ;; Keywords: abbrev
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
9
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
10 ;; This file is part of GNU Emacs.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
11
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
12 ;; GNU Emacs is free software; you can redistribute it and/or modify
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
13 ;; 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
14 ;; the Free Software Foundation; either version 2, or (at your option)
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
15 ;; any later version.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
16
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
17 ;; GNU Emacs is distributed in the hope that it will be useful,
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
21
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
22 ;; 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
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 12955
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 12955
diff changeset
25 ;; Boston, MA 02111-1307, USA.
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
26
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
27 ;;; Commentary:
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
28
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
29 ;;; Usage:
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
30 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
31 ;; The `C-x C-k' (`edit-kbd-macro') command edits a keyboard macro
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
32 ;; 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
33 ;; which should be one of:
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
34 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
35 ;; * RET or `C-x e' (call-last-kbd-macro), to edit the most
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
36 ;; recently defined keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
37 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
38 ;; * `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
39 ;; whose definition is a keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
40 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
41 ;; * `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
42 ;; and install them as the "current" macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
43 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
44 ;; * any key sequence whose definition is a keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
45 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
46 ;; 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
47 ;; more readable format defined by these routines.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
48 ;;
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
49 ;; 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
50 ;; 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
51 ;; 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
52 ;; Lisp functions.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
53
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
54 ;; 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
55 ;; for information about the format of written keyboard macros.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
56
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
57 ;; `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
58 ;; 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
59 ;; 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
60 ;; 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
61 ;; won't hurt anything.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
62
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
63 ;; 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
64 ;; 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
65
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
66 ;; 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
67 ;; 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
68 ;; 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
69 ;; Lucid Emacs.
807
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
70
4f28bd14272c *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 662
diff changeset
71 ;;; Code:
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
72
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
73 (eval-when-compile
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
74 (require 'cl))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
75
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
76 ;;; The user-level commands for editing macros.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
77
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
78 ;;;###autoload (define-key ctl-x-map "\C-k" 'edit-kbd-macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
79
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
80 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
81 (defvar edmacro-eight-bits nil
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
82 "*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
83 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
84
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
85 (defvar edmacro-mode-map nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
86 (unless edmacro-mode-map
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
87 (setq edmacro-mode-map (make-sparse-keymap))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
88 (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
89 (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
90
14464
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
91 (defvar edmacro-store-hook)
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
92 (defvar edmacro-finish-hook)
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
93 (defvar edmacro-original-buffer)
fea038c6da68 (edmacro-original-buffer, edmacro-finish-hook)
Richard M. Stallman <rms@gnu.org>
parents: 14397
diff changeset
94
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 199
diff changeset
95 ;;;###autoload
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
96 (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
97 "Edit a keyboard macro.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
98 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
99 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
100 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
101 its command name.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
102 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
103 (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
104 (when keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
105 (let ((cmd (if (arrayp keys) (key-binding keys) keys))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
106 (mac nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
107 (cond (store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
108 (setq mac keys)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
109 (setq cmd nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
110 ((or (eq cmd 'call-last-kbd-macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
111 (member keys '("\r" [return])))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
112 (or last-kbd-macro
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
113 (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
114 (keyboard-quit))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
115 (setq mac (or last-kbd-macro ""))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
116 (setq cmd 'last-kbd-macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
117 ((eq cmd 'execute-extended-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
118 (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
119 (if (string-equal cmd "")
49d961cdc9d6 (edit-kbd-macro): Reject empty cmd name.
Richard M. Stallman <rms@gnu.org>
parents: 14169
diff changeset
120 (error "No command name given"))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
121 (setq mac (symbol-function cmd)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
122 ((eq cmd 'view-lossage)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
123 (setq mac (recent-keys))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
124 (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
125 ((null cmd)
993431cf1f89 (edit-kbd-macro): Better error messages for undefined keys
Karl Heuer <kwzh@gnu.org>
parents: 10692
diff changeset
126 (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
127 ((symbolp cmd)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
128 (setq mac (symbol-function cmd)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
129 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
130 (setq mac cmd)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
131 (setq cmd nil)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
132 (unless (arrayp mac)
11870
993431cf1f89 (edit-kbd-macro): Better error messages for undefined keys
Karl Heuer <kwzh@gnu.org>
parents: 10692
diff changeset
133 (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
134 (key-description keys)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
135 (message "Formatting keyboard macro...")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
136 (let* ((oldbuf (current-buffer))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
137 (mmac (edmacro-fix-menu-commands mac))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
138 (fmt (edmacro-format-keys mmac 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
139 (fmtv (edmacro-format-keys mmac (not prefix)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
140 (buf (get-buffer-create "*Edit Macro*")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
141 (message "Formatting keyboard macro...done")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
142 (switch-to-buffer buf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
143 (kill-all-local-variables)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
144 (use-local-map edmacro-mode-map)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
145 (setq buffer-read-only nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
146 (setq major-mode 'edmacro-mode)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
147 (setq mode-name "Edit Macro")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
148 (set (make-local-variable 'edmacro-original-buffer) oldbuf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
149 (set (make-local-variable 'edmacro-finish-hook) finish-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
150 (set (make-local-variable 'edmacro-store-hook) store-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
151 (erase-buffer)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
152 (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
153 "press C-x k RET to cancel.\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
154 (insert ";; Original keys: " fmt "\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
155 (unless store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
156 (insert "\nCommand: " (if cmd (symbol-name cmd) "none") "\n")
5772
daac61915408 (edit-kbd-macro, edmacro-finish-edit, insert-kbd-macro):
Richard M. Stallman <rms@gnu.org>
parents: 5307
diff changeset
157 (let ((keys (where-is-internal (or cmd mac) '(keymap))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
158 (if keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
159 (while keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
160 (insert "Key: " (edmacro-format-keys (pop keys) 1) "\n"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
161 (insert "Key: none\n"))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
162 (insert "\nMacro:\n\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
163 (save-excursion
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
164 (insert fmtv "\n"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
165 (recenter '(4))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
166 (when (eq mac mmac)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
167 (set-buffer-modified-p nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
168 (run-hooks 'edmacro-format-hook)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
169
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
170 ;;; 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
171 ;;; compatibility.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
172
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
173 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
174 (defun edit-last-kbd-macro (&optional prefix)
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
175 "Edit the most recently defined keyboard macro."
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
176 (interactive "P")
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
177 (edit-kbd-macro 'call-last-kbd-macro prefix))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
178
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
179 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
180 (defun edit-named-kbd-macro (&optional prefix)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
181 "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
182 (interactive "P")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
183 (edit-kbd-macro 'execute-extended-command prefix))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
184
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
185 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
186 (defun read-kbd-macro (start &optional end)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
187 "Read the region as a keyboard macro definition.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
188 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
189 See documentation for `edmacro-mode' for details.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
190 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
191 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
192
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
193 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
194 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
195 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
196 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
197 (interactive "r")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
198 (if (stringp start)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
199 (edmacro-parse-keys start end)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
200 (setq last-kbd-macro (edmacro-parse-keys (buffer-substring start end)))))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
201
258
1e0bc00dca7a *** empty log message ***
Jim Blandy <jimb@redhat.com>
parents: 199
diff changeset
202 ;;;###autoload
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
203 (defun format-kbd-macro (&optional macro verbose)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
204 "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
205 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
206 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
207 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
208 or nil, use a compact 80-column format."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
209 (and macro (symbolp macro) (setq macro (symbol-function macro)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
210 (edmacro-format-keys (or macro last-kbd-macro) verbose))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
211
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
212 ;;; Commands for *Edit Macro* buffer.
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
213
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
214 (defun edmacro-finish-edit ()
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
215 (interactive)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
216 (unless (eq major-mode 'edmacro-mode)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
217 (error
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
218 "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
219 (run-hooks 'edmacro-finish-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
220 (let ((cmd nil) (keys nil) (no-keys nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
221 (top (point-min)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
222 (goto-char top)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
223 (let ((case-fold-search nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
224 (while (cond ((looking-at "[ \t]*\\($\\|;;\\|REM[ \t\n]\\)")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
225 t)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
226 ((looking-at "Command:[ \t]*\\([^ \t\n]*\\)[ \t]*$")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
227 (when edmacro-store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
228 (error "\"Command\" line not allowed in this context"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
229 (let ((str (buffer-substring (match-beginning 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
230 (match-end 1))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
231 (unless (equal str "")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
232 (setq cmd (and (not (equal str "none"))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
233 (intern str)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
234 (and (fboundp cmd) (not (arrayp (symbol-function cmd)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
235 (not (y-or-n-p
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
236 (format "Command %s is already defined; %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
237 cmd "proceed? ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
238 (keyboard-quit))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
239 t)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
240 ((looking-at "Key:\\(.*\\)$")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
241 (when edmacro-store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
242 (error "\"Key\" line not allowed in this context"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
243 (let ((key (edmacro-parse-keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
244 (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 key "")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
247 (if (equal key "none")
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
248 (setq no-keys t)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
249 (push key keys)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
250 (let ((b (key-binding key)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
251 (and b (commandp b) (not (arrayp b))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
252 (or (not (fboundp b))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
253 (not (arrayp (symbol-function b))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
254 (not (y-or-n-p
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
255 (format "Key %s is already defined; %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
256 (edmacro-format-keys key 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
257 "proceed? ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
258 (keyboard-quit))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
259 t)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
260 ((looking-at "Macro:[ \t\n]*")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
261 (goto-char (match-end 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
262 nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
263 ((eobp) nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
264 (t (error "Expected a `Macro:' line")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
265 (forward-line 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
266 (setq top (point)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
267 (let* ((buf (current-buffer))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
268 (str (buffer-substring top (point-max)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
269 (modp (buffer-modified-p))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
270 (obuf edmacro-original-buffer)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
271 (store-hook edmacro-store-hook)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
272 (finish-hook edmacro-finish-hook))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
273 (unless (or cmd keys store-hook (equal str ""))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
274 (error "No command name or keys specified"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
275 (when modp
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
276 (when (buffer-name obuf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
277 (set-buffer obuf))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
278 (message "Compiling keyboard macro...")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
279 (let ((mac (edmacro-parse-keys str)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
280 (message "Compiling keyboard macro...done")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
281 (if store-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
282 (funcall store-hook mac)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
283 (when (eq cmd 'last-kbd-macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
284 (setq last-kbd-macro (and (> (length mac) 0) mac))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
285 (setq cmd nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
286 (when cmd
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
287 (if (= (length mac) 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
288 (fmakunbound cmd)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
289 (fset cmd mac)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
290 (if no-keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
291 (when cmd
5772
daac61915408 (edit-kbd-macro, edmacro-finish-edit, insert-kbd-macro):
Richard M. Stallman <rms@gnu.org>
parents: 5307
diff changeset
292 (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
293 (global-unset-key key)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
294 (when keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
295 (if (= (length mac) 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
296 (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
297 (loop for key in keys do
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
298 (global-set-key key (or cmd mac)))))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
299 (kill-buffer buf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
300 (when (buffer-name obuf)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
301 (switch-to-buffer obuf))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
302 (when finish-hook
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
303 (funcall finish-hook)))))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
304
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
305 (defun edmacro-insert-key (key)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
306 "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
307 (interactive "kKey to insert: ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
308 (if (bolp)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
309 (insert (edmacro-format-keys key t) "\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
310 (insert (edmacro-format-keys key) " ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
311
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
312 (defun edmacro-mode ()
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
313 "\\<edmacro-mode-map>Keyboard Macro Editing mode. Press
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
314 \\[edmacro-finish-edit] to save and exit.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
315 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
316
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
317 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
318
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
319 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
320 \"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
321 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
322
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
323 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
324 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
325 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
326
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
327 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
328 or \"none\" for no key bindings.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
329
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
330 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
331 is stored.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
332
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
333
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
334 Format of keyboard macros during editing:
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
335
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
336 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
337 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
338 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
339 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
340 as in \"foo SPC bar RET\".
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
341
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
342 * 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
343 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
344
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
345 * 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
346 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
347 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
348 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
349 are not required there.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
350
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
351 * 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
352 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
353 with codes above \\377.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
354
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
355 * 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
356 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
357 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
358 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
359 any order: M-C-x = C-M-x.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
360
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
361 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
362 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
363 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
364
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
365 * 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
366
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
367 * Double angle brackets enclose command names: <<next-line>> is
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
368 shorthand for M-x next-line RET.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
369
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
370 * 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
371 comment.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
372
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
373 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
374 number and `*': 3*<right> = <right> <right> <right>, and
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
375 10*foo = foofoofoofoofoofoofoofoofoofoo.
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 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
378 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
379 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
380 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
381 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
382 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
383 doubt, use whitespace."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
384 (interactive)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
385 (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
386 (put 'edmacro-mode 'mode-class 'special)
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
387
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
388 ;;; Formatting a keyboard macro as human-readable text.
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
389
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
390 (defun edmacro-format-keys (macro &optional verbose)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
391 (setq macro (edmacro-fix-menu-commands macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
392 (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
393 (if (current-local-map)
712e13833ad8 (edmacro-format-keys): Cope if local keymap is nil.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
394 (list (current-local-map)))
712e13833ad8 (edmacro-format-keys): Cope if local keymap is nil.
Richard M. Stallman <rms@gnu.org>
parents: 7300
diff changeset
395 (list (current-global-map))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
396 (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
397 ?\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
398 ?\M-7 ?\M-8 ?\M-9))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
399 (mdigs (nthcdr 13 pkeys))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
400 (maxkey (if edmacro-eight-bits 255 127))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
401 (case-fold-search nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
402 (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
403 (rest-mac (vconcat macro [end-macro]))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
404 (res "")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
405 (len 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
406 (one-line (eq verbose 1)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
407 (if one-line (setq verbose nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
408 (when (stringp macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
409 (loop for i below (length macro) do
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
410 (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
411 (incf (aref rest-mac i) (- ?\M-\^@ 128)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
412 (while (not (eq (aref rest-mac 0) 'end-macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
413 (let* ((prefix
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
414 (or (and (integerp (aref rest-mac 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
415 (memq (aref rest-mac 0) mdigs)
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
416 (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
417 '(digit-argument negative-argument))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
418 (let ((i 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
419 (while (memq (aref rest-mac i) (cdr mdigs))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
420 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
421 (and (not (memq (aref rest-mac i) pkeys))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
422 (prog1 (concat "M-" (edmacro-subseq rest-mac 0 i) " ")
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
423 (callf edmacro-subseq rest-mac i)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
424 (and (eq (aref rest-mac 0) ?\C-u)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
425 (eq (key-binding [?\C-u]) 'universal-argument)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
426 (let ((i 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
427 (while (eq (aref rest-mac i) ?\C-u)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
428 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
429 (and (not (memq (aref rest-mac i) pkeys))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
430 (prog1 (loop repeat i concat "C-u ")
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
431 (callf edmacro-subseq rest-mac i)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
432 (and (eq (aref rest-mac 0) ?\C-u)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
433 (eq (key-binding [?\C-u]) 'universal-argument)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
434 (let ((i 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
435 (when (eq (aref rest-mac i) ?-)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
436 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
437 (while (memq (aref rest-mac i)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
438 '(?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
439 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
440 (and (not (memq (aref rest-mac i) pkeys))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
441 (prog1 (concat "C-u " (edmacro-subseq rest-mac 1 i) " ")
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
442 (callf edmacro-subseq rest-mac i)))))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
443 (bind-len (apply 'max 1
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
444 (loop for map in maps
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
445 for b = (lookup-key map rest-mac)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
446 when b collect b)))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
447 (key (edmacro-subseq rest-mac 0 bind-len))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
448 (fkey nil) tlen tkey
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
449 (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
450 thereis (and (not (integerp b)) b))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
451 (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
452 (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
453 fkey (lookup-key function-key-map tkey))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
454 (loop for map in maps
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
455 for b = (lookup-key map fkey)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
456 when (and (not (integerp b)) b)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
457 do (setq bind-len tlen key tkey)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
458 and return b
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
459 finally do (setq fkey nil)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
460 (first (aref key 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
461 (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
462 for ch = (aref rest-mac i)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
463 while (and (integerp ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
464 (> ch 32) (< ch maxkey) (/= ch 92)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
465 (eq (key-binding (char-to-string ch))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
466 'self-insert-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
467 (or (> i (- (length rest-mac) 2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
468 (not (eq ch (aref rest-mac (+ i 1))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
469 (not (eq ch (aref rest-mac (+ i 2))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
470 finally return i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
471 desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
472 (if (stringp bind) (setq bind nil))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
473 (cond ((and (eq bind 'self-insert-command) (not prefix)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
474 (> text 1) (integerp first)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
475 (> first 32) (<= first maxkey) (/= first 92)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
476 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
477 (if (> text 30) (setq text 30))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
478 (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
479 (when (string-match "^[ACHMsS]-." desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
480 (setq text 2)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
481 (callf substring desc 0 2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
482 (not (string-match
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
483 "^;;\\|^<.*>$\\|^\\\\[0-9]+$\\|^[0-9]+\\*."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
484 desc))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
485 (when (or (string-match "^\\^.$" desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
486 (member desc res-words))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
487 (setq desc (mapconcat 'char-to-string desc " ")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
488 (when verbose
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
489 (setq bind (format "%s * %d" bind text)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
490 (setq bind-len text))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
491 ((and (eq bind 'execute-extended-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
492 (> text bind-len)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
493 (memq (aref rest-mac text) '(return 13))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
494 (progn
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
495 (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
496 (commandp (intern-soft desc))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
497 (if (commandp (intern-soft desc)) (setq bind desc))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
498 (setq desc (format "<<%s>>" desc))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
499 (setq bind-len (1+ text)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
500 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
501 (setq desc (mapconcat
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
502 (function
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
503 (lambda (ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
504 (cond
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
505 ((integerp ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
506 (concat
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
507 (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
508 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
509 ?\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
510 when (/= (logand ch bit) 0)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
511 concat (format "%c-" pf))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
512 (let ((ch2 (logand ch (1- (lsh 1 18)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
513 (cond ((<= ch2 32)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
514 (case ch2
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
515 (0 "NUL") (9 "TAB") (10 "LFD")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
516 (13 "RET") (27 "ESC") (32 "SPC")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
517 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
518 (format "C-%c"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
519 (+ (if (<= ch2 26) 96 64)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
520 ch2)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
521 ((= ch2 127) "DEL")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
522 ((<= ch2 maxkey) (char-to-string ch2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
523 (t (format "\\%o" ch2))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
524 ((symbolp ch)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
525 (format "<%s>" ch))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
526 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
527 (error "Unrecognized item in macro: %s" ch)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
528 (or fkey key) " "))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
529 (if prefix (setq desc (concat prefix desc)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
530 (unless (string-match " " desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
531 (let ((times 1) (pos bind-len))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
532 (while (not (edmacro-mismatch rest-mac rest-mac
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
533 0 bind-len pos (+ bind-len pos)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
534 (incf times)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
535 (incf pos bind-len))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
536 (when (> times 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
537 (setq desc (format "%d*%s" times desc))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
538 (setq bind-len (* bind-len times)))))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
539 (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
540 (if verbose
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
541 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
542 (unless (equal res "") (callf concat res "\n"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
543 (callf concat res desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
544 (when (and bind (or (stringp bind) (symbolp bind)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
545 (callf concat res
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
546 (make-string (max (- 3 (/ (length desc) 8)) 1) 9)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
547 ";; " (if (stringp bind) bind (symbol-name bind))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
548 (setq len 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
549 (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
550 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
551 (callf concat res "\n ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
552 (setq len 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
553 (unless (equal res "")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
554 (callf concat res " ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
555 (incf len)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
556 (callf concat res desc)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
557 (incf len (length desc)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
558 res))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
559
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
560 (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
561 "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
562 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
563 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
564 (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
565 (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
566 (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
567 (if cl-from-end
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
568 (progn
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
569 (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
570 (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
571 (elt cl-seq2 (1- cl-end2))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
572 (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
573 (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
574 (1- cl-end1)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
575 (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
576 (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
577 (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
578 (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
579 (aref cl-seq1 cl-start1))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
580 (if cl-p2 (car cl-p2)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
581 (aref cl-seq2 cl-start2))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
582 (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
583 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
584 (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
585 cl-start1)))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
586
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
587 (defun edmacro-subseq (seq start &optional end)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
588 "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
589 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
590 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
591 (if (stringp seq) (substring seq start end)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
592 (let (len)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
593 (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
594 (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
595 (cond ((listp seq)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
596 (if (> start 0) (setq seq (nthcdr start seq)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
597 (if end
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
598 (let ((res nil))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
599 (while (>= (setq end (1- end)) start)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
600 (cl-push (cl-pop seq) res))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
601 (nreverse res))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
602 (copy-sequence seq)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
603 (t
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
604 (or end (setq end (or len (length seq))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
605 (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
606 (i 0))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
607 (while (< start end)
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
608 (aset res i (aref seq start))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
609 (setq i (1+ i) start (1+ start)))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
610 res))))))
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
611
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
612 (defun edmacro-fix-menu-commands (macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
613 (when (vectorp macro)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
614 (let ((i 0) ev)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
615 (while (< i (length macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
616 (when (consp (setq ev (aref macro i)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
617 (cond ((equal (cadadr ev) '(menu-bar))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
618 (setq macro (vconcat (edmacro-subseq macro 0 i)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
619 (vector 'menu-bar (car ev))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
620 (edmacro-subseq macro (1+ i))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
621 (incf i))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
622 ;; 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
623 ;; info is recorded in macros to make this possible.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
624 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
625 (error "Macros with mouse clicks are not %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
626 "supported by this command"))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
627 (incf i))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
628 macro)
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
629
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
630 ;;; Parsing a human-readable keyboard macro.
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
631
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
632 (defun edmacro-parse-keys (string &optional need-vector)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
633 (let ((case-fold-search nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
634 (pos 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
635 (res []))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
636 (while (and (< pos (length string))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
637 (string-match "[^ \t\n\f]+" string pos))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
638 (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
639 (key nil)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
640 (times 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
641 (setq pos (match-end 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
642 (when (string-match "\\([0-9]+\\)\\*." word)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
643 (setq times (string-to-int (substring word 0 (match-end 1))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
644 (setq word (substring word (1+ (match-end 1)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
645 (cond ((string-match "^<<.+>>$" word)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
646 (setq key (vconcat (if (eq (key-binding [?\M-x])
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
647 'execute-extended-command)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
648 [?\M-x]
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
649 (or (car (where-is-internal
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
650 'execute-extended-command))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
651 [?\M-x]))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
652 (substring word 2 -2) "\r")))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
653 ((and (string-match "^\\(\\([ACHMsS]-\\)*\\)<\\(.+\\)>$" word)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
654 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
655 (setq word (concat (substring word (match-beginning 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
656 (match-end 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
657 (substring word (match-beginning 3)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
658 (match-end 3))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
659 (not (string-match
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
660 "\\<\\(NUL\\|RET\\|LFD\\|ESC\\|SPC\\|DEL\\)$"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
661 word))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
662 (setq key (list (intern word))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
663 ((or (equal word "REM") (string-match "^;;" word))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
664 (setq pos (string-match "$" string pos)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
665 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
666 (let ((orig-word word) (prefix 0) (bits 0))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
667 (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
668 (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
669 '((?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
670 (?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
671 (?s . ?\s-\^@) (?S . ?\S-\^@)))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
672 (incf prefix 2)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
673 (callf substring word 2))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
674 (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
675 (incf bits ?\C-\^@)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
676 (incf prefix)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
677 (callf substring word 1))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
678 (let ((found (assoc word '(("NUL" . "\0") ("RET" . "\r")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
679 ("LFD" . "\n") ("TAB" . "\t")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
680 ("ESC" . "\e") ("SPC" . " ")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
681 ("DEL" . "\177")))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
682 (when found (setq word (cdr found))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
683 (when (string-match "^\\\\[0-7]+$" word)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
684 (loop for ch across word
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
685 for n = 0 then (+ (* n 8) ch -48)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
686 finally do (setq word (vector n))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
687 (cond ((= bits 0)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
688 (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
689 ((and (= bits ?\M-\^@) (stringp word)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
690 (string-match "^-?[0-9]+$" word))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
691 (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
692 ((/= (length word) 1)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
693 (error "%s must prefix a single character, not %s"
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
694 (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
695 ((and (/= (logand bits ?\C-\^@) 0) (stringp word)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
696 (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
697 (setq key (list (+ bits (- ?\C-\^@)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
698 (if (equal word "?") 127
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
699 (logand (aref word 0) 31))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
700 (t
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
701 (setq key (list (+ bits (aref word 0)))))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
702 (when key
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
703 (loop repeat times do (callf vconcat res key)))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
704 (when (and (>= (length res) 4)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
705 (eq (aref res 0) ?\C-x)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
706 (eq (aref res 1) ?\()
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
707 (eq (aref res (- (length res) 2)) ?\C-x)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
708 (eq (aref res (- (length res) 1)) ?\)))
12955
2e80892d4b39 Load cl only during compilation.
Richard M. Stallman <rms@gnu.org>
parents: 11870
diff changeset
709 (setq res (edmacro-subseq res 2 -2)))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
710 (if (and (not need-vector)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
711 (loop for ch across res
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
712 always (and (integerp ch)
10692
58ab3325da3b (edmacro-format-keys, edmacro-parse-keys): Don't presume internal bit layout
Karl Heuer <kwzh@gnu.org>
parents: 9199
diff changeset
713 (let ((ch2 (logand ch (lognot ?\M-\^@))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
714 (and (>= ch2 0) (<= ch2 127))))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
715 (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
716 collect (if (= (logand ch ?\M-\^@) 0)
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
717 ch (+ ch 128))))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
718 res)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
719
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
720 ;;; The following probably ought to go in macros.el:
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
721
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
722 ;;;###autoload
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
723 (defun insert-kbd-macro (macroname &optional keys)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
724 "Insert in buffer the definition of kbd macro NAME, as Lisp code.
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
725 Optional second arg KEYS means also record the keys it is on
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
726 \(this is the prefix argument, when calling interactively).
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
727
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
728 This Lisp code will, when executed, define the kbd macro with the same
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
729 definition it has now. If you say to record the keys, the Lisp code
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
730 will also rebind those keys to the macro. Only global key bindings
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
731 are recorded since executing this Lisp code always makes global
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
732 bindings.
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
733
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
734 To save a kbd macro, visit a file of Lisp code such as your `~/.emacs',
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
735 use this command, and then save the file."
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
736 (interactive "CInsert kbd macro (name): \nP")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
737 (let (definition)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
738 (if (string= (symbol-name macroname) "")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
739 (progn
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
740 (setq definition (format-kbd-macro))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
741 (insert "(setq last-kbd-macro"))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
742 (setq definition (format-kbd-macro macroname))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
743 (insert (format "(defalias '%s" macroname)))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
744 (if (> (length definition) 50)
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
745 (insert " (read-kbd-macro\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
746 (insert "\n (read-kbd-macro "))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
747 (prin1 definition (current-buffer))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
748 (insert "))\n")
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
749 (if keys
5772
daac61915408 (edit-kbd-macro, edmacro-finish-edit, insert-kbd-macro):
Richard M. Stallman <rms@gnu.org>
parents: 5307
diff changeset
750 (let ((keys (where-is-internal macroname '(keymap))))
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
751 (while keys
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
752 (insert (format "(global-set-key %S '%s)\n" (car keys) macroname))
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
753 (setq keys (cdr keys)))))))
109
d649664df7e0 Initial revision
David Lawrence <tale@gnu.org>
parents:
diff changeset
754
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
755 (provide 'edmacro)
662
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 258
diff changeset
756
8a533acedb77 *** empty log message ***
Eric S. Raymond <esr@snark.thyrsus.com>
parents: 258
diff changeset
757 ;;; edmacro.el ends here
4754
463663a999ee Total rewrite by Gillespie.
Richard M. Stallman <rms@gnu.org>
parents: 2247
diff changeset
758