2014-08-31 9 views
6

Ho già Vim con il plugin YouCompleteMe (compilato con supporto semantico per i linguaggi C-family), che utilizzo per Python ecc. Ora mi piacerebbe provarlo con C (non ho mai sviluppato con C prima, quindi ho un'idea leggermente sfocata su alcuni dettagli, come le bandiere necessarie.)Vim + YouCompleteMe + C: un minimo .ycm_extra_conf.py?

Per utilizzare le funzioni di completamento semantico di YCM con C, è necessario fornirgli un file .ycm_extra_conf.py; la guida per l'utente di YCM punta a .ycm_extra_conf.py di YCM come riferimento (link).

avrebbero i seguenti (in base al suddetto .ycm_extra_conf.py) produrre "una configurazione minima di lavoro" per C (a cui poter quindi puntare g:ycm_global_ycm_extra_conf):

La flags: funzione

flags = [ 
'-Wall', '-Wextra', '-Werror', 
'-std=c11', 
'-x', 'c' 
] 

e FlagsForFile senza la riga final_flags.remove('-stdlib=libc++').

Altrimenti il ​​file di esempio rimarrebbe così com'è. Credo che i flag -isystem siano strettamente correlati a YCM, è corretto?

+1

Non puoi provare? – romainl

risposta

1

Niente è assolutamente valido fino a quando le origini possono essere compilate semplicemente clang++ -c source (c contro C++ è deciso dall'estensione). YCM completa felicemente i test scratch creati in directory casuali per me.

Il -x c non è necessario. Se la sorgente ha estensione .c o .h, si presume essere C e se ha estensione .C, .cc, .cpp, .cxx, .H, .hh, .hpp o .hxx si presume C++. Solo se hai intestazioni C++ con solo .h hai bisogno di -x c++-header.

Il più recente clang (4.9) è già impostato su c11 e C++ 11, quindi non è necessario averne bisogno.

Quindi sono necessari solo i flag -I e gli avvisi sono utili.

2

Per darvi un esempio funzionante, ecco la configurazione che sto utilizzando per i progetti Arduino.

https://github.com/WeAreLeka/Bare-Arduino-Project/blob/master/.ycm_extra_conf.py

Nel flags ho messo tutte le librerie Arduino forniti dal IDE e necessari per compilare il mio codice.

Ho anche scritto una piccola funzione per trovare le altre librerie nella mia dir /lib che sto usando nel mio progetto e aggiungerle automaticamente a flags. È line 57.

È utile se si utilizzano molte librerie e non si desidera modificare ogni volta il proprio file di configurazione.

Senza lo -I /path/to/lib/folder non si otterrà il completamento automatico.

Spero che questo aiuti :)

4

ero alla ricerca di questo troppo e sembra qui non abbiamo ottenere una buona soluzione. Anche questa è una domanda molto vecchia, spero che questo possa aiutare qualcuno.I seguenti lavori per me,

import os 
import ycm_core 

flags = [ 
    '-Wall', 
    '-Wextra', 
    '-Werror', 
    '-Wno-long-long', 
    '-Wno-variadic-macros', 
    '-fexceptions', 
    '-ferror-limit=10000', 
    '-DNDEBUG', 
    '-std=c99', 
    '-xc', 
    '-isystem/usr/include/', 
    ] 

SOURCE_EXTENSIONS = [ '.cpp', '.cxx', '.cc', '.c', ] 

def FlagsForFile(filename, **kwargs): 
    return { 
    'flags': flags, 
    'do_cache': True 
    } 

Tra l'altro, tale file di configurazione lungo dal difetto mi preoccupa così tanto. Dovrei dare credito per questo post, http://cocoaspice.logdown.com/posts/302432-youcompleteme-toss-notes

+0

Se stai usando C++, aggiungi un flag 'C++' invece di 'c'. Altrimenti ti dirà "non puoi usare throw con eccezioni disabilitate" e altri strani errori. –