我正在尝试将一些代码从slime转换为nrepl。当使用slime时,代码是显而易见的。它会发送clojure代码进行计算,获取结果字符串并按您的喜好进行处理。我更改了我的代码,以便它可以与nrepl交互。也就是说:创建我自己的处理结果字符串的值处理程序,并将其传递给nrepl-make-response-handler。到目前为止,它工作得很好。但是后来我发现了一些可以同时操作多个缓冲区的代码。因为nrepl-make-response-handler只接受一个缓冲区参数,所以我想知道是否可以忽略它并调用我的代码来处理值处理程序中的多个缓冲区。我试了试,但失败了,什么也没改变。有没有elisp方面的专家?我真的需要帮助。
我自己的处理程序:
(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)))发布于 2013-06-14 16:23:58
在看了我的代码很长一段时间后,我终于解决了这个问题。新的处理程序如下:
(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“值。此外,我添加了-current- buffer来指定我要操作的缓冲区,但我并不局限于该缓冲区。原因是在下面的代码中:
(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我当前所在的缓冲区确实很重要。我之前忽略了with- current -buffer,所以buffer-file-name不知道导致这个问题的当前工作缓冲区。
https://stackoverflow.com/questions/17008075
复制相似问题