2013-08-10 9 views
44

Sto usando syntastic nel mio progetto C++ 11. Quando sto modificando in vim e salvo (: w) il plugin syntastic mi dà errori su ogni elenco di inizializzatori {} e per ogni loop che sono chiaramente caratteristiche di C++ 11 che mancano.come aggiungere il supporto per C++ 11 al plugin syntastic vim?

Ho installato syntastic usando il patogeno.

Ecco due esempi di errore che sto ottenendo su liste di inizializzazione e per ogni loop (sia C++ 11 che compilano bene):

error on initializer lists error on for each loop

+1

Qual è l'output del comando ': echo b: clang_user_options' da un buffer che appartiene al progetto? Se la tua ipotesi è corretta, non ci sarà la sottostringa '-std = C++'. – xaizek

+0

L'output di ': echo b: clang_user_options' è' -I/usr/include -std = C++ 11 -stdlib = libC++ '. Quindi non capisco perché sto ricevendo gli errori relativi agli elenchi di inizializzatori e per ogni loop. Aggiungerò un errore di esempio al post principale. – Carneiro

+0

Risulta che questo è ** non ** clang_complete, questo è syntastic. Aggiornerò il post e la risposta – Carneiro

risposta

80

scopre l'++ linter (sintassi C correttore) di syntastic ha molte opzioni che possono essere impostate sul tuo .vimrc (sfortunato, vorrei che fosse specifico del progetto, come la soluzione .clang_complete).

Per abilitare ++ 11 standard C ed utilizzare la libreria libC++ con clangore (che è ciò che il mio progetto sta usando) ho aggiunto le seguenti righe alla mia ~/.vimrc

let g:syntastic_cpp_compiler = 'clang++' 
let g:syntastic_cpp_compiler_options = ' -std=c++11 -stdlib=libc++' 

ora funziona a meraviglia.

+0

Come ho verificato clang ++ e le opzioni g ++ sono identiche, ho sostituito "clang ++" con "g ++", ma non funziona ancora – rafee

+0

Non penso che tu possa eseguire g ++ con -stdlib = libC++. – Carneiro

+0

Ho provato anche senza -stdlib = libC++, ma non ha avuto successo né – rafee

0

Se si utilizza YouCompleteMe in aggiunta a Syntastic è necessario modificare il file .ycm_extra_conf.py. Cambiare Sepcifically '-WC++ 98-compat' in '-WnoC++ 98-compat'.

Non ho dovuto modificare le impostazioni Syntastic da solo, anche se ciò potrebbe essere dovuto al fatto che sto utilizzando un file compile_commands.json.

via here.

4

Ero di fronte allo stesso problema e Insisto per elaborare C++ 98 e C++ 11 separatamente. qui di seguito è la mia soluzione:

creare il file di nome gcc.vim sotto fascio/syntastic/syntax_checkers/cpp11/ e copiarli ad esso:

"============================================================================ 
"File:  cpp11.vim 
"Description: Syntax checking plugin for syntastic.vim 
"Maintainer: Gregor Uhlenheuer <kongo2002 at gmail dot com> 
"License:  This program is free software. It comes without any warranty, 
"    to the extent permitted by applicable law. You can redistribute 
"    it and/or modify it under the terms of the Do What The Fuck You 
"    Want To Public License, Version 2, as published by Sam Hocevar. 
"    See http://sam.zoy.org/wtfpl/COPYING for more details. 
" 
"============================================================================ 

if exists('g:loaded_syntastic_cpp11_gcc_checker') 
    finish 
endif 
let g:loaded_syntastic_cpp11_gcc_checker = 1 

if !exists('g:syntastic_cpp11_compiler') 
    let g:syntastic_cpp11_compiler = executable('g++') ? 'g++' : 'clang++' 
endif 

if !exists('g:syntastic_cpp11_compiler_options') 
    let g:syntastic_cpp11_compiler_options = '-std=c++11' 
endif 

let s:save_cpo = &cpo 
set cpo&vim 

function! SyntaxCheckers_cpp11_gcc_IsAvailable() dict 
    return executable(expand(g:syntastic_cpp11_compiler)) 
endfunction 

function! SyntaxCheckers_cpp11_gcc_GetLocList() dict 
    return syntastic#c#GetLocList('cpp11', 'gcc', { 
     \ 'errorformat': 
     \  '%-G%f:%s:,' . 
     \  '%f:%l:%c: %trror: %m,' . 
     \  '%f:%l:%c: %tarning: %m,' . 
     \  '%f:%l:%c: %m,'. 
     \  '%f:%l: %trror: %m,'. 
     \  '%f:%l: %tarning: %m,'. 
     \  '%f:%l: %m', 
     \ 'main_flags': '-x c++ -fsyntax-only', 
     \ 'header_flags': '-x c++', 
     \ 'header_names': '\m\.\(h\|hpp\|hh\)$' }) 
endfunction 

call g:SyntasticRegistry.CreateAndRegisterChecker({ 
    \ 'filetype': 'cpp11', 
    \ 'name': 'gcc' }) 

let &cpo = s:save_cpo 
unlet s:save_cpo 

" vim: set et sts=4 sw=4: 

che renderà pedina gcc disponibile (vuole l'altro checker? puoi fare le cose simili che ho fatto per te) per i file con & filetype == 'cpp11' in vim. come rendere i tuoi file automaticamente riconosciuti come cpp11 filetype in vim? basta creare file di nome ext_detect.vim sotto ~/.vim/ftdetect/ con il seguente contenuto:

au bufnewfile,bufread *.cpp11 set ft=cpp11 
au bufnewfile,bufread *.cppx set ft=cpp11 

in questo modo, è possibile elaborare i file cpp * come C++ 98 standard * .cpp11 o * .cppx come C++ 11 standard separatamente, non solo il controllo della sintassi, ma anche l'evidenziazione della sintassi (se hai bisogno del supporto per l'evidenziazione della sintassi cpp11, this vim plugin sarà utile, anche se non perfetto).

4

Ha opzioni specifiche di progetto, come la soluzione .clang_complete

È possibile impostare il percorso per i file g: syntastic_cpp_config_file e g: syntastic_c_config_file. L'impostazione predefinita è .syntastic_cpp_config per C++.Mettere file nella directory principale delle opzioni del progetto e del compilatore interno (uno per ogni linea)

per details

0

Se si utilizza YouCompleteMe, forse si dovrebbe cambiare' .ycm_extra_conf.py'.only cambiare bandiere: (file percorso ~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py);

flags = [ 
'-std=c++11', 
'-O0', 
'-Werror', 
'-Weverything', 
'-Wno-documentation', 
'-Wno-deprecated-declarations', 
'-Wno-disabled-macro-expansion', 
'-Wno-float-equal', 
'-Wno-c++98-compat', 
'-Wno-c++98-compat-pedantic', 
'-Wno-global-constructors', 
'-Wno-exit-time-destructors', 
'-Wno-missing-prototypes', 
'-Wno-padded', 
'-Wno-old-style-cast', 
'-Wno-weak-vtables', 
'-x', 
'c++', 
'-I', 
'.', 
'-isystem', 
'/usr/include/', 
] 
Problemi correlati