在我的.emacs文件中,我有:
(defadvice narrow-to-region (around test activate)
(message "advice")
ad-do-it)
当我打电话给狭隘地区时,建议会运行并打印建议'缩小之前。
当我打电话给狭隘的时候,它没有。
我在lisp.el中找到了定义narrow-to-defun的地方,并重新评估了该函数。此时,建议开始运行。
是什么导致这种情况?
答案 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)
你可以做的是建议(或重新定义)narrow-to-defun
(也许narrow-to-page
),所以它的行为类似。
FWIW,我在库wide-n.el
做了类似的事情(参见Multiple Narrowings)。
我建议narrow-to-region
。但我也重新定义了narrow-to-defun
和narrow-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))))