如何在Emacs Lisp中返回先前定义的函数?

4

我有一个函数:

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

我用以下方式重新定义它:

(defun function-name (&optional args) ... my own content)

我可以在一段时间后删除自己的function-name版本,保留第一个吗?

3个回答

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 load-library RET命令加载。

Reeval

或者,如果您知道原始定义,可以将其粘贴到Common Lisp提示符中重新评估,或者通过访问包含定义的文件并使用C-M-x键进行函数求值,正如@Drew在评论中建议的那样。


你能否也提供Emacs Lisp版本?其中没有 defparameterfdefinition - Sergey
你在Emacs中有fdefinition吗? - Sergey
由于您(OP)将第一个定义称为“未知内容”,因此函数的原始定义可能作为Emacs的一部分或作为某个第三方库提供。在这种情况下,对于该库的load-library是一个不错的方法。如果出于某种原因您不想重新加载该库的所有代码,则可以只访问该库,在定义上/内放置光标,并使用C-M-x重新评估它。 - Drew

2

请注意,重新定义其他库或Emacs自己的函数是有风险的,因为您不知道依赖于它们按预期工作的其他内容。如果可能的话,请使用不同的名称。如果不行,请提供大量文档,突出警告重新定义。此外,请先检查现有函数是否可以使用预定义的钩子在其之前或之后运行,或者通过自定义任何特定用户选项来调整满足您的需求。


1

不是通过创建新定义的方式,而是通过使用建议来获取所需结果。例如:

(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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接