我已经重写和单机测试的内部功能通过与Emacs的24捆绑在一起的Emacs的功能之一调用的行为是什么合并的首选方式-例如在我的init.el
-我的函数的行为覆盖捆绑功能?
我跟随了advice
vs fset
等的各种线程并且感到困惑.
eve*_*_jr 22
@iainH你倾向于通过描述你想要实现的目标,然后到目前为止你所拥有的目标来更快地得到一个有用的答案.我要求代码试图帮助你做你想做的事,而不必覆盖任何东西.
我仍然不明白为什么你不只是使用defun
虽然?我怀疑你defun
在init文件中使用了什么,但是原始函数还没有加载(参见autoload).一段时间后,您可以执行某些操作以使具有原始定义的文件加载,并且您的自定义函数将被原始文件覆盖.
如果这是问题,你有三个选项(假设你想要telnet-initial-filter
从"telnet.el" 覆盖):
在定义自己的版本之前自己加载文件.
(require 'telnet)
(defun telnet-initial-filter (proc string)
...)
Run Code Online (Sandbox Code Playgroud)只有在使用eval-after-load机制加载文件后,才能直接使用Emacs加载函数 .
(eval-after-load "telnet"
'(defun telnet-initial-filter (proc string)
...))
Run Code Online (Sandbox Code Playgroud)使用建议.
其中,2是最好的.1也没关系,但你必须加载一个你可能永远不会在会话中使用的文件.3是最糟糕的.任何涉及的内容defadvice
都应作为最后的选择.
有一种“新”建议方法,甚至可以在加载原始函数之前就设置函数替换。
(defun something-fixed ()
...
)
(advice-add 'original-function :override #'something-fixed)
Run Code Online (Sandbox Code Playgroud)
这甚至可以与您的初始化文件结合使用eval-buffer
。
只是为了让这个问题保持独立,这里是如何通过建议来做到这一点.
(defadvice telnet-initial-filter (around my-telnet-initial-filter-stuff act)
"Things to do when running `telnet-initial-filter'."
(message "Before")
ad-do-it
(message "After") )
Run Code Online (Sandbox Code Playgroud)
如果您想要包装而不是替换现有函数(在这种情况下只重新定义它),这显然很有用.
有关使用建议的更多信息,请参阅手册.