我正在使用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-。对所需的行为。