aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Monnier2023-02-24 14:18:24 -0500
committerStefan Monnier2023-02-24 14:18:24 -0500
commita129f257720dbef9adcaff58862d45ac142f93f6 (patch)
tree99b56f2ee6e9ff4b749345efebc074901826b046
parent926e3fb3be5c84e71316c6f184abe05bdb29bff2 (diff)
downloademacs-a129f257720dbef9adcaff58862d45ac142f93f6.tar.gz
emacs-a129f257720dbef9adcaff58862d45ac142f93f6.zip
kmacro: Simplify register code and recent change
While reviewing uses of `last-kbd-macro` for more problems like those of bug#61700 I noticed that we don't need the `kmacro-register` type any more (we can directly use the new `kmacro` type instead). Also `macros.el` requires `kmacro` so rather than autoload `macro--string-to-vector` it's simpler to move the function to `kmacro.el`. And while at it fold into it the `stringp` test that's used before every call to that function. * lisp/kmacro.el (kmacro--to-vector): Rename from `macro--string-to-vector`, move from `mcros.el`, and make it work for vectors. (kmacro-ring-head, kmacro-lambda-form): Simplify accordingly. (cl-print-object): Remove unused declaration. (kmacro-register): Delete type. Use `kmacro` objects instead. (register-val-jump-to, register-val-describe, register-val-insert): Rewrite accordingly. (kmacro-to-register): Put the `kmacro` object. * lisp/macros.el (macro--string-to-vector): Move to `kmacro.el`. (insert-kbd-macro): Use `kmacro--to-vector`. * src/macros.c (end_kbd_macro): Always generate a vector.
-rw-r--r--lisp/kmacro.el45
-rw-r--r--lisp/macros.el16
-rw-r--r--src/macros.c6
3 files changed, 27 insertions, 40 deletions
diff --git a/lisp/kmacro.el b/lisp/kmacro.el
index aec4b805474..64aa7a27bde 100644
--- a/lisp/kmacro.el
+++ b/lisp/kmacro.el
@@ -376,14 +376,22 @@ and `kmacro-counter-format'.")
376(defvar kmacro-view-last-item nil) 376(defvar kmacro-view-last-item nil)
377(defvar kmacro-view-item-no 0) 377(defvar kmacro-view-item-no 0)
378 378
379(defun kmacro--to-vector (object)
380 "Normalize an old-style key sequence to the vector form."
381 (if (not (stringp object))
382 object
383 (let ((vec (string-to-vector object)))
384 (unless (multibyte-string-p object)
385 (dotimes (i (length vec))
386 (let ((k (aref vec i)))
387 (when (> k 127)
388 (setf (aref vec i) (+ k ?\M-\C-@ -128))))))
389 vec)))
379 390
380(autoload 'macro--string-to-vector "macros")
381(defun kmacro-ring-head () 391(defun kmacro-ring-head ()
382 "Return pseudo head element in macro ring." 392 "Return pseudo head element in macro ring."
383 (and last-kbd-macro 393 (and last-kbd-macro
384 (kmacro (if (stringp last-kbd-macro) 394 (kmacro (kmacro--to-vector last-kbd-macro)
385 (macro--string-to-vector last-kbd-macro)
386 last-kbd-macro)
387 kmacro-counter kmacro-counter-format-start))) 395 kmacro-counter kmacro-counter-format-start)))
388 396
389 397
@@ -843,10 +851,8 @@ KEYS should be a vector or a string that obeys `key-valid-p'."
843 (setq format (nth 2 mac)) 851 (setq format (nth 2 mac))
844 (setq counter (nth 1 mac)) 852 (setq counter (nth 1 mac))
845 (setq mac (nth 0 mac))) 853 (setq mac (nth 0 mac)))
846 (when (stringp mac) 854 ;; `kmacro' interprets a string according to `key-parse'.
847 ;; `kmacro' interprets a string according to `key-parse'. 855 (kmacro (kmacro--to-vector mac) counter format)))
848 (setq mac (macro--string-to-vector mac)))
849 (kmacro mac counter format)))
850 856
851(defun kmacro-extract-lambda (mac) 857(defun kmacro-extract-lambda (mac)
852 "Extract kmacro from a kmacro lambda form." 858 "Extract kmacro from a kmacro lambda form."
@@ -862,8 +868,6 @@ KEYS should be a vector or a string that obeys `key-valid-p'."
862 868
863(cl-defmethod cl-print-object ((object kmacro) stream) 869(cl-defmethod cl-print-object ((object kmacro) stream)
864 (princ "#f(kmacro " stream) 870 (princ "#f(kmacro " stream)
865 (require 'macros)
866 (declare-function macros--insert-vector-macro "macros" (definition))
867 (let ((vecdef (kmacro--keys object)) 871 (let ((vecdef (kmacro--keys object))
868 (counter (kmacro--counter object)) 872 (counter (kmacro--counter object))
869 (format (kmacro--format object))) 873 (format (kmacro--format object)))
@@ -945,20 +949,15 @@ Such a \"function\" cannot be called from Lisp, but it is a valid editor command
945 (put symbol 'kmacro t)) 949 (put symbol 'kmacro t))
946 950
947 951
948(cl-defstruct (kmacro-register 952(cl-defmethod register-val-jump-to ((km kmacro) arg)
949 (:constructor nil) 953 (funcall km arg)) ;FIXME: η-reduce?
950 (:constructor kmacro-make-register (macro)))
951 macro)
952 954
953(cl-defmethod register-val-jump-to ((data kmacro-register) _arg) 955(cl-defmethod register-val-describe ((km kmacro) _verbose)
954 (kmacro-call-macro current-prefix-arg nil nil (kmacro-register-macro data))) 956 (princ (format "a keyboard macro:\n %s"
957 (key-description (kmacro--keys km)))))
955 958
956(cl-defmethod register-val-describe ((data kmacro-register) _verbose) 959(cl-defmethod register-val-insert ((km kmacro))
957 (princ (format "a keyboard macro:\n %s" 960 (insert (key-description (kmacro--keys km))))
958 (key-description (kmacro-register-macro data)))))
959
960(cl-defmethod register-val-insert ((data kmacro-register))
961 (insert (format-kbd-macro (kmacro-register-macro data))))
962 961
963(defun kmacro-to-register (r) 962(defun kmacro-to-register (r)
964 "Store the last keyboard macro in register R. 963 "Store the last keyboard macro in register R.
@@ -968,7 +967,7 @@ Interactively, reads the register using `register-read-with-preview'."
968 (progn 967 (progn
969 (or last-kbd-macro (error "No keyboard macro defined")) 968 (or last-kbd-macro (error "No keyboard macro defined"))
970 (list (register-read-with-preview "Save to register: ")))) 969 (list (register-read-with-preview "Save to register: "))))
971 (set-register r (kmacro-make-register last-kbd-macro))) 970 (set-register r (kmacro-ring-head)))
972 971
973 972
974(defun kmacro-view-macro (&optional _arg) 973(defun kmacro-view-macro (&optional _arg)
diff --git a/lisp/macros.el b/lisp/macros.el
index 59c7796551f..98ee3dc52f9 100644
--- a/lisp/macros.el
+++ b/lisp/macros.el
@@ -46,16 +46,6 @@
46 " ") 46 " ")
47 ?\])) 47 ?\]))
48 48
49(defun macro--string-to-vector (str)
50 "Convert an old-style string key sequence to the vector form."
51 (let ((vec (string-to-vector str)))
52 (unless (multibyte-string-p str)
53 (dotimes (i (length vec))
54 (let ((k (aref vec i)))
55 (when (> k 127)
56 (setf (aref vec i) (+ k ?\M-\C-@ -128))))))
57 vec))
58
59;;;###autoload 49;;;###autoload
60(defun insert-kbd-macro (macroname &optional keys) 50(defun insert-kbd-macro (macroname &optional keys)
61 "Insert in buffer the definition of kbd macro MACRONAME, as Lisp code. 51 "Insert in buffer the definition of kbd macro MACRONAME, as Lisp code.
@@ -88,10 +78,8 @@ use this command, and then save the file."
88 (insert "(defalias '")) 78 (insert "(defalias '"))
89 (prin1 macroname (current-buffer)) 79 (prin1 macroname (current-buffer))
90 (insert "\n ") 80 (insert "\n ")
91 (when (stringp definition) 81 (when (or (stringp definition) (vectorp definition))
92 (setq definition (macro--string-to-vector definition))) 82 (setq definition (kmacro (kmacro--to-vector definition))))
93 (if (vectorp definition)
94 (setq definition (kmacro definition)))
95 (if (kmacro-p definition) 83 (if (kmacro-p definition)
96 (let ((vecdef (kmacro--keys definition)) 84 (let ((vecdef (kmacro--keys definition))
97 (counter (kmacro--counter definition)) 85 (counter (kmacro--counter definition))
diff --git a/src/macros.c b/src/macros.c
index 0db0af89a71..d1541d2817f 100644
--- a/src/macros.c
+++ b/src/macros.c
@@ -128,9 +128,9 @@ end_kbd_macro (void)
128 update_mode_lines = 20; 128 update_mode_lines = 20;
129 kset_last_kbd_macro 129 kset_last_kbd_macro
130 (current_kboard, 130 (current_kboard,
131 make_event_array ((current_kboard->kbd_macro_end 131 Fvector ((current_kboard->kbd_macro_end
132 - current_kboard->kbd_macro_buffer), 132 - current_kboard->kbd_macro_buffer),
133 current_kboard->kbd_macro_buffer)); 133 current_kboard->kbd_macro_buffer));
134} 134}
135 135
136DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p", 136DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p",