【发布时间】:2013-06-09 09:01:16
【问题描述】:
我正在尝试将一些代码从 slime 转换为 nrepl。 使用粘液时,代码很明显。它发送 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)))
【问题讨论】: