2013-03-19 1 views
6

Мне нравится использовать emacs для компиляции моего проекта на C++ с использованием режима компиляции и next-error, чтобы перейти к предупреждениям и ошибкам в источнике. Тем не менее, мне очень досадно, что next-error приводит меня к каждому #include для строк «В файле, включенном из» на выходе компиляции. Я знаю, что вы можете использовать compilation-skip-threshold, чтобы пропускать предупреждения, но я не хочу пропускать предупреждения, и они включают строки, отображаемые как предупреждения.Как я могу пропустить «в файле, включенном из» в режиме компиляции emacs C++?

Для меня это, кажется, ошибки в режиме компиляции (это не предупреждение), но this bug был закрыт, как «не ошибка»

В частности, для вывода, который выглядит следующим образом:

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 по пути.

Спасибо!

+0

Вы пытались удалить 'gcc-include из compilation-error-regexp-alist? У меня нет, но мое понимание функциональности - это пропустить эти строки. – DrC

+0

Я попробовал свое предложение, и это не сработало - FYI – DrC

+0

+1 только за это замечательное предупреждение – assem

ответ

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, которое ломает вещи. В моей ситуации все эти строки «из» соответствуют правильно, но последние. Проблема в том, что она заканчивается в двоеточие, и это как-то делает ее предупреждением. Я немного ленивый сейчас, чтобы проверить, что это возможно НКУ исходящее сообщение имеет такие соответствия целевой (не должно быть причиной для этого, да?), Так что я просто ответить на вопрос:

;; 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) 

Этот фрагмент кода остановленном режим компиляции от выделения последней строки «от» в качестве предупреждения для меня.

+0

Awesome thanks! Оказывается, кто-то переключил проект на использование clang вместо gcc, поэтому сообщения выглядят по-другому, но ваша команда сработала. Я получил ошибку с 'setf', но, изменив ее на' (setcar (nthcdr 5 (assoc 'gcc-include compilation-error-regexp-alist-alist)) 0) 'Я получил его для работы. Я очень неопытен с lisp и elisp, поэтому, возможно, я сделал что-то немое, но, похоже, работает – stokastic

+0

@stokastic, нет, я не думаю, что это вы. Эта проблема подтачивала меня целую вечность, и она пережила несколько реинкарнаций моего init-файла и пару версий Emacs. – immerrr

+0

Коррекция: фактически, как gnu, так и gcc-include соответствуют выходному сигналу OP. Вот почему предложение DrC по удалению gcc-include не достаточно. Поскольку ваша идея использовать «gcc-include» для обозначения этих строк в качестве работы с информацией, это должно означать, что их маркировка не позволяет помечать их позже как ошибку. Обратите внимание, что для этого важно, чтобы «gcc-include пришел до» gnu в списке. – User123abc

 Смежные вопросы

  • Нет связанных вопросов^_^