diff options
| author | Stefan Monnier | 2023-02-24 14:18:24 -0500 |
|---|---|---|
| committer | Stefan Monnier | 2023-02-24 14:18:24 -0500 |
| commit | a129f257720dbef9adcaff58862d45ac142f93f6 (patch) | |
| tree | 99b56f2ee6e9ff4b749345efebc074901826b046 | |
| parent | 926e3fb3be5c84e71316c6f184abe05bdb29bff2 (diff) | |
| download | emacs-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.el | 45 | ||||
| -rw-r--r-- | lisp/macros.el | 16 | ||||
| -rw-r--r-- | src/macros.c | 6 |
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 | ||
| 136 | DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p", | 136 | DEFUN ("end-kbd-macro", Fend_kbd_macro, Send_kbd_macro, 0, 2, "p", |