如何调整Emacs的compile-goto-error从编译缓冲区获取路径?

14

我正在使用Emacs 23,并遇到了以下问题:

我在Emacs中像这样运行我们项目的构建系统:M-x compile -> cd /foo/bar && ./build

构建系统现在会进行一些魔法操作,"cd"进入用于构建过程的某个子目录,然后gcc会抛出一个错误:

../src/somesource.cc:50 error: blablabla

现在的问题是,Emacs找不到该路径,因为它假设编译过程始于/foo/bar,而不是/foo/bar/builddir。所以前导的"../"对于Emacs无效,例如,在运行compile-goto-error时。有没有办法告诉Emacs尝试跳过前导的"../"?


1
很奇怪的是,我在构建Emacs时遇到了这个问题... - SamB
2个回答

17
最佳解决方案可能是更改构建系统,使其在更改目录时发出消息。Emacs正在寻找该消息。
Entering directory `...'
... 
Leaving directory `...'

(请查看compilation-directory-matcher变量。如果您的构建系统在更改目录时确实发出消息,但它们不符合Emacs正在查找的格式,则可以向compilation-directory-matcher添加新的正则表达式。)

另一种解决方法是更改compilation-search-path(它是一个目录列表)。


1
我之前不知道Emacs的“Entering…”功能。这个应该有所帮助! - Arne
2
@Arne,当使用递归的makefile时,GNU Make 以这种形式打印消息,这就是Emacs寻找它们的原因。 - cjm
1
这个解决方案似乎是我正在寻找的,但我无法编辑 compilation-directory-matcher 变量(如你在这里看到的:http://stackoverflow.com/q/21309720/61838)。此外,`compilation-search-path` 似乎不能解决问题(即使我只需要emacs 在一个目录中查找源代码)。任何帮助将不胜感激! - claf
1
GNU make最近被更改/修复,使用U+0027代替U+0060作为开头引号,而您的emacs版本可能仍在寻找旧的U+0060字符。请参见http://savannah.gnu.org/bugs/?34530 尝试类似以下的内容:(setq compilation-directory-matcher '("\(?:Entering\|Leavin\(g\)\) directory ['`]\(.+\)'$" (2 . 1))) - Brad Spencer

0

有几次我通过将 make 的输出传递给 sed 来解决问题。

首先,通过交互式调试“编译命令:make | sed 's/x/y/'”来进行调试。然后将其打包为自定义的 Emacs 交互函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接