Emacs 为什么应用建议的顺序很重要?
Emacs 为什么应用建议的顺序很重要?,emacs,elisp,Emacs,Elisp,org icomplete是一个调用ido completing read(icr)的函数。相反,我希望它调用我的函数:ido完成像read那样的路径(icplr)。除了icplr调用icr之外,这将很容易作为建议实现,因此需要对icplr应用另一个建议,以便在调用icr之前重新解析icr的原始定义,以防止无限递归 我用两种方式实现了这一点,一种是有效的,另一种是无效的——icplr进入无限递归,调用自己而不是icr。为什么这个不工作,不工作 作品: (defadvice组织i完成读取(围绕像完
org icomplete
是一个调用ido completing read
(icr)的函数。相反,我希望它调用我的函数:ido完成像read那样的路径(icplr)。除了icplr调用icr之外,这将很容易作为建议实现,因此需要对icplr应用另一个建议,以便在调用icr之前重新解析icr的原始定义,以防止无限递归
我用两种方式实现了这一点,一种是有效的,另一种是无效的——icplr进入无限递归,调用自己而不是icr。为什么这个不工作,不工作
作品:
(defadvice组织i完成读取(围绕像完成激活这样的ido路径)
(let((sh/orig ido完成读取(符号函数'ido完成读取)))
(展开保护)
(项目
(defadvice ido正在完成读取这样的路径
(关于保存ido完成读取激活)
(setf(符号函数“ido”完成读取)
sh/原始ido(完成读取)
做它
)
(setf(符号函数“ido”完成读取)
(符号函数“ido完成类似读取的路径”)
做它
)
(setf(符号函数“ido”完成读取)
sh/原始ido(完成读取)
(ad删除建议“ido完成类似读取的路径”环绕“保存ido完成读取”)
))
)
不起作用:
(defadvice组织i完成读取(围绕像完成激活这样的ido路径)
(let((sh/orig ido完成读取(符号函数'ido完成读取)))
(展开保护)
(项目
(setf(符号函数“ido”完成读取)
(符号函数“ido完成类似读取的路径”)
(defadvice ido正在完成读取这样的路径
(关于保存ido完成读取激活)
(setf(符号函数“ido”完成读取)
sh/原始ido(完成读取)
做它
)
做它
)
(setf(符号函数“ido”完成读取)
sh/原始ido(完成读取)
(ad删除建议“ido完成类似读取的路径”环绕“保存ido完成读取”)
))
)
编辑
我想明确指出的是,所有提到的函数D:ido完成路径,如read、ido完成read和org icompleting read都将被处理(其中两个实际上是)库函数,我不控制这些函数的定义
虽然我愿意在这里接受关于替代模式的建议,并且非常感谢这些建议,但我只会接受一个真正回答我问题的答案:为什么第一个代码有效,而第二个代码无效?谢谢你的理解
不要添加/删除建议。只要你的建议有条件:
(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 ...)...))
任何可能前来搜索的人:
第一个有效而第二个无效的原因,不是应用建议的顺序,而是应用内部建议相对于以下各项的顺序:
(setf (symbol-function 'ido-completing-read)
(symbol-function 'ido-completing-path-like-read))
这很重要的原因是,如果在通知之前执行此语句,则符号'ido-completing-read
将不会被通知,而符号'ido-completing-path-like-read
将被复制。但是,如果首先应用建议,则两个符号都将表示建议的版本
我不确定这是否完全有意义。我想象(这就是为什么这个难题)函数对象附加了一些附加信息,我们通过操纵这些附加信息应用了建议
事实证明,这是一个更基本的机制-函数实际上是临时包装的…谢谢你的回答!很抱歉,不清楚(我现在添加了澄清),但是:1。像读取一样完成路径的ido不需要重新定义。2.像read这样完成路径的ido并没有调用OrgICompletingRead,而是调用第三个函数——这是不被建议的!3.我可以通过包装器或建议我完成阅读来改变使用模式,但我现在真正想了解的是为什么我的第一个示例会进入一个无限循环…这是因为ad remove advice
并没有做你认为的事情。你能详细说明一下吗?IIRCad remove advice
只计划删除建议,稍后。