更新
这个问题不再可行。
结果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-function
是defvar
。其默认值为#'ivy--format-function-default