[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/macrostep 9d2c58c 040/110: Add option to expand in a separ
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/macrostep 9d2c58c 040/110: Add option to expand in a separate buffer |
Date: |
Sat, 7 Aug 2021 09:17:58 -0400 (EDT) |
branch: elpa/macrostep
commit 9d2c58c05b7982159e0d3f289a950da2a84ceec1
Author: joddie <jonxfield@gmail.com>
Commit: joddie <jonxfield@gmail.com>
Add option to expand in a separate buffer
Fixes #8.
---
macrostep-test.el | 46 +++++++++++++++++++++++++++++++++++-
macrostep.el | 70 ++++++++++++++++++++++++++++++++++++++++++++-----------
2 files changed, 101 insertions(+), 15 deletions(-)
diff --git a/macrostep-test.el b/macrostep-test.el
index 3363c9b..0d0233c 100644
--- a/macrostep-test.el
+++ b/macrostep-test.el
@@ -19,7 +19,8 @@
(defmacro macrostep-with-text (object &rest forms)
- (declare (indent 1))
+ (declare (indent 1)
+ (debug (&rest form)))
`(with-temp-buffer
(emacs-lisp-mode)
(let ((print-level nil)
@@ -215,6 +216,49 @@
(eq (get-char-property (point) 'font-lock-face)
'macrostep-macro-face))))))
+(ert-deftest macrostep-expand-in-separate-buffer ()
+ (defmacro macrostep-dummy-macro (&rest args)
+ `(expansion of ,@args))
+ (let ((macrostep-expand-in-separate-buffer t))
+ (macrostep-with-text
+ '(progn
+ (first form)
+ (second form)
+ (macrostep-dummy-macro (some (arguments)))
+ (final form))
+ (let ((original-buffer (current-buffer)))
+ (search-forward "(macrostep-dummy-macro")
+ (macrostep-expand)
+ (should (not (equal (current-buffer) original-buffer)))
+ (should macrostep-expansion-buffer)
+ (should (equal (read (copy-marker (point)))
+ '(expansion of (some (arguments)))))))))
+
+(ert-deftest macrostep-expand-macrolet-in-separate-buffer ()
+ (let ((macrostep-expand-in-separate-buffer t))
+ (macrostep-with-text
+ '(cl-macrolet
+ ((dummy-macro-1 (&rest args)
+ `(dummy-macro-2 ,@args))
+ (dummy-macro-2 (&rest args)
+ `(expansion of ,@args)))
+ (dummy-macro-1 (some (arguments))))
+ (let ((original-buffer (current-buffer)))
+ (search-forward "(dummy-macro-1 (some")
+ (goto-char (match-beginning 0))
+ (macrostep-expand)
+ (should (not (equal (current-buffer) original-buffer)))
+ (should macrostep-expansion-buffer)
+ (should (equal (read (copy-marker (point)))
+ '(dummy-macro-2 (some (arguments)))))
+
+ (macrostep-expand)
+ (should (equal (read (copy-marker (point)))
+ '(expansion of (some (arguments)))))
+
+ (macrostep-collapse)
+ (should (equal (read (copy-marker (point)))
+ '(dummy-macro-2 (some (arguments)))))))))
(when noninteractive
(load-file (expand-file-name "macrostep.el"
diff --git a/macrostep.el b/macrostep.el
index f0e5b92..43c6e35 100644
--- a/macrostep.el
+++ b/macrostep.el
@@ -218,9 +218,20 @@
(defvar macrostep-environment nil
"Local macro-expansion environment, including macros declared by
`cl-macrolet'.")
-(make-variable-buffer-local 'macrostep-environment)
-;;; Faces
+(defvar macrostep-expansion-buffer nil
+ "Non-nil if the current buffer is a macro-expansion buffer.")
+(make-variable-buffer-local 'macrostep-expansion-buffer)
+
+(defvar macrostep-outer-environment nil
+ "Outermost macro-expansion environment to use in a dedicated macro-expansion
buffers.
+
+This variable is used to save information about any enclosing
+`cl-macrolet' context when a macro form is expanded in a separate
+buffer.")
+(make-variable-buffer-local 'macrostep-outer-environment)
+
+;;; Customization options and faces
(defgroup macrostep nil
"Interactive macro stepper for Emacs Lisp."
:group 'lisp
@@ -274,6 +285,11 @@
"Face for macros in macro-expanded code."
:group 'macrostep)
+(defcustom macrostep-expand-in-separate-buffer nil
+ "When non-nil, show expansions in a separate buffer instead of inline."
+ :group 'macrostep
+ :type 'boolean)
+
;; Need the following for making the ring of faces
(defun macrostep-make-ring (&rest items)
"Make a ring containing all of ITEMS with no empty slots."
@@ -336,14 +352,18 @@ quit and return to normal editing.
(substitute-command-keys
"\\<macrostep-keymap>Entering macro stepper mode. Use
\\[macrostep-expand] to expand, \\[macrostep-collapse] to collapse,
\\[macrostep-collapse-all] to exit.")))
- ;; Exiting mode: collapse any remaining overlays
- (when macrostep-overlays (macrostep-collapse-all))
- ;; Restore undo info & read-only state
- (setq buffer-undo-list macrostep-saved-undo-list
- buffer-read-only macrostep-saved-read-only
- macrostep-saved-undo-list nil)
- ;; Remove our post-command hook
- (remove-hook 'post-command-hook 'macrostep-command-hook t)))
+ ;; Exiting mode
+ (if macrostep-expansion-buffer
+ ;; Kill dedicated expansion buffers
+ (quit-window t)
+ ;; Collapse any remaining overlays
+ (when macrostep-overlays (macrostep-collapse-all))
+ ;; Restore undo info & read-only state
+ (setq buffer-undo-list macrostep-saved-undo-list
+ buffer-read-only macrostep-saved-read-only
+ macrostep-saved-undo-list nil)
+ ;; Remove our post-command hook
+ (remove-hook 'post-command-hook 'macrostep-command-hook t))))
;; Post-command hook: bail out of macrostep-mode if the user types C-x
;; C-q to make the buffer writable again.
@@ -373,6 +393,22 @@ buffer and expand the next macro form found, if any."
(if (consp sexp)
(error "(%s ...) is not a macro form" (car sexp))
(error "Text at point is not a macro form.")))))
+
+ ;; Create a dedicated macro-expansion buffer and copy the text to
+ ;; be expanded into it, if required
+ (when (and macrostep-expand-in-separate-buffer
+ (not macrostep-expansion-buffer))
+ (let ((buffer
+ (get-buffer-create (generate-new-buffer-name "*macro
expansion*"))))
+ (set-buffer buffer)
+ (emacs-lisp-mode)
+ (setq macrostep-expansion-buffer t)
+ (setq macrostep-outer-environment macrostep-environment)
+ (save-excursion
+ (let ((print-level nil)
+ (print-length nil))
+ (print sexp (current-buffer))))
+ (pop-to-buffer buffer)))
(let* ((inhibit-read-only t)
(expansion (macrostep-expand-1 sexp))
@@ -398,11 +434,13 @@ buffer and expand the next macro form found, if any."
(let ((new-ol
(make-overlay (point)
(scan-sexps (point) 1))))
- ;; move overlay over newline to make it prettier
+ ;; Move overlay over newline to make it prettier
(when (equal (char-after (overlay-end new-ol)) ?\n)
(move-overlay new-ol
(overlay-start new-ol) (+ (overlay-end new-ol) 1)))
- (overlay-put new-ol 'face 'macrostep-expansion-highlight-face)
+ ;; Highlight the overlay in original source buffers only
+ (unless macrostep-expansion-buffer
+ (overlay-put new-ol 'face 'macrostep-expansion-highlight-face))
(overlay-put new-ol 'evaporate t)
(overlay-put new-ol 'priority priority)
(overlay-put new-ol 'macrostep-original-text text)
@@ -533,8 +571,12 @@ lambda expression that returns its expansion."
(enclosing-environment
(macrostep-environment-at-point)))
(append binding-environment enclosing-environment)))
- (`nil nil)
- (_ (macrostep-environment-at-point))))))
+ (`nil
+ (if macrostep-expansion-buffer
+ macrostep-outer-environment
+ nil))
+ (_
+ (macrostep-environment-at-point))))))
(defun macrostep-bindings-to-environment (bindings)
"Return the macro-expansion environment declared by BINDINGS as an alist.
- [nongnu] elpa/macrostep 03d4d7b 096/110: Add basic C macro expansion via cmacexp.el, (continued)
- [nongnu] elpa/macrostep 03d4d7b 096/110: Add basic C macro expansion via cmacexp.el, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 9a6b04a 100/110: Restore Emacs 23 compatibility, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep d48e52b 101/110: Add tests for compiler-macro expansion, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep aa59895 103/110: Add .travis.yml, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 7b2c1f3 108/110: Load all autoloaded macros, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 4d75baf 003/110: Bump version number, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 8a85acc 022/110: Refactor backquote handling and text properties., ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 2d216ba 109/110: Merge pull request #19 from fice-t/autoload, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 83b2a0a 015/110: Tweak visible highlight, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 3f815fb 031/110: Test for normal defmacro expansion, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 9d2c58c 040/110: Add option to expand in a separate buffer,
ELPA Syncer <=
- [nongnu] elpa/macrostep 3f965b0 048/110: Use new `macrostep-macro-start` text property, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep ff3888f 065/110: Use a form-tracking stream rather than gensym substitution, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 0fd292c 006/110: Better README, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 0db08ec 007/110: add Url: header for marmalade, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep aa4736c 067/110: Fix some silly errors, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 0b1c0fe 069/110: Add swank/gray:stream-read-char-no-hang implementation, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep 704f164 091/110: Merge branch 'generic', ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep bf87b7c 095/110: Whitespace cleanup, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep d1e954d 099/110: Attempt to shell out to "indent" in macrostep-c, ELPA Syncer, 2021/08/07
- [nongnu] elpa/macrostep b65cc96 102/110: Makefile tweaks, ELPA Syncer, 2021/08/07