我已经使用YouCompleteMe插件获得了Vim(使用C语言语言的语义支持编译),我将其用于Python等。现在我想用C语言尝试(我以前从未用C开发过) ,所以我对某些细节有一点模糊的想法,比如必要的标志。)
要在Y中使用YCM的语义完成功能,我需要提供一个.ycm_extra_conf.py
文件; YCM用户指南指向YCM自己的.ycm_extra_conf.py
作为参考(link)。
以下(基于上述.ycm_extra_conf.py
)会为C产生“最小工作设置”(我可以指向g:ycm_global_ycm_extra_conf
):
flags
:
flags = [
'-Wall', '-Wextra', '-Werror',
'-std=c11',
'-x', 'c'
]
和FlagsForFile
功能没有final_flags.remove( '-stdlib=libc++' )
行。
否则示例文件将保持原样。我相信-isystem
标志与YCM严格相关,这是正确的吗?
答案 0 :(得分: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
答案 1 :(得分:2)
为了给您一个工作示例,这是我用于Arduino项目的配置。
https://github.com/WeAreLeka/Bare-Arduino-Project/blob/master/.ycm_extra_conf.py
在flags
我已经放置了IDE提供的所有Arduino库,需要编译我的代码。
我还编写了一个小功能,可以在我的/lib
目录中查找我在我的项目中使用的其他库,并将其自动添加到flags
。它是line 57。
如果您使用大量的库并且不想每次都修改您的配置文件,这会很有帮助。
如果没有-I /path/to/lib/folder
,您就无法获得自动完成功能。
希望这会有所帮助:)
答案 2 :(得分:1)
只要简单地clang++ -c source
编译源代码就完全无效(c vs. c ++由扩展决定)。 YCM愉快地完成了在随机目录中为我创建的临时测试。
不需要-x c
。如果来源有扩展名.c
或.h
,则会假定它是C,如果它有扩展名.C
,.cc
,.cpp
,{{1} },.cxx
,.H
,.hh
或.hpp
假定为C ++。只有当您的C ++标题只有.hxx
时才需要.h
。
最新的clang(4.9)已经默认为c11和c ++ 11,所以你也不需要它们。
所以你只需要任何-x c++-header
标志,并且警告很有用。