建议仅适用于重新评估函数调用建议函数后的所有情况

时间:2014-08-11 15:27:59

标签: emacs elisp

在我的.emacs文件中,我有:

(defadvice narrow-to-region (around test activate)
   (message "advice")
   ad-do-it)

当我打电话给狭隘地区时,建议会运行并打印建议'缩小之前。

当我打电话给狭隘的时候,它没有。

我在lisp.el中找到了定义narrow-to-defun的地方,并重新评估了该函数。此时,建议开始运行。

是什么导致这种情况?

2 个答案:

答案 0 :(得分:6)

问题显然是由于字节编译,因此无法建议缩小的原语(narrow-to-region是原始的,narrow-to-defun调用narrow-to-region)。

Null Program"The Limits of Emacs Advice")上的以下帖子详细介绍了此问题。这是帖子深处的简短版本:

  

事实证明narrow-to-region非常特殊 - 可能因为它经常使用 - 它获得了自己的字节码。原始函数调用正被编译成单个指令。这意味着我的建议不会在字节编译代码中考虑。 Darnit。 widen(代码126)也是如此。

关于为什么在重新评估narrow-to-defun之后建议开始工作:我猜是因为你在重新评估时最终更换了字节编译的版本。

答案 1 :(得分:2)

@Dan很好地描述了这个问题。以下是一些可以帮助您解决问题的信息。

你可以做的是建议(或重新定义)narrow-to-defun(也许narrow-to-page),所以它的行为类似。

FWIW,我在库wide-n.el做了类似的事情(参见Multiple Narrowings)。

我建议narrow-to-region。但我也重新定义了narrow-to-defunnarrow-to-page。在所有3个案例中,我做了相同的更改,以记录每个缩小的细节,以便您以后可以返回它们。以下是建议,例如:

 (defadvice narrow-to-region (before push-wide-n-restrictions activate)
   "Push the region limits to `wide-n-restrictions'.
 You can use `C-x n x...' to widen to previous buffer restrictions."
   (when (or (interactive-p) wide-n-push-anyway-p)
     (wide-n-push (ad-get-arg 0) (ad-get-arg 1)))) ; Args START and END.

以下是narrow-to-defun重新定义的相关部分:

  ...
  (goto-char end)
  (re-search-backward "^\n" (- (point) 1) t)
  (when (or (interactive-p)  wide-n-push-anyway-p) (wide-n-push beg end)) ; <=====
  (narrow-to-region beg end))))