繁体   English   中英

nrepl.el:如何将clojure缓冲区形式改为nrepl缓冲区而不是echo区域?

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

我正在使用git的nrepl.el(0.1.6预览,通过el-get配方),我想要clojure buffer evals:Cx Ce,CMx,Cc Cr分别用于表单,顶级表单和区域,将自己发送到nrepl缓冲区并在那里进行评估,而不是使用返回到echo区域的结果来评估屏幕外的默认行为。

有没有办法做到这一点,或者是否有另一组用于此目的的键绑定我不能通过他们的描述来识别?

谢谢。

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

但好消息是你在emacs-land中,因此应该可以编写自己的自定义处理程序来将输出定向到nrepl缓冲区并根据需要调整键绑定。

例如,这相当于Cx Ce,但是将评估结果发送到repl缓冲区而不是miniuffer:

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

它绑定Cx C-。 达到理想的行为。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM