1
Fork 0
mirror of git://git.sv.gnu.org/emacs.git synced 2026-01-30 04:10:54 -08:00

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.
This commit is contained in:
Stefan Monnier 2023-02-24 14:18:24 -05:00
parent 926e3fb3be
commit a129f25772
3 changed files with 27 additions and 40 deletions

View file

@ -376,14 +376,22 @@ and `kmacro-counter-format'.")
(defvar kmacro-view-last-item nil)
(defvar kmacro-view-item-no 0)
(defun kmacro--to-vector (object)
"Normalize an old-style key sequence to the vector form."
(if (not (stringp object))
object
(let ((vec (string-to-vector object)))
(unless (multibyte-string-p object)
(dotimes (i (length vec))
(let ((k (aref vec i)))
(when (> k 127)
(setf (aref vec i) (+ k ?\M-\C-@ -128))))))
vec)))
(autoload 'macro--string-to-vector "macros")
(defun kmacro-ring-head ()
"Return pseudo head element in macro ring."
(and last-kbd-macro
(kmacro (if (stringp last-kbd-macro)
(macro--string-to-vector last-kbd-macro)
last-kbd-macro)
(kmacro (kmacro--to-vector last-kbd-macro)
kmacro-counter kmacro-counter-format-start)))
@ -843,10 +851,8 @@ KEYS should be a vector or a string that obeys `key-valid-p'."
(setq format (nth 2 mac))
(setq counter (nth 1 mac))
(setq mac (nth 0 mac)))
(when (stringp mac)
;; `kmacro' interprets a string according to `key-parse'.
(setq mac (macro--string-to-vector mac)))
(kmacro mac counter format)))
;; `kmacro' interprets a string according to `key-parse'.
(kmacro (kmacro--to-vector mac) counter format)))
(defun kmacro-extract-lambda (mac)
"Extract kmacro from a kmacro lambda form."
@ -862,8 +868,6 @@ KEYS should be a vector or a string that obeys `key-valid-p'."
(cl-defmethod cl-print-object ((object kmacro) stream)
(princ "#f(kmacro " stream)
(require 'macros)
(declare-function macros--insert-vector-macro "macros" (definition))
(let ((vecdef (kmacro--keys object))
(counter (kmacro--counter object))
(format (kmacro--format object)))
@ -945,20 +949,15 @@ Such a \"function\" cannot be called from Lisp, but it is a valid editor command
(put symbol 'kmacro t))
(cl-defstruct (kmacro-register
(:constructor nil)
(:constructor kmacro-make-register (macro)))
macro)
(cl-defmethod register-val-jump-to ((km kmacro) arg)
(funcall km arg)) ;FIXME: η-reduce?
(cl-defmethod register-val-jump-to ((data kmacro-register) _arg)
(kmacro-call-macro current-prefix-arg nil nil (kmacro-register-macro data)))
(cl-defmethod register-val-describe ((km kmacro) _verbose)
(princ (format "a keyboard macro:\n %s"
(key-description (kmacro--keys km)))))
(cl-defmethod register-val-describe ((data kmacro-register) _verbose)
(princ (format "a keyboard macro:\n %s"
(key-description (kmacro-register-macro data)))))
(cl-defmethod register-val-insert ((data kmacro-register))
(insert (format-kbd-macro (kmacro-register-macro data))))
(cl-defmethod register-val-insert ((km kmacro))
(insert (key-description (kmacro--keys km))))
(defun kmacro-to-register (r)
"Store the last keyboard macro in register R.
@ -968,7 +967,7 @@ Interactively, reads the register using `register-read-with-preview'."
(progn
(or last-kbd-macro (error "No keyboard macro defined"))
(list (register-read-with-preview "Save to register: "))))
(set-register r (kmacro-make-register last-kbd-macro)))
(set-register r (kmacro-ring-head)))
(defun kmacro-view-macro (&optional _arg)

View file

@ -46,16 +46,6 @@
" ")
?\]))
(defun macro--string-to-vector (str)
"Convert an old-style string key sequence to the vector form."
(let ((vec (string-to-vector str)))
(unless (multibyte-string-p str)
(dotimes (i (length vec))
(let ((k (aref vec i)))
(when (> k 127)
(setf (aref vec i) (+ k ?\M-\C-@ -128))))))
vec))
;;;###autoload
(defun insert-kbd-macro (macroname &optional keys)
"Insert in buffer the definition of kbd macro MACRONAME, as Lisp code.
@ -88,10 +78,8 @@ use this command, and then save the file."
(insert "(defalias '"))
(prin1 macroname (current-buffer))
(insert "\n ")
(when (stringp definition)
(setq definition (macro--string-to-vector definition)))
(if (vectorp definition)
(setq definition (kmacro definition)))
(when (or (stringp definition) (vectorp definition))
(setq definition (kmacro (kmacro--to-vector definition))))
(if (kmacro-p definition)
(let ((vecdef (kmacro--keys definition))
(counter (kmacro--counter definition))

View file

@ -128,9 +128,9 @@ end_kbd_macro (void)
update_mode_lines = 20;
kset_last_kbd_macro
(current_kboard,
make_event_array ((current_kboard->kbd_macro_end
- current_kboard->kbd_macro_buffer),
current_kboard->kbd_macro_buffer));
Fvector ((current_kboard->kbd_macro_end
- current_kboard->kbd_macro_buffer),
current_kboard->kbd_macro_buffer));
}
DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p",