From fe7420c67f18195aa85853dbfc6afcdf65e9d5a0 Mon Sep 17 00:00:00 2001 From: Noam Postavsky Date: Sun, 5 May 2019 13:24:15 -0400 Subject: [PATCH] Improve printing for named keyboard macros (Bug#35486) * lisp/macros.el (macros--insert-vector-macro): New function, extracted from insert-kbd-macro. (insert-kbd-macro): Use it and kmacro-extract-lambda to produce nicer expressions for macros produced by kmacro-lambda-form. --- lisp/kmacro.el | 1 + lisp/macros.el | 34 +++++++++++++++++++++------------- 2 files changed, 22 insertions(+), 13 deletions(-) diff --git a/lisp/kmacro.el b/lisp/kmacro.el index fc34e16708..01dc058614 100644 --- a/lisp/kmacro.el +++ b/lisp/kmacro.el @@ -776,6 +776,7 @@ (defun kmacro-end-call-mouse (event) ;; letters and digits, provided that we inhibit the keymap while ;; executing the macro later on (but that's controversial...) +;;;###autoload (defun kmacro-lambda-form (mac &optional counter format) "Create lambda form for macro bound to symbol or key." (if counter diff --git a/lisp/macros.el b/lisp/macros.el index ba6a840d60..4b38506d8a 100644 --- a/lisp/macros.el +++ b/lisp/macros.el @@ -36,6 +36,16 @@ (require 'kmacro) ;;;###autoload (defalias 'name-last-kbd-macro #'kmacro-name-last-macro) +(defun macros--insert-vector-macro (definition) + "Print DEFINITION, a vector, into the current buffer." + (dotimes (i (length definition)) + (let ((char (aref definition i))) + (insert (if (zerop i) ?\[ ?\s)) + (if (characterp char) + (princ (prin1-char char) (current-buffer)) + (prin1 char (current-buffer))))) + (insert ?\])) + ;;;###autoload (defun insert-kbd-macro (macroname &optional keys) "Insert in buffer the definition of kbd macro MACRONAME, as Lisp code. @@ -111,19 +121,17 @@ (defun insert-kbd-macro (macroname &optional keys) (delete-region (point) (1+ (point))) (insert "\\M-\\C-?")))))) (if (vectorp definition) - (let ((len (length definition)) (i 0) char) - (while (< i len) - (insert (if (zerop i) ?\[ ?\s)) - (setq char (aref definition i) - i (1+ i)) - (if (not (numberp char)) - (prin1 char (current-buffer)) - (princ (prin1-char char) (current-buffer)))) - (insert ?\])) - ;; FIXME: For kmacros, we shouldn't write the (lambda ...) - ;; gunk but instead we should write something more abstract like - ;; (kmacro-create [] 0 "%d"). - (prin1 definition (current-buffer)))) + (macros--insert-vector-macro definition) + (pcase (kmacro-extract-lambda definition) + (`(,vecdef ,counter ,format) + (insert "(kmacro-lambda-form ") + (macros--insert-vector-macro vecdef) + (insert " ") + (prin1 counter (current-buffer)) + (insert " ") + (prin1 format (current-buffer)) + (insert ")")) + (_ (prin1 definition (current-buffer)))))) (insert ")\n") (if keys (let ((keys (or (where-is-internal (symbol-function macroname) -- 2.11.0