1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
2 ;;;; What this code does: put your cursor at a ParenScript expression
3 ;;;; in a ParenScript file and type 'C-c j' to bring up a buffer with
4 ;;;; the resulting Javascript code. This feature depends on Slime (and
5 ;;;; your ParenScript buffer being in slime-mode; it doesn't work in
6 ;;;; slime-repl-mode, which is intentional). It is inspired (and works
7 ;;;; like) the Slime 'C-c M-m' macroexpansion feature.
9 ;;;; Copyright 2007, Vladimir Sedach. See the COPYING file in the
10 ;;;; above directory for licensing information.
12 ;;; The code below is a generic facility for adding "macroexpand-like" buffer expansion to Slime
13 (defun slime-eval-custom-expand (expander exp-str package buffer-name buffer-mode printer
)
14 (lexical-let ((package package
)
15 (buffer-name buffer-name
)
16 (buffer-mode buffer-mode
)
19 (list 'swank
:eval-and-grab-output
(format "(%s %s)" expander exp-str
))
21 (with-current-buffer (slime-get-temp-buffer-create buffer-name
:mode buffer-mode
:reusep t
)
22 (setq slime-buffer-connection
(slime-connection))
23 (setq slime-buffer-package package
)
24 (setq buffer-read-only nil
)
26 (insert (funcall printer
(second expansion
)))
27 (setq buffer-read-only t
)
28 (font-lock-fontify-buffer)))
31 (defun* slime-add-custom-expander
(key expander buffer-name
&optional
(buffer-mode 'slime-mode
) (printer #'identity
))
32 (slime-define-key key
(lexical-let ((expander expander
)
33 (buffer-name buffer-name
)
34 (buffer-mode buffer-mode
)
38 (slime-eval-custom-expand expander
39 (first (slime-sexp-at-point-for-macroexpansion))
40 (slime-current-package)
44 :prefixed t
:inferior t
))
46 ;;; This actually defines the expander. If the code above belongs in slime.el, the code below would go into .emacs
47 (slime-add-custom-expander "j" 'ps
:ps
"*ParenScript generated Javascript*" 'c-mode
#'read
)