【问题标题】:How to manipulate multiple buffers using nrepl?如何使用 nrepl 操作多个缓冲区?
【发布时间】: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)))

【问题讨论】:

    标签: clojure lisp elisp nrepl


    【解决方案1】:

    看了好久我的代码,终于解决了这个问题。 新的处理程序如下:

    (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”值。另外,我添加了 with-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 不知道导致这个问题的当前工作缓冲区。

    【讨论】:

      猜你喜欢
      • 2013-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-10-17
      • 1970-01-01
      • 2016-07-10
      • 1970-01-01
      • 2012-04-12
      • 1970-01-01
      相关资源
      最近更新 更多