1 ;; SPDX-License-Identifier: BSD-3-Clause
3 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
4 ;;;; This is an extension to SLIME that is inspired by (and works
5 ;;;; like) the SLIME 'C-c M-m' macroexpansion feature.
7 ;;;; After loading, 'C-c j' (PS) or 'C-c d' (PS-DOC) at a ParenScript
8 ;;;; expression in a slime-mode buffer will bring up a buffer with the
9 ;;;; resulting Javascript code. Note that the extension does not work
10 ;;;; in slime-repl-mode, which is intentional.
12 ;;;; Copyright 2007, Vladimir Sedach. See the COPYING file in the
13 ;;;; Parenscript distribution for licensing information.
15 ;;; The code below is a generic facility for adding "macroexpand-like" buffer expansion to Slime
16 (defun slime-eval-custom-expand (expander exp-str package buffer-name buffer-mode printer
)
17 (lexical-let ((package package
)
18 (buffer-name buffer-name
)
19 (buffer-mode buffer-mode
)
22 (list 'swank
:eval-and-grab-output
(format "(%s %s)" expander exp-str
))
24 (slime-with-popup-buffer (buffer-name)
26 (setq buffer-read-only nil
)
28 (insert (funcall printer
(second expansion
)))
29 (setq buffer-read-only t
)
30 (font-lock-fontify-buffer)))
33 (defun* slime-add-custom-expander
(key expander buffer-name
&optional
(buffer-mode 'slime-mode
) (printer #'identity
))
34 (define-key slime-parent-map
(concat "\C-c" key
)
35 (lexical-let ((expander expander
)
36 (buffer-name buffer-name
)
37 (buffer-mode buffer-mode
)
41 (slime-eval-custom-expand expander
43 (slime-current-package)
48 ;;; This actually defines the expander. If the code above belongs in slime.el, the code below would go into .emacs
50 (slime-add-custom-expander (car x
)
52 "*Parenscript generated Javascript*"
53 (if (featurep 'javascript-mode
) 'javascript-mode
'c-mode
)
55 '(("j" . ps
:ps
) ("d" . ps
:ps-doc
)))