Clojure 如何使用nrepl操作多个缓冲区?
我正在尝试将一些代码从slime扭曲到nrepl。 使用粘液时,代码是显而易见的。它发送clojure代码进行求值,获取结果字符串并根据需要进行处理。我更改了代码,以便它可以与nrepl交互。也就是说:创建自己的值处理程序来处理结果字符串,并将其传递给nrepl生成响应处理程序。到目前为止,它工作正常。但后来我发现了一些可以同时操作多个缓冲区的代码。由于nrepl make-response处理程序只接受一个缓冲区参数,我想知道是否可以忽略它并调用在值处理程序中处理多个缓冲区的代码。我尝试过,但失败了,什么都没有改变。那里有elisp专家吗?我真的需要帮助 我自己的经纪人:Clojure 如何使用nrepl操作多个缓冲区?,clojure,lisp,elisp,nrepl,Clojure,Lisp,Elisp,Nrepl,我正在尝试将一些代码从slime扭曲到nrepl。 使用粘液时,代码是显而易见的。它发送clojure代码进行求值,获取结果字符串并根据需要进行处理。我更改了代码,以便它可以与nrepl交互。也就是说:创建自己的值处理程序来处理结果字符串,并将其传递给nrepl生成响应处理程序。到目前为止,它工作正常。但后来我发现了一些可以同时操作多个缓冲区的代码。由于nrepl make-response处理程序只接受一个缓冲区参数,我想知道是否可以忽略它并调用在值处理程序中处理多个缓冲区的代码。我尝试过,但
(defun nrepl-interactive-eval-read-replace-handler (buffer)
"Make a handler for evaluating and process global replacement."
(nrepl-make-response-handler buffer
(lambda (buffer value)
(let ((sexp (read value)))
(clojure-refactorcng-process-global-replacements sexp)))
'()
(lambda (buffer err)
(message "%s" err))
'()))
客户端代码:
(defun nrepl-interactive-eval-read-replace (form)
"Evaluate the given FORM and process global replacement"
(let ((buffer (current-buffer)))
(nrepl-send-string form
(nrepl-interactive-eval-read-replace-handler buffer)
nrepl-buffer-ns)))
处理结果的代码:
(defun get-from-alist (key alist)
(car (cdr (assoc key alist))))
(defun clojure-refactoring-process-global-replace (replace)
(if (get-from-alist :new-source replace)
(progn
(if (string= (file-truename (buffer-file-name))
(file-truename (get-from-alist :file replace)))
nil
(find-file (get-from-alist :file replace)))
(goto-char (point-min))
(erase-buffer)
(insert (get-from-alist :new-source replace)))))
(defun clojure-refactoring-process-global-replacements (replacements)
(save-window-excursion
(mapcar #'clojure-refactoring-process-global-replace replacements)))
在看了我的代码一段时间后,我终于解决了这个问题。 新处理程序如下所示:
(defun nrepl-interactive-eval-read-replace-handler (buffer)
"Make a handler for evaluating and process global replacement."
(nrepl-make-response-handler buffer
(lambda (buffer value)
(with-current-buffer buffer
(let ((sexp (read value)))
(if sexp
(clojure-refactoring-process-global-replacements sexp)))))
'()
(lambda (buffer err)
(message "%s" err))
'()))
如您所见,我添加了一个if条件来排除nrepl返回的“nil”值。此外,我还添加了currentbuffer来指定我将要操作的缓冲区,不过,我并不仅限于该缓冲区。原因是我的代码如下:
(defun clojure-refactoring-process-global-replace (replace)
(if (get-from-alist :new-source replace)
(progn
(if (string= (file-truename (buffer-file-name))
(file-truename (get-from-alist :file replace)))
nil
我目前使用的缓冲区很重要。我以前忽略了当前缓冲区的,因此缓冲区文件名不知道导致此问题的当前工作缓冲区