;;; this would go into slime.el (defun slime-eval-custom-expand (expander exp-str package buffer-name buffer-mode printer) (lexical-let ((package package) (buffer-name buffer-name) (buffer-mode buffer-mode) (printer printer)) (slime-eval-async (list 'swank:eval-and-grab-output (format "(%s %s)" expander exp-str)) (lambda (expansion) (with-current-buffer (slime-get-temp-buffer-create buffer-name :mode buffer-mode :reusep t) (setq slime-buffer-connection (slime-connection)) (setq slime-buffer-package package) (setq buffer-read-only nil) (erase-buffer) (insert (funcall printer (second expansion))) (setq buffer-read-only t) (font-lock-fontify-buffer))) package))) (defun* slime-add-custom-expander (key expander buffer-name &optional (buffer-mode 'slime-mode) (printer #'identity)) (slime-define-key key (lexical-let ((expander expander) (buffer-name buffer-name) (buffer-mode buffer-mode) (printer printer)) (lambda (&rest _) (interactive "P") (slime-eval-custom-expand expander (first (slime-sexp-at-point-for-macroexpansion)) (slime-current-package) buffer-name buffer-mode printer))) :prefixed t :inferior t)) ;;; This stuff would go into .emacs (slime-add-custom-expander "j" 'ps:ps "*ParenScript generated Javascript*" 'js-mode #'read) (provide 'js-expander)