模式本地的defadvice

时间:2012-12-28 22:25:45

标签: emacs elisp

是否可以仅针对特定模式/缓冲区使用defadvice修改函数的行为?我希望mouse-yank-primary插入额外的文本,但只有当我处于特定模式时。对于mouse-yank-primary,我尝试过'defadvice',但是一旦激活它就可以在所有其他缓冲区中运行。

我认为可以通过在模式挂钩中将鼠标按钮重新绑定到我自己的函数来解决,但是elisp手册说最好使用defadvice。

2 个答案:

答案 0 :(得分:5)

将鼠标按钮重新绑定到另一个功能对我来说似乎更合适。您不需要模式挂钩,通常只需修改模式的键映射:

(eval-after-load '<mode>
  '(define-key <mode>-map [mouse-2] 'my-mouse-yank-primary))

将建议本地化为主要模式有点困难。没有任何参数可以传递给defadvice来执行此操作,但您可以在模式挂钩中设置一些变量的缓冲区本地值,然后在建议代码中检查此值。如果已经设定,请做一些特别的事情。如果没有,请评估ad-do-it

答案 1 :(得分:2)

将建议本地化为主要模式很容易:

(defadvice foo (after bar activate)
  (when (derived-mode-p 'python-mode)
    (do (something) now)))