2013-03-19 23 views
6

Tôi thích sử dụng các emacs để biên dịch dự án C++ của tôi bằng chế độ biên dịch và next-error để chuyển đến cảnh báo và lỗi trong nguồn. Tuy nhiên, tôi thấy rất khó chịu khi next-error đưa tôi đến mọi #include cho các dòng "Trong tệp được bao gồm từ" trong đầu ra biên dịch. Tôi biết bạn có thể sử dụng compilation-skip-threshold để bỏ qua cảnh báo, nhưng tôi không muốn bỏ qua cảnh báo và những dòng này sẽ hiển thị dưới dạng cảnh báo.Làm cách nào để bỏ qua "trong tệp được bao gồm" trong chế độ biên dịch C++ emacs?

Đối với tôi điều này dường như là một lỗi trong chế độ biên soạn (đây không phải là cảnh báo), nhưng this bug đã được đóng như "không phải là một lỗi"

Cụ thể, đối với một đầu ra trông như thế này:

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++ 

Tôi muốn next-error đưa tôi đến đúng file4.h, thay vì dừng lại ở các tệp từ 1 đến 3 trên đường.

Cảm ơn!

+0

Bạn đã thử xóa 'gcc-include khỏi biên dịch-lỗi-regexp-alist chưa? Tôi đã không nhưng sự hiểu biết của tôi về chức năng là sẽ bỏ qua những dòng. – DrC

+0

Tôi đã thử đề xuất của mình và nó không hoạt động - FYI – DrC

+0

+1 chỉ để cảnh báo tuyệt vời đó – assem

Trả lời

5

Tôi đã tự mình thử nó. Chúng tôi dường như có các phiên bản gcc khác nhau, vì kết quả của tôi trông như sau:

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] 

Nhưng tôi vẫn thấy vấn đề. Rõ ràng, đó là regexp 'gcc-include phá vỡ mọi thứ. Trong tình huống của tôi, tất cả những từ "từ" khớp chính xác nhưng cuối cùng. Vấn đề là nó kết thúc bằng dấu hai chấm và bằng cách nào đó nó làm cho nó trở thành một cảnh báo. Tôi là một chút lười biếng tại để kiểm tra những gì có thể gcc đầu ra thông điệp không phù hợp mục tiêu như vậy (có phải là một lý do cho nó, huh?), Vì vậy tôi sẽ chỉ cần trả lời câu hỏi:

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

đoạn này dừng lại chế độ biên dịch từ đánh dấu dòng "từ" cuối cùng làm cảnh báo cho tôi.

+0

Cảm ơn bạn! Hóa ra ai đó đã chuyển sang dự án để sử dụng tiếng kêu thay vì gcc, vì vậy đó là lý do tại sao các thông báo trông khác nhau, nhưng lệnh của bạn đã hoạt động. Tôi đã có một lỗi với 'setf' mặc dù, nhưng bằng cách thay đổi nó thành' (setcar (nthcdr 5 (assoc 'gcc-include biên dịch-lỗi-regexp-alist-alist)) 0) 'Tôi đã nhận nó để làm việc. Tôi rất thiếu kinh nghiệm với lisp và elisp, vì vậy có lẽ tôi đã làm một cái gì đó câm, nhưng nó có vẻ làm việc – stokastic

+0

@stokastic, không, tôi không nghĩ rằng đó là bạn. Vấn đề này đã làm tôi thất vọng về tuổi tác và nó đã sống sót sau vài lần tái sinh của tập tin init và vài phiên bản Emacs của tôi. – immerrr

+0

Sự hiệu chỉnh: thực ra, cả 'gnu và' gcc-include đều khớp với đầu ra của OP. Đó là lý do tại sao đề xuất của DrC để loại bỏ 'gcc-include không đủ. Vì ý tưởng của bạn để sử dụng 'gcc-include để đánh dấu những dòng đó là thông tin hoạt động, nên phải đánh dấu chúng là thông tin ngăn chúng bị đánh dấu là lỗi sau này. Lưu ý rằng, để làm việc này, điều quan trọng là 'gcc-include đến trước' gnu trong danh sách. – User123abc

2

Định cấu hình compilation-skip-threshold.

Các vấn đề liên quan