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

Emacs 建议仅适用于重新评估函数调用建议函数后的所有情况,emacs,elisp,Emacs,Elisp,在我的.emacs文件中,我有: (defadvice narrow-to-region (around test activate) (message "advice") ad-do-it) 当我调用“缩小到区域”时,建议会运行并在缩小之前打印“建议” 当我叫斯内普去德芬时,它没有 我在lisp.el中找到了定义窄到defun的地方,并重新评估了该函数。此时,建议开始运行 什么可能导致这种情况?问题显然是由于字节编译,因此无法建议缩小原语(缩小到区域是原语,缩小到取消调用缩小到区

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

(defadvice narrow-to-region (around test activate)
   (message "advice")
   ad-do-it)
当我调用“缩小到区域”时,建议会运行并在缩小之前打印“建议”

当我叫斯内普去德芬时,它没有

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


什么可能导致这种情况?

问题显然是由于字节编译,因此无法建议缩小原语(
缩小到区域
是原语,
缩小到取消
调用
缩小到区域

下面关于()的文章详细介绍了这个问题。以下是《博文深度》的简短版本:

原来
窄到区域
是如此特殊——可能是因为它被频繁使用——以至于它得到了自己的字节码。原语函数调用正在编译成一条指令。这意味着在字节编译代码中不会考虑我的建议。达尔尼特。
加宽
(代码126)也是如此


至于为什么建议在您重新评估后开始起作用
缩小到defun
:我猜这是因为您在重新评估时替换了字节编译版本。

@Dan很好地描述了这个问题。这里有一些信息可以帮助你解决这个问题

您可以做的是建议(或重新定义)也
缩小到defun
(或者
缩小到page
),因此它的作用类似

FWIW,我在图书馆做了类似的事情(见)

我建议
缩小到区域
。但我也重新定义了
窄到defun
窄到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.
以下是狭义定义的相关部分:

  ...
  (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))))
。。。
(转到字符结束)
(向后搜索“^\n”((点)1)t)

(当(或(交互-p)宽n推-p)(宽n推-end));那是一个很好的图书馆!我一直希望找到这种功能有一段时间了。@Dan:FWIW,当与一起使用时,它会变得更好。Multi command
icicle-wide-n
允许您通过名称(完成)或循环在狭窄区域(无狭窄区域)中绊倒。你可以随时删除限制。