6

我喜欢使用 emacs 使用编译模式编译我的 C++ 项目并next-error跳转到源代码中的警告和错误。但是,我发现next-error编译输出中的“包含在文件中”行的每个#include 都非常烦人。我知道你可以compilation-skip-threshold用来跳过警告,但我不想跳过警告,这些包含行显示为警告。

对我来说,这似乎是编译模式下的一个错误(这些不是警告),但是这个错误被关闭为“不是错误”

具体来说,对于如下所示的输出:

In file included from /path/to/file1.h:linenum1:
In file included from /path/to/file2.h:linenum2:
In file included from /path/to/file3.h:linenum3:
/path/to/file4.h:linenum4:columnnum4: warning: you are bad at c++

我想next-error直接带我到 file4.h,而不是在途中停留在文件 1 到 3 中。

谢谢!

4

2 回答 2

5

我为自己尝试过。我们似乎有不同的 gcc 版本,因为我的输出如下所示:

g++ test.cc 
In file included from file3.h:1:0,
                 from file2.h:1,
                 from file1.h:2,
                 from test.cc:2:
file4.h:1:2: warning: #warning "you are bad at c++" [-Wcpp]

但我仍然看到了问题。显然,'gcc-include破坏事物的是正则表达式。在我的情况下,所有这些“来自”行都正确匹配,但最后一个。问题是它以冒号结尾,这以某种方式使其成为警告。我现在有点懒得检查这样的匹配目标有什么可能的 gcc 输出消息(应该是有原因的,嗯?),所以我只回答这个问题:

;; This element is what controls the matching behaviour: according to
;; `compilation-error-regexp-alist` doc, it means if subexpression 4 of the
;; regexp matches, it's a warning, if subexpression 5 matches, it's an info.
(nth 5 (assoc 'gcc-include compilation-error-regexp-alist-alist))
(4 . 5)

;; We could try and tinker with the regexp, but it's simpler to just set it as
;; "always match as info".
(setf (nth 5 (assoc 'gcc-include compilation-error-regexp-alist-alist)) 0)

这个片段阻止了编译模式突出显示最后一个“来自”行作为对我的警告。

于 2013-03-19T03:08:06.523 回答
2

配置compilation-skip-threshold.

于 2013-03-19T13:23:37.477 回答