2011-11-09 16 views
13

L'utilizzo di vim con le funzioni lambda del C++ 11 è in realtà scadente. L'indentazione non funziona e molte parentesi sono contrassegnate come errate.vim e C++ 11 lambda: indentazione automatica

Come noto il rientro e l'evidenziazione della sintassi per c e C++ è programmato internamente e non tramite un file c [...]. Vim. C'è qualche possibilità di configurare vim per C++ 11, in particolare per il codice sorgente con funzioni lambda? Forse qualcuno può dare un suggerimento su come e dove aggiungere l'analisi lambda nel controllo interno della sintassi vim?

EDIT: (esempio di codice come richiesto dai commenti)

Il codice dovrebbe essere simile al seguente esempio, ma è formattato per una singola colonna.

MyLoop([](int a, int b){ 
     {  
      ::i++; 
      for (;;) 
      { 
       SomeFunc(); 
      } 
      cout << "Result: " << a*b<<endl; 
     }  
    });  

Aggiornamento per vim 7.4: Ora vim non gestire più un'espressione lambda come un errore, ma ancora non ha fatto alcuna rientranza nella espressione lambda e quindi non è ancora utilizzabile per C++ più: - (

BTW: qualcuno ha una buona formattazione strumento automatico che può essere aggiunto per l'ambiente vim, in modo che premendo un tasto fare esternamente la formattazione

+1

http://stackoverflow.com/questions/2977174/is-there-a-c0x-syntax-file-for-vim – u0b34a0f6ae

+0

Potresti aggiungere un esempio di come è indentato e come vuoi che indentizzi? – Alex

risposta

11

Vim 7.4 ora ha un jN cinoption per "Indent Java classi anonimi correttamente". (:help java-cinoptions) Questo migliora il comportamento di indentazione per i lambda di C++ 11.

Con queste opzioni (mettere il ~/.vim/dopo/ftplugin/cpp.vim):

setlocal cindent cino=j1,(0,ws,Ws 

E se mi sposto 'per l'apertura doppietta di ciclo alla stessa linea (altrimenti è pazzesco) poi indenta vim il codice in questo modo:

MyLoop([](int a, int b){ 
    {  
     ::i++; 
     for (;;) { 
      SomeFunc(); 
     } 
     cout << "Result: " << a*b<<endl; 
    }  
}); 

non dà il rientro sporgente che si desidera sia. Se sposti la parentesi graffa iniziale con la propria linea, otterrai il rientro desiderato desiderato.

Per tutte le opzioni, vedere :help cinoptions-values.


Se si desidera in programma intelligente rientro, this user recommendsset equalprg=clang-format da usare ClangFormat così =ip sarà il rientro del paragrafo corrente. Questo non renderà il rientro corretto di vim durante la digitazione (è necessario impostare indentexpr per quello ed è piuttosto complicato).

C'è anche a vim plugin che sembra fare lo stesso come equalprg, ma con più codice. Non sono sicuro che sia meglio. Dovrebbe essere un'alternativa a clang-format.py (dalla risposta di Cyprian Guerra).

+0

Nice. Se non si desidera creare il file ~/.vim/after/ftplugin/cpp.vim, è anche possibile aggiungere a .vimrc la seguente riga: 'autocmd BufEnter * .cpp: setlocal cindent cino = j1, (0, WS, Ws' – jmmk

1

Usa

:let c_no_curly_error = 1 
?

Ad esempio, puoi inserirlo nel tuo vimrc.

Per quanto riguarda la tua ipotesi, è sbagliato. C'è un file di sintassi c.vim (in runtime di vim). È possibile vedere un riferimento in :help c.vim e l'implementazione osservandolo nei percorsi di runtime di vim (:echo &rtp).

+0

Questa soluzione rimuove i segni da parentesi graffe non posizionate, che non è quello che preferisco. L'indentazione è ancora sbagliata. – Klaus

+1

Mentre c'è un file di sintassi C, il rientro è fatto internamente e questo sembrava essere il problema importante nel post dell'OP. –

1

C'è il progetto this di Michael Small. Non l'ho ancora provato, ma forse è quello che stai cercando.

+1

Con questi nuovi file di sintassi installati non ho più alcun apparecchio errato, ma il rientro è ancora sbagliato per lambda. – Klaus

0

set autoindent smartindent

Poi si digita il codice sopra in vim, si otterrà il rientro a destra.

MA, se si utilizza gg = G o comandi che contengono "=" per ri-rientro sopra il codice, il rientro è ancora errato.

+0

gg = G è la parte importante della funzione :-) E anche le parentesi graffe rosse non sono molto belle. OK, come detto sopra posso sopprimere TUTTI gli avvisi per parentesi errate, ma anche questo non è utile. Mi sto davvero chiedendo perché nessuno implementa il file di rientro corretto per Vim. In realtà eseguo solo formattatori esterni che sono davvero stupidi! Vim è obsoleto o C++ 11 non è usato spesso? Ora ci sono 2 anni senza una correzione per il problema ... BTW: Anche gli elenchi di inizializzatori sono interrotti con vim :-( – Klaus

0

Cosa ti sembra di essere alla ricerca di è clang-format.py da ragazzi LLVM o vim-clang-format da Linda_pp aka rhysd (idbrii grazie per quest'ultimo) - entrambi utilizzano clang quindi entrambi supportano tutte le C++ 11 nuove strutture ed è possibile eseguirlo come segue:

:pyf ~/src/llvm.git/tools/clang/tools/clang-format/clang-format.py 

o : ClangFormat

quest'ultimo sembra migliore in quanto (tra le altre caratteristiche) permette di seguire il principio "un file di configurazione per lo stesso comportamento in ogni ambiente" regola, soprattutto quando utilizzare un gestore di componenti aggiuntivi VIM (ad es. VAM).

+1

[vim-clang-format] (https://github.com/rhysd/vim-clang-format) afferma di essere un'alternativa superiore a [clang-format.py] (http://clang.llvm.org/docs/ClangFormat.html#vim-integration). Non sono sicuro che sia meglio di equalprg. – idbrii

+0

modifiche al formato clang una tonnellata di formattazione non correlata all'indentazione, che non è sempre auspicabile – pavon

0

Ho appena fatto fatica per alcuni giorni, sembra che l'attivazione di smartindent con cindent abilitato mi abbia aiutato con il rientro lambda in C++ 11.

Nel tuo ~ /.vimrc

set cindent 
set smartindent 

Spero che questo aiuti fa capolino.

+0

Non vedo alcuna modifica Tutte le rientranze all'interno dell'espressione lambda sono ancora interrotte Tutte le parentesi graffe sono spostate su una singola colonna. Puoi mostrare come appare la rientranza con la tua configurazione ? – Klaus

Problemi correlati