diff --git a/.config.d/99-misc.el b/.config.d/99-misc.el index 36041d8..43ddea3 100644 --- a/.config.d/99-misc.el +++ b/.config.d/99-misc.el @@ -46,4 +46,42 @@ translation at point." (keymap-set mode-specific-map "C-m" margins-map) (keymap-set mode-specific-map "b" 'my-insert-buffer-name) +(defun my-preview-macro-expansion (arg) + "Previews the expansion of a macro in a temporary window. + +If the prefix argument ARG is non-nil, a full recursive +macroexpansion (`macroexpand-all') will we performed, otherwise only one +macroexpansion step (`macroexpand-1') will be done. + +If there is an active region selected, only its contents will be read +for the expansion. See also `pp-macroexpand-expression'." + (interactive "P") + (let ((obj)) + (if (use-region-p) + (setq obj + (with-demoted-errors + "Failed to read form: %S" + (read (buffer-substring (region-beginning) (region-end))))) + (save-excursion + (setq obj (with-demoted-errors + "Failed to read form: %S" + (read (current-buffer)))))) + (if obj + (let ((inhibit-read-only t)) + (with-current-buffer-window "*Macro Expansion*" nil nil + (if arg + (pp (macroexpand-all obj)) + (pp (macroexpand-1 obj))) + (emacs-lisp-mode) + (keymap-local-set (kbd "q") #'quit-window)) + (select-window (get-buffer-window "*Macro Expansion*")))))) + +(with-eval-after-load 'embark + (setq embark-pre-action-hooks + (add-to-list 'embark-pre-action-hooks '(my-preview-macro-expansion embark--beginning-of-target))) + (keymap-set embark-expression-map "m" 'my-preview-macro-expansion) + (keymap-set embark-expression-map "M" 'pp-macroexpand-expression) + (keymap-set embark-defun-map "m" 'my-preview-macro-expansion) + (keymap-set embark-defun-map "M" 'pp-macroexpand-expression)) + ;;; 99-misc.el ends here