首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用nrepl操作多个缓冲区?

如何使用nrepl操作多个缓冲区?
EN

Stack Overflow用户
提问于 2013-06-09 17:01:16
回答 1查看 90关注 0票数 0

我正在尝试将一些代码从slime转换为nrepl。当使用slime时,代码是显而易见的。它会发送clojure代码进行计算,获取结果字符串并按您的喜好进行处理。我更改了我的代码,以便它可以与nrepl交互。也就是说:创建我自己的处理结果字符串的值处理程序,并将其传递给nrepl-make-response-handler。到目前为止,它工作得很好。但是后来我发现了一些可以同时操作多个缓冲区的代码。因为nrepl-make-response-handler只接受一个缓冲区参数,所以我想知道是否可以忽略它并调用我的代码来处理值处理程序中的多个缓冲区。我试了试,但失败了,什么也没改变。有没有elisp方面的专家?我真的需要帮助。

我自己的处理程序:

代码语言:javascript
复制
(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))
                           '()))

客户端代码:

代码语言:javascript
复制
(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)))

处理结果的代码:

代码语言:javascript
复制
(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)))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-14 16:23:58

在看了我的代码很长一段时间后,我终于解决了这个问题。新的处理程序如下:

代码语言:javascript
复制
(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来指定我要操作的缓冲区,但我并不局限于该缓冲区。原因是在下面的代码中:

代码语言:javascript
复制
(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不知道导致这个问题的当前工作缓冲区。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17008075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档