Clarified that the license is BSD 3-clause. Added SPDX identifiers
[parenscript.git] / extras / js-expander.el
blob0d38282a93f0207cea13ee71f5188640f11fc8cc
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)
20 (printer printer))
21 (slime-eval-async
22 (list 'swank:eval-and-grab-output (format "(%s %s)" expander exp-str))
23 (lambda (expansion)
24 (slime-with-popup-buffer (buffer-name)
25 (funcall buffer-mode)
26 (setq buffer-read-only nil)
27 (erase-buffer)
28 (insert (funcall printer (second expansion)))
29 (setq buffer-read-only t)
30 (font-lock-fontify-buffer)))
31 package)))
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)
38 (printer printer))
39 (lambda (&rest _)
40 (interactive "P")
41 (slime-eval-custom-expand expander
42 (slime-sexp-at-point)
43 (slime-current-package)
44 buffer-name
45 buffer-mode
46 printer)))))
48 ;;; This actually defines the expander. If the code above belongs in slime.el, the code below would go into .emacs
49 (map nil (lambda (x)
50 (slime-add-custom-expander (car x)
51 (cdr x)
52 "*Parenscript generated Javascript*"
53 (if (featurep 'javascript-mode) 'javascript-mode 'c-mode)
54 #'read))
55 '(("j" . ps:ps) ("d" . ps:ps-doc)))