defadvice起作用了,而advice-add没起作用,没搞清楚原因

图上面两种不同的advice,用defadvice启动emacs就有作用,而用advice-add只有用run-with-idle-timer延时执行才起作用,没搞清楚原因,有人知道为啥么?

能复制代码不?

(defun advice-show-paren-function (fn)
    (cond ((looking-at-p "(\\|)") (funcall fn))
          (t (save-excursion
               (ignore-errors (backward-up-list))
               (funcall fn))))
    )
  (run-with-idle-timer 2 nil (lambda ()
                               (advice-add #'show-paren-function :around #'advice-show-paren-function)))
  ;;-------------------------------------------------------------
  (defadvice show-paren-function (around advice-show-paren-function activate)
    (cond ((looking-at-p "(\\|)") ad-do-it)
          (t (save-excursion
               (ignore-errors (backward-up-list))
               ad-do-it))))

%E6%B7%B1%E5%BA%A6%E5%BD%95%E5%B1%8F_emacs_20190527183451

我这里直接用advice-add都行,用emacs -Q测试的

我在emacs的scratch里面也可以,但是添加到配置文件中,重新启动emacs就有区别

行吧,我又粘贴进配置里测试了一次,还是没问题,可能是你的配置里有问题

哦 多谢 我在测试下

忘了说了 这个在我的linux服务器(emacs -nw 终端使用)上没问题,在windows上有问题。。。

C-h f sh…看看函数是否有advice

两种方式show-paren-function的advice函数不一样。 第一种defadvice如下

show-paren-function is a compiled Lisp function in ‘paren.el’.

(show-paren-function)

:around advice: ‘ad-Advice-show-paren-function’

Highlight the parentheses until the next input arrives.

[back]

第二种 advice-add :emacs刚启动如下

show-paren-function is a compiled Lisp function in ‘paren.el’.

(show-paren-function)

:around advice: ‘ad-Advice-show-paren-function’
:around advice: ‘advice-show-paren-function’

Highlight the parentheses until the next input arrives.

这时候emacs刚启动advice不起作用 然后我在(advice-add #'show-paren-function :around #'advice-show-paren-function)这个后面C-x C-e后的advice如下:

show-paren-function is a compiled Lisp function in ‘paren.el’.

(show-paren-function)

:around advice: ‘advice-show-paren-function’
:around advice: ‘ad-Advice-show-paren-function’

Highlight the parentheses until the next input arrives.

advice-add 的两次说明的两个advice顺序颠倒了下,然后advice就有作用了。 还有用advice-add方式显示有两个around advice,这个是正常的么?

我使用的evil,在evil的代码里面发现有对show-paren-function有advice,是不是这个影响的。

我把evil禁用了 advice-add就起作用了,还没找见具体的原因

顺序吧,有两个override ad的时候,会覆盖前一个? 可以尝试调整evil和你自己ad的顺序,或者在evil之后remove evil的ad

好像不是evil的这个advice影响的,我把这个advice注释了还是不起作用。先不弄了,等以后有空了在看看,太费时间了