emacs - 建议emacs交互功能: before

标签 emacs defadvice advising-functions

我想预先建议一些使用交互式参数的功能,例如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)))))

正如其他人所建议的那样,可能更干净的方法是编写自己的函数,我认为最简单的方法是Lindydanceranswer

咨询是一个非常诱人的工具,但易于过度使用。我不会说这很危险,但应该谨慎使用。当编写自己的函数不起作用时,最好使用它-例如,更改无法修改的代码调用的函数的行为。我认为可以找到hereherehere(嘟嘟响自己的号角)来说明这种情况。

关于emacs - 建议emacs交互功能: before,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14606037/

相关文章:

html - 在 emacs HTML 模式下禁用自动回车

emacs - 仅当从某个其他函数调用时才触发对函数的建议

emacs - 如何在 Emacs 中找到建议功能的 defadvice?

python - Emacs defadvice on python-mode 函数

javascript - Emacs - 用另一个字符串模式替换一些字符串模式

macos - Ctrl + <Arrow Keys> 的 iTerm Emacs 键代码

Emacs - 跳过空白杀死

emacs - 建议使用 emacs 函数;缺陷通知

emacs - 广告激活有什么作用?

emacs - C-a 使用 ipython-mode 转到 emacs 中的第一个字符