Emacs 如何同时使用dart模式和d模式(为什么我们不能和睦相处?)

Emacs 如何同时使用dart模式和d模式(为什么我们不能和睦相处?),emacs,elisp,dart,Emacs,Elisp,Dart,我试图在Emacs24中使用省道模式和d模式。如果我单独使用任何一种模式,一切都很好。如果我在每种类型的文件上分别使用这两种模式,那么在缩进D代码时会出现错误 以下是在初始化时需要执行以下操作后出现的错误: (require 'd-mode) (require 'dart-mode) 然后在第一个加载的d文件上打开d模式 Error during redisplay: (jit-lock-function 1) signaled (invalid-function (setq ad-retur

我试图在Emacs24中使用省道模式和d模式。如果我单独使用任何一种模式,一切都很好。如果我在每种类型的文件上分别使用这两种模式,那么在缩进D代码时会出现错误

以下是在初始化时需要执行以下操作后出现的错误:

(require 'd-mode)
(require 'dart-mode)
然后在第一个加载的d文件上打开d模式

Error during redisplay: (jit-lock-function 1) signaled (invalid-function (setq ad-return-value (with-no-warnings (funcall ad--addoit-function))))
再次-如果我不需要“省道模式”,一切都很好

d模式来自,省道模式来自

这是否意味着两种模式之间存在某些不兼容,或者存在其他设置问题?我尝试过--没有站点文件,但仍然没有运气


换一种方式说,如果我在下面提到一个D文件和其中的M-x D-mode,我就得到了问题:

user@user-thinkpad:/tmp/breakEmacs$ ls
dart-mode.el  d-mode.el  emacs_test.el
user@user-thinkpad:/tmp/breakEmacs$ cat emacs_test.el
(add-to-list 'load-path "/tmp/breakEmacs")
(require 'd-mode)
(require 'dart-mode)
user@user-thinkpad:/tmp/breakEmacs$ emacs-snapshot --no-init-file --no-site-file -l /tmp/breakEmacs/emacs_test.el 
我希望这种方式能够成功地消除我的.emacs文件中的潜在问题


根据@wvxvw的建议,我尝试通过添加(错误t上的setq debug)进行调试,它提供了如下所示的调用堆栈。我说喜欢是因为有些行很大,看起来像是二进制编码的,所以我省略了一些文本。但是,希望这里有一些有用的东西来指出罪魁祸首

Debugger entered--Lisp error: (invalid-function (setq ad-return-value (with-no-warnings (funcall ad--addoit-function))))
  (setq ad-return-value (with-no-warnings (funcall ad--addoit-function)))()
  ad-Advice-c-parse-state(#[nil ...] 5])
  apply(ad-Advice-c-parse-state #[nil ...] nil)
  c-parse-state()
  #[nil  ...] 8 ("/usr/share/emacs/24.3.50/lisp/progmodes/cc-engine.elc" . 156151)]()
  ad-Advice-c-guess-basic-syntax(#[nil ...] 8 ("/usr/share/emacs/24.3.50/lisp/progmodes/cc-engine.elc" . 156151)])
  apply(ad-Advice-c-guess-basic-syntax #[nil ...] 8 ("/usr/share/emacs/24.3.50/lisp/progmodes/cc-engine.elc" . 156151)] nil)
  c-guess-basic-syntax()
  c-indent-line()
  c-indent-command(nil)
  c-indent-line-or-region(nil nil)
  call-interactively(c-indent-line-or-region nil nil)
  command-execute(c-indent-line-or-region)

问题出在省道模式下。它使用如下代码:

(if (not (c-major-mode-is 'dart-mode))
    (ad-do-it)
然而它应该是

(if (not (c-major-mode-is 'dart-mode))
    ad-do-it

请注意,使用Emacs 24.2.1和那些完全相同的d模式和dart模式实现,我无法重现这个问题。酷。您对如何排除故障有什么建议吗?有什么有用的信息吗?没有,我不太确定。我添加了这个标记,因为它似乎是elisp代码中的一个bug。@DarshanComputing:我添加了一个非常简单的方法来查看它。我正在使用GNU Emacs 24.3.50.1。你真的打开了一个d文件并进入了d模式吗?@user1338952是的,我打开了一个d文件,进入了d模式,添加和删除了代码,并让emacs通过各种方式成功地缩进了我的代码。