如何在Emacs中恢复默认功能?

4

我修改了蜂鸣函数(defun beep () ...,不想重启Emacs的情况下是否可以恢复原样?

3个回答

2

只需访问原始定义并对其进行评估。

如果需要,您可以启动第二个Emacs实例以查找代码:C-h f beep RET,然后跟随链接到源代码。

(我通常会说find-function,但在这种情况下,beep是一个别名,并且跟随链接将带您转到defalias行,而find-function则转到源定义。)


文档中显示了我的新函数在.emacs中,但我无法在源代码中找到它,我尝试了find + xargs搜索。 - jcubic
这就是为什么我建议启动第二个Emacs实例,这样你就可以询问它那个函数通常存储在哪里。然后你可以切换回修改后的实例来进行更改。 - phils

1

除非你首先保存了 (symbol-function 'ding)。如果是这样,那么你可以使用 fset 恢复它。如果没有保存,则无法恢复,因为 ding(又名 beep)定义在 C 中,而不是 Lisp 中。

如果它在 Lisp 中定义,那么你可以按照 @phils 的建议去做。


1
啊,但beep是一个别名,因此可以将其恢复为别名。它的功能单元通常只包含ding(符号函数间接引用),因此与ding本身无关。(如果被重新定义的是ding,那么你肯定会被卡住)。 - phils
1
很好的观点 - 你说得对,@phils。楼主:你应该选择phils的答案:只需重新评估“beep”的“defalias”,以再次赋予其“ding”的行为。 - Drew

0

这可能只是偶然,但我目前可以用以下方法实现:

(defun restore-redefined-function (name)
  (interactive (find-function-read))
  (save-window-excursion
    (find-function name)
    (eval-defun nil)))
  1. *scratch* 中:

    (defun beep () "foo")
    ;; beep
    
    (symbol-function 'beep)
    ;; (lambda nil "foo")
    
  2. 执行 M-x restore-redefined-function 并输入 beep

  3. *scratch* 中:

    (symbol-function 'beep)
    ;; ding
    

尝试使用(find-function 'beep) - abo-abo
已使用 emacs -q 进行测试。版本为 24.3.50.1 和 24.3.4。 - abo-abo

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