如何回到以前在Emacs Lisp中定义的函数?

时间:2014-08-01 17:14:20

标签: emacs elisp

我有一个功能:

(defun function-name (&optional args) ... <unknown content>)

我用

重新定义它
(defun function-name (&optional args) ... my own content)

我可以在一段时间后以某种方式移除我自己的function-name版本并继续使用第一个版本吗?

3 个答案:

答案 0 :(得分:6)

不,你不能

保存/恢复

您可以在重新定义功能之前自行保存定义:

Common Lisp

(defparameter *old-def* (fdefinition 'function-name))
(defun function-name ...)
...
(setf (fdefinition 'function-name) *old-def*)

Emacs Lisp

(defconst *old-def* (symbol-function 'function-name))
(defun function-name ...)
...
(fset 'function-name *old-def*)

刷新

或者,如果您知道函数的定义位置,则可以重新加载定义:

Common Lisp

(load "file-name")

Emacs Lisp :与上述相同或 M-x加载库RET

Reeval

或者,如果你知道原始定义,你可以通过在 Common Lisp 提示下粘贴它,或者通过访问带有 Emacs 中定义的文件来重新评估它。使用 CMx 评估defun,正如@Drew在评论中所建议的那样。

答案 1 :(得分:2)

请注意,重新定义其他图书馆的风险很大。或Emacs&#39;自己的功能,因为你不知道还有什么依赖于他们完全按照预期工作。如果可能,请使用其他名称。如果没有,请提供大量有关重新定义的警告文件。此外,您是否首先检查现有功能是否可以使用在其之前或之后运行的预定义挂钩或通过自定义任何特定用户选项来调整您的满意度?

答案 2 :(得分:1)

不是你这样做的方式,但你可以通过使用建议而不是新的定义来获得你想要的东西。 E.g。

(defadvice function-name (around my-overrride activate)
  ... my own content)

在上述之后,您可以通过停用建议来恢复旧行为。使用Emacs-24.4中的新建议系统,如下所示:

(defun my-function-name (&optional args) ... my own content)
(add-advice 'function-name :override #'my-function-name)

可以用

还原
(remove-advice 'function-name #'my-function-name)