Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

nrepl.el: how to eval clojure buffer form to nrepl buffer instead of echo area?

Tags:

emacs

clojure

I'm using nrepl.el from git (0.1.6-preview, via el-get recipe), and I would like clojure buffer evals: C-x C-e, C-M-x, C-c C-r for form, top-level form and region respectively, to send themselves to the nrepl buffer and evaluate there, rather than the default behavior of evaluating off-screen with results returned to the echo area.

Is there any way to do this, or is there another set of keybindings for this purpose that I'm not recognizing by their descriptions?

Thanks.

like image 696
Jeff Kowalczyk Avatar asked Oct 27 '12 18:10

Jeff Kowalczyk


2 Answers

The behavior you described is not presently supported in nrepl.el.

But the good news is you are in emacs-land, so it should be possible to write your own custom handler to direct the output to the nrepl buffer and adjust your key bindings if you like.

For example, this is the equivalent of C-x C-e but sends the result of the evaluation to the repl buffer instead of the minibuffer:

(defun my-interactive-eval-to-repl (form)
  (let ((buffer nrepl-nrepl-buffer))
  (nrepl-send-string form (nrepl-handler buffer) nrepl-buffer-ns)))

(defun my-eval-last-expression-to-repl ()
  (interactive)
  (my-interactive-eval-to-repl (nrepl-last-expression)))
like image 129
kingtim Avatar answered Oct 13 '22 19:10

kingtim


Here is a version that also sends errors to the correct windows:

(defun my-nrepl-handler (buffer)
  "Make an interactive eval handler for buffer, but emit the value or out to the repl, not the minibuffer."
  (nrepl-make-response-handler buffer
                               (lambda (buffer value)
                                 (progn
                                   (nrepl-emit-result (nrepl-current-repl-buffer) value t)
                                   (nrepl-emit-prompt (nrepl-current-repl-buffer))))
                               (lambda (buffer out)
                                 (nrepl-emit-interactive-output out)
                                 (nrepl-emit-prompt (nrepl-current-repl-buffer)))
                               (lambda (buffer err)
                                 (message "%s" err)
                                 (nrepl-highlight-compilation-errors buffer err))
                               (lambda (buffer)
                                 (nrepl-emit-prompt buffer))))

(defun my-interactive-eval-to-repl (form)
  "Evaluate the given FORM and print value in the repl."
  (remove-overlays (point-min) (point-max) 'nrepl-note-p t)
  (let ((buffer (current-buffer)))
    (nrepl-send-string form (my-nrepl-handler buffer) (nrepl-current-ns))))

(defun my-eval-last-expression-to-repl ()
  (interactive)
  (my-interactive-eval-to-repl (nrepl-last-expression)))

(eval-after-load 'nrepl
  '(progn 
     (define-key nrepl-interaction-mode-map (kbd "C-x C-e") 'my-eval-last-expression-to-repl)))
like image 23
Christopher Poile Avatar answered Oct 13 '22 21:10

Christopher Poile