广告激活有什么作用?

Mic*_*ter 5 emacs elisp defadvice advising-functions

回答中,我注意到:

;; Align with spaces only
(defadvice align-regexp (around align-regexp-with-spaces)
  "Never use tabs for alignment."
  (let ((indent-tabs-mode nil))
    ad-do-it))
(ad-activate 'align-regexp)
Run Code Online (Sandbox Code Playgroud)

听起来很有希望,但是...它是做什么的?

我尝试eval-region了代码块。但是对我来说,它所做的就是在align-regexp文档中添加以下内容:

建议使用此功能。

围绕建议的“ align-regexp-with-spaces”:
切勿使用制表符进行对齐。

我似乎无法实际使用align-regexp-with-spaces,如果那是什么效果……我想念的是什么?

我使用了GNU Emacs版本24.0.96.1(i386-mingw-nt6.1.7601)。

Mic*_*ter 4

在问这个问题时,我意识到我只是不明白建议功能的想法。

我清楚地意识到:

  • align-regexp-with-spaces不是函数也不是变量,而只是一个名称(用于启用/禁用单个建议)
  • 从那时起(ad-activate 'align-regexp)align-regexp就按照我“建议”的去做:不要使用制表符

所以:ad-activate激活建议,有效地改变原始函数的行为。伟大的!

我不明白为什么这比定义一个函数“更好” align-regexp。但话又说回来,我对 Emacs Lisp 不太了解。

恐怕额外的文档行只会增加混乱......

  • 您可以围绕align-regexp定义一个函数,然后使用该函数。但是,任何直接使用align-regexp的_other_函数仍将使用旧版本。当您建议一个函数时,您实际上是_替换_它,因此使用align-regexp的任何其他代码现在都将使用您的修改版本。最后一点:建议非常强大,也非常危险,请谨慎使用(有时很难预测你的建议在其他上下文中被其他代码使用时会如何运作)。 (3认同)
  • 就我个人而言,我喜欢显式调用“ad-activate”,因为将其更改为相应的“ad-deactivate”来评估它很方便(或者在“ad-disable-*”调用后按原样重新评估) 。 (2认同)