【问题标题】:nrepl.el: how to eval clojure buffer form to nrepl buffer instead of echo area?nrepl.el:如何将 clojure 缓冲区形式评估为 nrepl 缓冲区而不是回显区域?
【发布时间】:2012-10-17 16:16:51
【问题描述】:

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

有什么方法可以做到这一点,或者是否有另一组用于此目的的键绑定,我无法从他们的描述中识别出来?

谢谢。

【问题讨论】:

    标签: emacs clojure


    【解决方案1】:

    由于此处提供的解决方案均不适用于我拥有的版本,因此我提出了自己的实现:

    (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-。到所需的行为。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        但是好消息是你在 emacs 领域,所以应该可以编写你自己的自定义处理程序来将输出定向到 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)))
        

        【讨论】:

        • 你打算支持这个功能,因为有一个简单的实现,或者你打算把它留给用户,因为你只是展示了一个简单的实现?
        • 你能为那些刚接触emacs的人详细说明一下吗?当我尝试 M-x my- 时,它只会使用 my-eval 而不是 my-interactive 自动完成。以及如何正确绑定它以像 C-x C-e 一样工作?
        • Christopher Poile 在下面提供了一个很好的示例:(eval-after-load 'nrepl '(progn (define-key nrepl-interaction-mode-map (kbd "C-x C-e") 'my-eval-last-expression-to-repl)
        • 这是否应该与 Cider 一起使用,设置如 braveclojure.com/basic-emacs 所述?我目前有CIDER 0.8.1 (package: 20141120.1746) (Java 1.8.0_151, Clojure 1.8.0, nREPL 0.2.12),我能够执行前两个 defun,但我无法在 clojure 模式下执行它们。
        猜你喜欢
        • 2013-08-15
        • 1970-01-01
        • 2015-12-04
        • 1970-01-01
        • 1970-01-01
        • 2018-06-29
        • 1970-01-01
        • 2017-04-13
        • 2021-01-14
        相关资源
        最近更新 更多