你如何找到当前运行的函数的名称:current-function,this-function,current-defun,this-defun

der*_*tes 2 elisp

我试图动态地找到当前运行的函数(this-function)的名称ie

  (defun my-func ()
      (remove-hook 'some-hook this-function)
      (do-something))

Rup*_*ick 6

我没有测试过这个,但为什么不写一个宏来封装你想要的东西呢?也许是下面的事情?

(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,然后由代码测试以决定是否运行.然后你不必一直在添加和删除钩子:结果可能更容易定制和理解使用你的代码的任何其他人.