[slime-devel] propose changes to `slime-marcoexpand-again' with patch

MON KEY monkey at sandpframing.com
Mon May 9 19:48:58 UTC 2011


Apropos the bug report here:
 https://bugs.launchpad.net/slime/+bug/777405

I'd like to propose the following changes to slime.el's macroexpansion
functions:
 `slime-macroexpand-again'
 `slime-initialize-macroexpansion-buffer'
 `slime-create-macroexpansion-buffer'

These changes make explicit which buffer should be current during
calls to `slime-macroexpand-again' and are IMO in keeping with the
intent of the command.

The changes to `slime-initialize-macroexpansion-buffer' are w/r/t its
optional arg BUFFER and provide additional checks to prevent
`erase-buffer' and setting `buffer-undo-list' to nil when
current-buffer is not "*slime-macroexpansion*".

I've included the proposed changes in full below as well as a diff of slime.el
from quicklisp 20110320 with slime.el from CVS 1.1364

;;; ==============================

(defun slime-macroexpand-again ()
 "Reperform the last macroexpansion."
 (interactive)
 (slime-eval-async slime-eval-macroexpand-expression
   (slime-rcurry #'slime-initialize-macroexpansion-buffer
                 (slime-buffer-name :macroexpansion))))

(defun slime-initialize-macroexpansion-buffer (expansion &optional buffer)
  (let ((expansion-buffer
         (or (and buffer (get-buffer-create buffer))
             (slime-create-macroexpansion-buffer))))
    (with-current-buffer expansion-buffer
      (pop-to-buffer (current-buffer))
      (let ((inhibit-read-only t))
        (if (eq (current-buffer) (get-buffer (slime-buffer-name
:macroexpansion)))
            (progn
              ;; Get rid of undo information from previous expansions.
              (setq buffer-undo-list nil)
              (erase-buffer)
              (let ((buffer-undo-list t)) ; Make the initial insertion
not be undoable.
                (insert expansion)
                (font-lock-fontify-buffer)))
          (let ((point-now (point)))
            (save-excursion (insert expansion)
                            (font-lock-fontify-region (point-now)
(point)))))))))

(defun slime-create-macroexpansion-buffer ()
  (let ((name (slime-buffer-name :macroexpansion)))
    (slime-with-popup-buffer (name :package t :connection t
                                   :mode 'lisp-mode)
      (slime-mode 1)
      (slime-macroexpansion-minor-mode 1)
      (setq font-lock-keywords-case-fold-search t)
      (get-buffer name))))

;;; ==============================
--- slime-cvs-1.1364.el	2011-05-09 14:46:38.000000000 -0400
+++ slime-20110320-cvs.el	2011-05-09 15:28:43.000000000 -0400
@@ -4988,22 +4973,30 @@
                       #'slime-initialize-macroexpansion-buffer)))

 (defun slime-macroexpand-again ()
-  "Reperform the last macroexpansion."
-  (interactive)
-  (slime-eval-async slime-eval-macroexpand-expression
-                    (slime-rcurry #'slime-initialize-macroexpansion-buffer
-                                  (current-buffer))))
+ "Reperform the last macroexpansion."
+ (interactive)
+ (slime-eval-async slime-eval-macroexpand-expression
+   (slime-rcurry #'slime-initialize-macroexpansion-buffer
+                 (slime-buffer-name :macroexpansion))))

 (defun slime-initialize-macroexpansion-buffer (expansion &optional buffer)
-  (pop-to-buffer (or buffer (slime-create-macroexpansion-buffer)))
-  (setq buffer-undo-list nil) ; Get rid of undo information from
-                              ; previous expansions.
-  (let ((inhibit-read-only t)
-        (buffer-undo-list t)) ; Make the initial insertion not be undoable.
-    (erase-buffer)
-    (insert expansion)
-    (goto-char (point-min))
-    (font-lock-fontify-buffer)))
+  (let ((expansion-buffer
+         (or (and buffer (get-buffer-create buffer))
+             (slime-create-macroexpansion-buffer))))
+    (with-current-buffer expansion-buffer
+      (pop-to-buffer (current-buffer))
+      (let ((inhibit-read-only t))
+        (if (eq (current-buffer) (get-buffer (slime-buffer-name
:macroexpansion)))
+            (progn
+              ;; Get rid of undo information from previous
expansions.
+              (setq buffer-undo-list nil)
+              (erase-buffer)
+              (let ((buffer-undo-list t)) ; Make the initial
insertion not be undoable.
+                (insert expansion)
+                (font-lock-fontify-buffer)))
+          (let ((point-now (point)))
+            (save-excursion (insert expansion)
+                            (font-lock-fontify-region (point-now)
(point)))))))))

 (defun slime-create-macroexpansion-buffer ()
   (let ((name (slime-buffer-name :macroexpansion)))
@@ -5012,7 +5005,7 @@
       (slime-mode 1)
       (slime-macroexpansion-minor-mode 1)
       (setq font-lock-keywords-case-fold-search t)
-      (current-buffer))))
+      (get-buffer name))))

 (defun slime-eval-macroexpand-inplace (expander)
   "Substitute the sexp at point with its macroexpansion.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: slime.el-diff
Type: application/octet-stream
Size: 2506 bytes
Desc: not available
URL: <https://mailman.common-lisp.net/pipermail/slime-devel/attachments/20110509/c35ba724/attachment.obj>


More information about the slime-devel mailing list