NREPL.EL:如何将Clojure缓冲液形式评估为NREPL缓冲区而不是回声区域



我正在使用git中的nrepl.el(0.1.6-preview,通过el-get食谱),我想要clojure buffer evals:c-x c-e,c-x c-e,c-m-x,c-c c c-r形式,顶级形式和区域分别将自己发送到NREPL缓冲区并在此进行评估,而不是评估屏幕外屏幕外的默认行为,结果返回回声区域。

有什么方法可以做到这一点,或者为此目的有另一组关键框架吗?

谢谢。

您所描述的行为目前不支持NREPL.el。

,但好消息是您在Emacs-land,因此应该可以编写自己的自定义处理程序,以将输出引导到NREPL缓冲区并在您愿意的情况下调整密钥绑定。

例如,这相当于C-X C-E,但将评估的结果发送到REPL缓冲区而不是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)))

这是一个版本,也将错误发送到正确的窗口:

(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)))

由于这里提供的任何解决方案都没有使用我拥有的版本,所以我提出了自己的实现:

(defun eval-in-nrepl ()
  (interactive)
  (let ((exp (nrepl-last-expression)))
    (with-current-buffer (nrepl-current-repl-buffer)
      (nrepl-replace-input exp)
      (nrepl-return))))
(eval-after-load 'nrepl
  '(define-key nrepl-interaction-mode-map
     (kbd "C-x C-.")
     'eval-in-nrepl))

它结合了C-X C-。对所需的行为。

最新更新