org-icomplete是一个调用ido-completing-read (icr)的函数。相反,我希望它调用我的函数:ido-completing-path-like-read (icplr)。这很容易实现为通知,但icplr调用icr,因此需要将另一个通知应用于icplr,以便在调用icr之前重新定义icr的原始定义,以防止无限递归。
我用两种方式实现了这一点,一种有效,另一种没有- icplr进入无限递归,调用自己而不是icr。为什么那个不工作,不工作?
作品:
(defadvice org-icompleting-read (around ido-path-like-completion activate)
(let ((sh/orig-ido-completing-read (symbol-function 'ido-completing-read)))
(unwind-protect
(progn
(defadvice ido-completing-path-like-read
(around save-ido-completing-read activate)
(setf (symbol-function 'ido-completing-read)
sh/orig-ido-completing-read)
ad-do-it
)
(setf (symbol-function 'ido-completing-read)
(symbol-function 'ido-completing-path-like-read))
ad-do-it
)
(setf (symbol-function 'ido-completing-read)
sh/orig-ido-completing-read)
(ad-remove-advice 'ido-completing-path-like-read 'around 'save-ido-completing-read)
))
)不起作用:
(defadvice org-icompleting-read (around ido-path-like-completion activate)
(let ((sh/orig-ido-completing-read (symbol-function 'ido-completing-read)))
(unwind-protect
(progn
(setf (symbol-function 'ido-completing-read)
(symbol-function 'ido-completing-path-like-read))
(defadvice ido-completing-path-like-read
(around save-ido-completing-read activate)
(setf (symbol-function 'ido-completing-read)
sh/orig-ido-completing-read)
ad-do-it
)
ad-do-it
)
(setf (symbol-function 'ido-completing-read)
sh/orig-ido-completing-read)
(ad-remove-advice 'ido-completing-path-like-read 'around 'save-ido-completing-read)
))
)编辑
发布于 2014-05-01 23:45:04
任何可能来搜寻的人:
第一个和第二个不起作用的原因不是应用通知的顺序,而是应用内部建议的顺序,相对于:
(setf (symbol-function 'ido-completing-read)
(symbol-function 'ido-completing-path-like-read))重要的原因是,如果在通知之前执行此语句,则不会通知符号'ido-completing-read,而符号'ido-completing-path-like-read副本将被通知。但是,如果首先应用通知,则两个符号都将引用建议版本。
我不确定这完全说得通。我想象(这就是为什么这个难题)函数对象附加了一些附加信息,我们通过操作这些附加信息来提供建议。
原来这是一个更基本的机制-功能实际上是临时包装的.
发布于 2014-04-12 20:11:21
不要添加/删除建议。让你的建议有条件:
(defvar my-inhibit-org-advice nil)
(defadvice org-icompleting-read (around ...)
(if my-inhibit-org-advice ad-do-it
...my advice...))
(defun ido-completing-path-like-read (...)
(let ((my-inhibit-org-advice t))
...(org-icompleting-read ...)...))https://stackoverflow.com/questions/23034144
复制相似问题