ad-activate是什么意思?

5

在一个答案中,我注意到:

;; 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)

听起来 很有前途,但是它具体是做什么的?!

我在代码块上尝试了 eval-region。但对于我来说,它只是将以下内容添加到 align-regexp 文档中:

建议使用此函数。

Around-advice `align-regexp-with-spaces':
不要使用制表符进行对齐。

如果这应该是效果,我似乎无法实际使用 align-regexp-with-spaces... 我错过了什么吗?

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

1个回答

4

在提出这个问题的时候,我意识到自己并没有理解建议功能(advising functions)的概念。

我明白了:

  • align-regexp-with-spaces 不是函数也不是变量,只是一个名称(用于启用/禁用单个建议)
  • 自从执行了 (ad-activate 'align-regexp) 之后,align-regexp 所做的就是我“建议”它所做的事情:不使用制表符

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

我不明白这比围绕 align-regexp 定义一个函数要好在哪里。但话说回来,我对 Emacs Lisp 并不很了解。

恐怕额外的文档行只会增加混淆……


你应该能够编辑你的问题并将这些信息添加到你的问题中(而不是提供一个“答案”——它实际上并不是答案)。 - Trey Jackson
3
你可以围绕着 align-regexp 定义一个函数,然后使用该函数。但是,任何直接使用 align-regexp 的其他函数仍将使用旧版本。当你为一个函数提供建议时,实际上是将其替换,因此使用 align-regexp 的任何其他代码现在将使用你修改过的版本。最后注意:提供建议非常强大,也非常危险,请谨慎使用(有时很难预测你的建议在其他上下文中被其他代码使用时会产生什么影响)。 - jtahlborn
另外需要注意的是,如果您使用 ...(around align-regexp-with-spaces activate compile preactivate)... 来定义建议,则不需要单独的 (ad-activate...) 行(使用每个修饰符都有微妙之处,但在实践中它们总是很好用的)。 - jtahlborn
2
个人而言,我喜欢显式调用 ad-activate,因为这样方便将其更改为相应的 ad-deactivate 以进行评估(或在 ad-disable-* 调用后重新评估)。 - phils
1
Michel de Ruiter:更准确地说,对于指定的函数,“ad-activate”会激活 所有 当前已启用的建议(不一定仅限于前一个表达式中定义的一个),并且还将 停用 任何先前处于活动状态但自那以后已被禁用的建议(请参见http://www.gnu.org/software/emacs/manual/html_node/elisp/Enabling-Advice.html)。 - phils
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接