Completamento automatico in Vim


257

In breve, sto cercando una funzione di completamento automatico funzionante per l'editor Vim. Ho già sostenuto che Vim sostituisce completamente un IDE su Linux e, sebbene ciò sia certamente vero, manca una caratteristica importante: il completamento automatico.

Conosco Ctrl+ N, integrazione Ctags esuberante , Taglist , cppcomplete e OmniCppComplete . Purtroppo, nessuna di queste corrisponde alla mia descrizione di "completamento automatico funzionante:"

  • Ctrl+N funziona bene (solo) se hai dimenticato come si scrive class, o while. Oh bene.
  • Ctags ti dà i rudimenti ma ha molti svantaggi.
  • Taglist è solo un wrapper Ctags e come tale eredita la maggior parte dei suoi svantaggi (sebbene funzioni bene per elencare le dichiarazioni).
  • cppcomplete semplicemente non funziona come promesso, e non riesco a capire cosa ho fatto di sbagliato, o se "funziona" correttamente e i limiti sono di progettazione.
  • OmniCppComplete sembra avere gli stessi problemi di cppcomplete, ovvero il completamento automatico non funziona correttamente. Inoltre, il tagsfile deve essere nuovamente aggiornato manualmente.

Sono consapevole del fatto che nemmeno gli IDE moderni e completi offrono un buon completamento del codice C ++. Ecco perché finora ho accettato la mancanza di Vim in quest'area. Ma penso che un livello fondamentale di completamento del codice non sia troppo da chiedere ed è in effetti necessario per un uso produttivo. Quindi sto cercando qualcosa che possa realizzare almeno le seguenti cose.

  • Consapevolezza della sintassi . promesse incomplete (ma non mantengono per me), completamento automatico corretto e consapevole di quanto segue:

    variableName.abc
    variableName->abc
    typeName::abc
    

    E davvero, qualsiasi altra cosa è completamente inutile.

  • Configurabilità . Devo specificare (facilmente) dove si trovano i file di origine e quindi da dove lo script ottiene le informazioni di completamento automatico. In effetti, ho un Makefile nella mia directory che specifica i percorsi di inclusione richiesti. Eclipse è in grado di interpretare le informazioni ivi contenute, perché non anche uno script Vim?

  • Attualità . Non appena cambio qualcosa nel mio file, voglio che il completamento automatico rifletta questo. Io non voglio attivare manualmente ctags(o qualcosa di simile). Inoltre, i cambiamenti dovrebbero essere incrementale , cioè quando ho cambiato solo un file è completamente inaccettabile per ctagsri-analizzare l'intero albero di directory (che può essere enorme).

Ho dimenticato qualcosa? Sentiti libero di aggiornare.

Sono a mio agio con un sacco di configurazione e / o armeggiare, ma non voglio programmare una soluzione da zero e non sono bravo a eseguire il debug degli script Vim.

Un'ultima nota, mi piacerebbe davvero qualcosa di simile per Java e C # ma immagino che sia troppo sperare: ctagssolo l'analisi dei file di codice e sia Java che C # hanno framework enormi, precompilati che dovrebbero essere indicizzati. Sfortunatamente, lo sviluppo di .NET senza un IDE è ancora più un PITA che un C ++.


4
È da tanto tempo che non fai questa domanda, ne hai finalmente trovato uno buono? Lo sto chiedendo perché non vedo alcuna risposta accettata. Personalmente, però, devo ammettere che ho fatto ricorso al prefisso delle mie variabili / funzioni. Ad esempio, tutti iniziano con sh(significa che è nella mia libreria) e seguiti dall'abbreviazione della mia classe. Ad esempio shPper la Parserlezione. Quindi tutto ciò che devi fare è scrivere shPe premere CTRL + p (o CTRL + n se vuoi) e ottenere i membri della classe dall'ultimo utilizzo al primo (o dal primo all'ultimo se CTRL + n)
Shahbaz

4
@Shahbaz In effetti, sono convinto che al momento non ci sia abbastanza soluzione. clang_completeè tecnicamente il più valido ma proibizionalmente lento a causa della mancanza di memorizzazione nella cache dei risultati e della compilazione parziale. Devo ammettere di non aver provato tutte le risposte perché alcune richiedono una configurazione contorta e che richiede tempo. Terrò il fiato per un plug-in utilizzabile ora che Clang finalmente consente agli sviluppatori di creare AST da fonti C ++ (fino ad ora non c'erano buoni parser gratuiti per C ++ disponibili).
Konrad Rudolph,

2
Hai provato di clang_completerecente? Può essere utilizzato libclangcon la memorizzazione nella cache ora e quindi dovrebbe essere più veloce.
Jan Larres,

@ Jan Grazie per le informazioni. L'ultima volta che l'ho provato, il supporto per libclang era ancora impreciso. Probabilmente dovrei riprovare una volta che avrò il tempo.
Konrad Rudolph,

(Motivo del rollback della modifica: i nomi dei prodotti non sono codici, non appartengono formatted like this.)
Konrad Rudolph

Risposte:


171

Prova YouCompleteMe . Usa Clang attraverso l'interfaccia libclang, offrendo il completamento semantico C / C ++ / Objective-C. È molto simile a clang_complete, ma sostanzialmente più veloce e con fuzzy-matching.

Oltre a quanto sopra, YCM fornisce anche un completamento semantico per C #, Python, Go, TypeScript ecc. Fornisce anche un completamento non semantico basato su identificatore per linguaggi per i quali non ha supporto semantico.


69
In effetti, accetterò questa soluzione. Finalmente un plugin che offre. Lo uso da diversi giorni ormai. Ci sono voluti solo quattro anni per rispondere a questa domanda. ;-)
Konrad Rudolph

5
fantastico lavoro con YouCompletMe valloric! complimenti
statquant

5
Peccato che YouCompleteMe sia un PITA completo da installare su Windows :(
xx

2
@DrTwox Dal readme: "YCM non ha supporto ufficiale per Windows , ma ciò non significa che non puoi farlo funzionare lì. Vedi la pagina wiki della Guida all'installazione di Windows. Sentiti libero di aggiungerlo."
user456584

7
Questo post dovrebbe menzionare che sei l'autore, poiché si tratta di un'auto-promozione borderline (anche se non sosterrò che risponde alla domanda, dovresti comunque includere un disclaimer).
EntangledLoops

36

C'è anche clang_complete che utilizza il clangcompilatore per fornire il completamento del codice per i progetti C ++. C'è un'altra domanda con suggerimenti per la risoluzione dei problemi per questo plugin.

Il plug-in sembra funzionare abbastanza bene finché il progetto viene compilato, ma è proibitivamente lento per progetti di grandi dimensioni (poiché tenta una compilazione completa per generare l'elenco di tag).


Il clang_completeplugin funziona bene su Cygwin e Windows. Non posso dire nulla di grandi progetti perché non ne ho. :)
Lumi,

Sembra che clang_complete usando libclang abbia ora la memorizzazione nella cache. Questa dovrebbe essere la risposta accettata. Hai provato clang_complete sul kernel Linux? la migliore indicizzazione che ho visto per il kernel sta usando Eclipse CDT, se clang_complete può gestire il kernel dovrebbe essere in grado di completare qualsiasi cosa.
dashesy

clang_complete è semplicemente il miglior plugin Vim che uso.
Cromulent,

1
@Cromulent Ah, controlla YouCompleteMe, è molto meglio.
Konrad Rudolph,

@KonradRudolph Grazie. Lo guarderò.
Cromulent,


6

Ho appena trovato il progetto Eclim collegato in un'altra domanda . Sembra abbastanza promettente, almeno per l'integrazione Java.


L'hai provato? Sembra interessante.
Pacane,

@Pacane: no. Non ho dovuto usare Java da mesi e non avevo tempo libero per sperimentare.
Konrad Rudolph,

1
Eclim sembra essere un'ottima soluzione per Java, anche se Eclipse rimane ancora una bestia da caricare anche in una configurazione senza testa
Drupad Panchal,

2
Per Java, è possibile utilizzare Vrapper . Trovo che di solito vada bene con un superamento automatico eccezionale. Per le occasionali operazioni di modifica del testo, posso avviare Vim reale come strumento esterno.
kizzx2,


2

è quello che stai cercando qualcosa come intellisense?

insevim sembra risolvere il problema.

link a schermate qui


2
Questo sarebbe quello che sto cercando, sì. Sfortunatamente, funziona solo su Windows (sto usando OS X). Inoltre, l'ultimo aggiornamento sembra essere stato effettuato intorno al 2003. :-(
Konrad Rudolph,

bene puoi ottenere il codice sorgente :) se non quello, l'unica cosa che mi viene in mente è omnicompletion .. o dai un'occhiata a questo: ankitjain.org/blog/2007/06/30/integrating-vim-with-monodevelop per roba .net almeno ..
Ric Tokyo,

Ric, ti preghiamo di fornire il tuo commento come due risposte separate, sono preziose e vorrei onorarle correttamente! Detto questo, MonoDevelop è attualmente inutilizzabile su OS X e attualmente sto esaminando OmniCppComplete.
Konrad Rudolph,

Lol questo è solo Windows! :( Perché dovresti volerlo su Windows dove hai VS .. Sto cercando una soluzione su Linux.
Nils

Nils: non tutti hanno accesso a Visual Studio, ma anche molte persone hanno competenze vi che vogliono applicare in ambiente Windows. C'era una porta per Linux, ma è attualmente inattivo. In ogni caso, cosa stai cercando di ottenere? sei sicuro di non aver bisogno solo delle funzioni di completamento automatico predefinite? linux.org/docs/ldp/howto/C-editing-with-VIM-HOWTO/…
Ric Tokyo

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.