暂时更改elisp中的函数变量

时间:2016-11-11 18:04:27

标签: emacs elisp

更新

这个问题不再可行。

结果ivy-read没有像我预期的那样立即返回。我使用C-g取消了完成操作,跳过了恢复ivy-format-function部分。

我正在编写一个带有动态集合的常春藤扩展。我想返回一个字符串列表而不是一个字符串列表作为候选。默认值ivy-format-function仅支持字符串列表,因此我决定在调用ivy-read时将其更改为我自己的函数,然后将其更改回来。

我定义了以下宏和函数:

(defun ivy-foo ()
  (interactive)
  (with--ivy-foo-format-function
   (ivy-read "Foo: "
             #'ivy-foo-function
             :dynamic-collection t
             :require-match t
             :action #'ivy-foo--action
             :unwind #'ivy-foo--unwind
             :history 'ivy-foo-history
             :caller 'ivy-foo)))

(defmacro with--ivy-foo-format-function (&rest body)
  `(let ((original-function ivy-format-function))
     (setq ivy-format-function (lambda (candidates) (ivy-foo--format-function candidates original-function)))
     ,@body
     (setq ivy-format-function original-function)))

(defun ivy-foo--format-function (candidates original-format-function)
  (funcall original-format-function
           (mapcar
            (lambda (cand)
              (if (listp cand)
                  (car cand)
                cand))
            candidates)))

(defun ivy-foo-function (str)
  (list (list "cand1" str) (list "cand2" str)))

with--ivy-foo-format-function未将ivy-format-function设置为原始值。我收到错误“符号的值作为变量是无效的:原始函数”。怎么了?

更新:ivy-format-functiondefvar。其默认值为#'ivy--format-function-default

0 个答案:

没有答案