我们已经开始使用 TypeScript 和 Emacs 作为我们选择的编辑器。
我们发现的一个问题是 TypeScript 错误行格式似乎与 Emacs 编译模式错误处理不兼容。
例如
如果我们编译一个 C 程序并引入一个故意的错误,我们会得到
t1.c:6:5: error: use of undeclared identifier 'a'
如果我们对 TypeScript 编译器执行相同的操作(忽略该消息,其格式很重要)
utilities.ts(13,18): error TS2384: Overload signatures must all be ambient or non-ambient.
Emacs 可以使用键盘命令 ESC-g n 处理第一类错误消息,并将主编辑器窗口移动到错误处。
Emacs 无法处理第二个错误行格式。
我们通过将 TypeScript 编译器包装在 Perl 脚本中,并让 Perl 脚本适当地重新格式化行,找到了一种解决方法。这可行,但有点混乱,如果 TypeScript 具有更多的灵活性那就太好了。
我们想知道是否有一个标志或某种方法可以将 Typescript 错误输出更改为与 Emacs 兼容的格式。
t1.c:6:5: ...
格式实际上是GNU编码标准中记录的官方格式,所以我认为你应该联系Typescript编译器的作者并要求他们更改错误消息的格式。
同时,您需要调整
compilation-error-regexp-alist
向compile.el 解释如何识别 Typescript 的错误消息。
大概是这样的
(eval-after-load 'compile
(add-to-list 'compilation-error-regexp-alist
'("^\\([^(\n]+\\)(\\([0-9]+\\),\\([0-9]+\\)):" 1 2 3)))
可能会让你开始。如果某些消息不是实际错误,而是更像警告或辅助信息,您可以改进上述内容。有关格式的详细信息,请参见
C-h v compilation-error-regexp-alist RET
。
您还可以通过运行类似
tsc --pretty false app.ts
的命令来关闭漂亮模式,然后 emacs 编译模式将开始识别错误输出。
重申上面 Dimitri 所说的,您可以以正常方式将
tsc
调用包装在 Makefile
中:
TSC = tsc
TSCFLAGS := --noEmitOnError --pretty false
.PHONY: clean
all: app.js
app.js: app.ts
$(TSC) $(TSCFLAGS) $<
clean:
rm -f *.js
现在您可以
M-x compile
,然后 M-x next-error
,Emacs 将能够正确解释 tsc
输出(因为 --pretty 选项)。