;;; 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) (slime-with-popup-buffer (buffer-name package t) (funcall buffer-mode) (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)) (define-key slime-mode-map (vector ?\C-c 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))))) ;;; This stuff would go into .emacs (slime-add-custom-expander ?j 'ps:ps "*ParenScript generated Javascript*" 'js-mode #'read) (provide 'js-expander)