我试图获得编译模式以正确识别Dart中错误的源文件。下面是一个堆栈跟踪示例。
Illegal argument(s): Id has invalid characters sample.xmi
#0 Id.Id (package:ebisu/src/ebisu_id/id.dart:23:7)
#1 id (package:ebisu/src/ebisu_dart_meta/meta.dart:1104:22)
#2 library (package:ebisu/src/ebisu_dart_meta/meta.dart:1108:46)
#3 Converter.convert (file:///home/user/open_source/codegen/dart/xmi/lib/xmi_to_dart.dart:44:30)
#4 main (file:///home/user/open_source/codegen/dart/xmi/lib/xmi_to_dart.dart:164:20)
首先,我不确定使用哪种省略式最好。我找到了这两个:
- https://github.com/nex3/dart-mode/blob/master/dart-mode.el
- http://dart.googlecode.com/svn/trunk/dart/tools/utils/elisp/dart-mode.el
不确定推荐哪个?我正在尝试使用第一个,但我没有看到任何与编译错误支持相关的内容。后者有它的一些东西,但它不匹配(可能过时,因为编译器消息/堆栈跟踪已经发展)。在这里,在我的尝试中,我将这些行添加到第一个省道模式文件中:
(require 'compile)
(add-to-list 'compilation-error-regexp-alist 'dart)
(add-to-list 'compilation-error-regexp-alist-alist
'(dart "(file://\([^:]*\):\([0-9]*\):\([0-9]*\))" 1 2 3))
因此,这确实匹配'…(file:///…)'所列的行,并正确跳转到错误。它(或其他表达式)错误地识别像示例"…(package:ebisu/src/…)"中的#0堆栈帧这样的行,并在minibuffer中留下错误类型消息"在…中查找此错误",要求我输入要跳转到的文件名。我想解决这个问题。两个问题,我不确定它是如何得到匹配包的,也许是其他匹配算法?第二,是否有一种方法来匹配'#0'堆栈帧,使它只在当前目录(CWD)中查找文件并处理文本
(package:ebisu/src/ebisu_id/id.dart:23:7)
作为
的等价(file://CWD/packages/ebisu/src/ebisu_id/id.dart:23:7)
其中CWD文本替换为当前工作目录?
如果您在Emacs中应用补丁,错误11777编译。因此,您应该能够执行以下操作:
(add-to-list 'compilation-error-regexp-alist 'dart-package)
(add-to-list 'compilation-error-regexp-alist-alist
'(dart-package "(package:\([^:]*\):\([0-9]*\):\([0-9]*\))"
(1 "packages/%s") 2 3))
compilation-error-regexp-alist
的文档字符串提到了这个格式字符串技巧,但如果没有补丁,它似乎无法正常工作。