Подтвердить что ты не робот

Nrepl.el: как eval clojure буферная форма в буфер nrepl вместо области эха?

Я использую nrepl.el из git (0.1.6-preview, через el-get recipe), и мне бы хотелось, чтобы clojure buffer evals: Cx Ce, CMx, Cc Cr для формы, уровня и области соответственно, чтобы отправлять себя в буфер nrepl и оценивать там, а не поведение по умолчанию для оценки вне экрана с результатами, возвращаемыми в область эха.

Есть ли способ сделать это, или есть ли другой набор привязок для этой цели, которые я не узнаю по их описаниям?

Спасибо.

4b9b3361

Ответ 1

Поведение, о котором вы описали, в настоящее время не поддерживается в nrepl.el.

Но хорошая новость заключается в том, что вы находитесь в emacs-land, поэтому должно быть возможно написать собственный пользовательский обработчик, чтобы направить вывод в буфер nrepl и настроить привязки клавиш, если хотите.

Например, это эквивалент C-x C-e, но отправляет результат оценки в буфер repl вместо минибуфера:

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

Ответ 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

Поскольку ни одно из решений, представленных здесь, не работает с версией, которую я имею, я придумал свою собственную реализацию:

(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-. к желаемому поведению.