我修改了蜂鸣函数(defun beep () ...
,不想重启Emacs的情况下是否可以恢复原样?
只需访问原始定义并对其进行评估。
如果需要,您可以启动第二个Emacs实例以查找代码:C-h f beep RET
,然后跟随链接到源代码。
(我通常会说find-function
,但在这种情况下,beep是一个别名,并且跟随链接将带您转到defalias
行,而find-function则转到源定义。)
除非你首先保存了 (symbol-function 'ding)
。如果是这样,那么你可以使用 fset
恢复它。如果没有保存,则无法恢复,因为 ding
(又名 beep
)定义在 C 中,而不是 Lisp 中。
如果它在 Lisp 中定义,那么你可以按照 @phils 的建议去做。
beep
是一个别名,因此可以将其恢复为别名。它的功能单元通常只包含ding
(符号函数间接引用),因此与ding
本身无关。(如果被重新定义的是ding
,那么你肯定会被卡住)。 - phils这可能只是偶然,但我目前可以用以下方法实现:
(defun restore-redefined-function (name)
(interactive (find-function-read))
(save-window-excursion
(find-function name)
(eval-defun nil)))
在 *scratch*
中:
(defun beep () "foo")
;; beep
(symbol-function 'beep)
;; (lambda nil "foo")
执行 M-x restore-redefined-function
并输入 beep
。
在 *scratch*
中:
(symbol-function 'beep)
;; ding
(find-function 'beep)
- abo-aboemacs -q
进行测试。版本为 24.3.50.1 和 24.3.4。 - abo-abo
.emacs
中,但我无法在源代码中找到它,我尝试了find + xargs
搜索。 - jcubic