我试图动态地找到当前运行的函数(this-function)的名称ie
(defun my-func ()
(remove-hook 'some-hook this-function)
(do-something))
我没有测试过这个,但为什么不写一个宏来封装你想要的东西呢?也许是下面的事情?
(defmacro one-shot-hook (name hook &rest body)
`(defun ,name ()
(remove-hook ',hook ',name)
,@body)
Run Code Online (Sandbox Code Playgroud)
然后,例如
(macroexpand-all-1
'(one-shot-hook test c-mode-hook
(message "Yay!")))
Run Code Online (Sandbox Code Playgroud)
给
(defun test nil
(remove-hook (quote c-mode-hook) (quote test))
(message "Yay!"))
Run Code Online (Sandbox Code Playgroud)
(当我重新格式化它时).
这消除了需要知道你所在的函数名称的问题,无论如何都需要令人讨厌的宏观(我不确定它是否可能).
还有一件事,我可能建议最初将一个标志变量设置为nil,然后由代码测试以决定是否运行.然后你不必一直在添加和删除钩子:结果可能更容易定制和理解使用你的代码的任何其他人.