2014-08-31 6 views
6

मुझे पहले से ही आपके साथ मिल गया है ICompleteMe प्लगइन (सी-पारिवारिक भाषाओं के लिए अर्थपूर्ण समर्थन के साथ संकलित), जिसे मैं पायथन आदि के लिए उपयोग करता हूं। अब मैं इसे सी के साथ आजमाने की कोशिश करता हूं (मैंने कभी सी के साथ विकसित नहीं किया है, तो मुझे आवश्यक झंडे की तरह कुछ विवरणों के बारे में थोड़ा अस्पष्ट विचार मिला है।)विम + YouCompleteMe + C: न्यूनतम .ycm_extra_conf.py?

सी के साथ वाईसीएम की अर्थपूर्ण समापन सुविधाओं का उपयोग करने के लिए, मुझे इसे .ycm_extra_conf.py फ़ाइल प्रदान करने की आवश्यकता है; वाईसीएम उपयोगकर्ता गाइड संदर्भ के रूप में वाईसीएम के अपने .ycm_extra_conf.py को इंगित करता है (link)।

चाहेंगे निम्नलिखित (पूर्वोक्त .ycm_extra_conf.py के आधार पर) का उत्पादन सी ​​के लिए "एक न्यूनतम काम कर सेटअप" (जो करने के लिए मैं तो g:ycm_global_ycm_extra_conf बात कर सकता है):

flags:

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

और FlagsForFile समारोह final_flags.remove('-stdlib=libc++') लाइन के बिना।

अन्यथा उदाहरण फ़ाइल जैसी ही रहेगी। मेरा मानना ​​है कि -isystem झंडे सख्ती से वाईसीएम से संबंधित हैं, क्या यह सही है?

+1

क्या आप अभी कोशिश नहीं कर सकते? – romainl

उत्तर

1

कुछ भी बिल्कुल मान्य नहीं है जब तक कि स्रोतों को clang++ -c source (सी बनाम सी ++ विस्तार से तय किया गया हो) द्वारा संकलित किया जा सके। वाईसीएम खुशी से मेरे लिए यादृच्छिक निर्देशिका में बनाए गए स्क्रैच परीक्षणों में पूरा करता है।

-x c की आवश्यकता नहीं है। स्रोत विस्तार .c या .h है, यह सी माना जाता है और यह सी ग्रहण करता है, तो यह विस्तार .C, .cc, .cpp, .cxx, .H, .hh, .hpp या .hxx है ++। केवल तभी यदि आपके पास .h के साथ सी ++ हेडर हैं तो आपको -x c++-header की आवश्यकता है।

नवीनतम क्लैंग (4.9) पहले से ही c11 और C++ 11 पर डिफ़ॉल्ट है, इसलिए आपको उन की आवश्यकता नहीं होनी चाहिए।

तो आपको केवल -I झंडे की आवश्यकता है और चेतावनियां उपयोगी हैं।

2

आपको एक कामकाजी उदाहरण देने के लिए, यहां कॉन्फ़िगरेशन है जिसका उपयोग मैं Arduino परियोजनाओं के लिए कर रहा हूं।

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

flags में मैं सब Arduino आईडीई द्वारा प्रदान की और मेरी कोड संकलन करने के लिए आवश्यक पुस्तकालयों रख दिया है।

मैंने अपने /lib डीआईआर में अन्य पुस्तकालयों को खोजने के लिए एक छोटा सा फ़ंक्शन भी लिखा है जिसे मैं अपने प्रोजेक्ट में उपयोग कर रहा हूं और उन्हें flags पर स्वचालित रूप से जोड़ना चाहता हूं। यह line 57 है।

यदि आप बहुत सारे libs का उपयोग करते हैं और हर बार अपनी conf फ़ाइल को संशोधित नहीं करना चाहते हैं तो यह सहायक है।

-I /path/to/lib/folder के बिना आपको स्वत: पूर्णता नहीं मिलेगी।

आशा इस मदद करता है :)

4

मैं भी इस बात के लिए खोज रहा था और यहाँ लगता है हम एक अच्छा समाधान नहीं मिलता है। यहां तक ​​कि यह एक बहुत पुराना सवाल है, मुझे उम्मीद है कि यह किसी की मदद कर सकता है।मेरे लिए निम्नलिखित काम करता है,

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 
    } 

वैसे, डिफ़ॉल्ट रूप से उस लंबी कॉन्फ़िगर फ़ाइल को मुझे परेशान करता है। मुझे इस पोस्ट के लिए क्रेडिट देना चाहिए, http://cocoaspice.logdown.com/posts/302432-youcompleteme-toss-notes

+0

यदि आप C++ का उपयोग कर रहे हैं, तो 'c' के बजाय 'C++' ध्वज जोड़ें। अन्यथा यह आपको बताएगा कि "आप अक्षम अपवादों के साथ फेंक का उपयोग नहीं कर सकते" और अन्य अजीब त्रुटियां। –