2013-03-19 7 views
6

Mi piace usare emacs per compilare il mio progetto C++ utilizzando la modalità di compilazione e next-error per passare agli avvisi e agli errori nella fonte. Tuttavia, trovo estremamente fastidioso che lo next-error mi porti ad includere #include per le righe "Nel file incluso da" nell'output della compilation. So che puoi usare compilation-skip-threshold per saltare gli avvertimenti, ma non voglio saltare gli avvisi, e queste includono le linee che appaiono come avvertenze.Come posso saltare "nel file incluso da" nella modalità di compilazione C++ emacs?

A me questo sembra essere un bug nella modalità di compilazione (queste non sono avvertimenti), ma this bug è stato chiuso come "non un bug"

In particolare, per un output che assomiglia a questo:

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

Voglio next-error per portarmi a destra su file4.h, invece di fermarsi nei file da 1 a 3 sulla strada.

Grazie!

+0

Hai provato a rimuovere 'gcc-include da compilation-error-regexp-alist? Non ho che la mia comprensione della funzionalità è che salta queste righe. – DrC

+0

Ho provato il mio suggerimento e non ha funzionato - FYI – DrC

+0

+1 solo per quel fantastico avvertimento – assem

risposta

5

L'ho provato per me stesso. Ci sembra di avere diverse versioni di gcc, perché la mia uscita è simile al seguente:

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] 

Ma io continuo a vedere il problema. Apparentemente, è la regexp 'gcc-include che rompe le cose. Nella mia situazione, tutte quelle righe "da" corrispondono correttamente ma l'ultima. Il problema è che finisce in due punti e questo in qualche modo lo rende un avvertimento. Sono un po 'pigro ora di verificare quali possibili gcc messaggio di uscita non tale obiettivo corrispondenza (ci dovrebbe essere una ragione per questo, eh?), Quindi mi limiterò a rispondere alla domanda:

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

Questo frammento interrotto modalità compilation dall'evidenziare l'ultima riga "from" come avvertimento per me.

+0

Grazie fantastici! A quanto pare qualcuno ha cambiato il progetto per usare clang invece di gcc, ecco perché i messaggi sembrano diversi, ma il tuo comando ha funzionato. Ho avuto un errore con 'setf', ma cambiandolo in' (setcar (nthcdr 5 (assoc 'gcc-include compilation-error-regexp-alist-alist)) 0) 'Ho avuto modo di funzionare. Sono molto inesperto di lisp e elisp, quindi forse ho fatto qualcosa di stupido, ma sembra funzionare – stokastic

+0

@stokastic, no, non penso che sia tu. Questo problema mi ha tormentato da anni ed è sopravvissuto a diverse reincarnazioni del mio file init e di due versioni di Emacs. – immerrr

+0

Una correzione: in realtà, sia 'gnu che' gcc-include corrispondono all'output dell'OP. Ecco perché il suggerimento di DrC di rimuovere 'gcc-include non è sufficiente. Dato che la tua idea di usare 'gcc-include per contrassegnare quelle linee mentre le informazioni funzionano, deve essere che contrassegnarle come informazioni impedisce loro di essere contrassegnate come errore più tardi. Nota che, affinché funzioni, è importante che 'gcc-include venga prima di' gnu nella lista. – User123abc

2

Configurare compilation-skip-threshold.

Problemi correlati