我想预先建议一些使用交互式参数的功能,例如find-dired
:
(defadvice find-dired (before eab-find-dired activate)
(message "before!")
(setq find-args '("-iname '**'" . 10)))
但是emacs仅在
find-dired
交互式 session 之后才执行此建议,而我之前无法设置find-args
。如何解决矛盾?更新。注意
defadvice
宏是deprecated。
最佳答案
artscan用一个可行的答案回答了他自己的问题,但这有点不完整和误导。这也涉及 'interactive
,它本身可能会造成混淆-因为它看起来像是在命令主体中定义的,但是实际上在输入函数之前使用-在执行任何建议之前(除非该建议已'interactive
调用...)
documentation for advice缺少许多在这种情况下有帮助的细节,因此,看起来更好的地方实际上是来源: advice.el
。查看该内容,然后找到注释部分@ Foo games: An advice tutorial
。您还可以使用M-x查找库建议RET在Emacs本身中找到源。
具体来说,针对此问题,请查看advice.el
中标记为@@ Advising interactive behavior:
的部分-因为这正是您要执行的操作。
如果仔细阅读,您会发现该建议的确不是而不是,其格式必须为around
,但也可以是before
,也可以是after
-尽管这只是在问麻烦。这是因为interactive
被(并且必须)被特殊对待。
因此,以下代码有效(请注意before
):
(defadvice find-dired (before eab-find-dired (dir args) activate)
"ignore find-args, hard code \"-iname '**'\""
(interactive
(list (read-directory-name "Run find in directory: " nil "" t)
(read-string "Run find (with args): " '("-iname '**'" . 10)
'(find-args-history . 1)))))
正如其他人所建议的那样,可能更干净的方法是编写自己的函数,我认为最简单的方法是Lindydancer的answer。
咨询是一个非常诱人的工具,但易于过度使用。我不会说这很危险,但应该谨慎使用。当编写自己的函数不起作用时,最好使用它-例如,更改无法修改的代码调用的函数的行为。我认为可以找到here,here和here(嘟嘟响自己的号角)来说明这种情况。
关于emacs - 建议emacs交互功能: before,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14606037/