V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
pydog
V2EX  ›  Vim

自动补全神器 YouCompleteMe 在 linux c 和 linux kernel 开发上的使用

  •  
  •   pydog · 2014-09-10 22:56:10 +08:00 · 17875 次点击
    这是一个创建于 3728 天前的主题,其中的信息可能已经有所发展或是发生改变。
    如题,折腾了几个小时,总算在服务器的上编译安装上了神器,试用了下,没有惊喜!
    linux C 开发不能自动补全,更别说linux kernel,是配置文件设置有问题吗?有没有成功用上在linux C 和 linux kernel开发的。
    28 条回复    2014-09-26 17:13:02 +08:00
    mantianyu
        1
    mantianyu  
       2014-09-10 23:04:14 +08:00
    远离自动补全...
    reeco
        2
    reeco  
       2014-09-10 23:17:35 +08:00
    只用用tab
    Goooogle
        3
    Goooogle  
       2014-09-10 23:24:58 +08:00 via Android
    好像只补全当前文件中出现过的变量名、字符串等
    ChiangDi
        4
    ChiangDi  
       2014-09-10 23:27:26 +08:00
    分享下我的 YouCompleteMe 配置,
    https://github.com/dd1994/dotfiles/blob/master/.vimrc#L163-170
    https://github.com/dd1994/dotfiles/blob/master/.ycm_extra_conf.py
    我这个就是在 Ubuntu 下写写 C 语言作业的配置,如果写 C++ 自己改 ycm_extra_conf.py
    建议看完官方文档再使用。
    Tonni
        5
    Tonni  
       2014-09-11 00:11:16 +08:00
    就用VIM自带的Ctrl + N来补全
    spacewander
        6
    spacewander  
       2014-09-11 00:17:11 +08:00
    <c-space>下看看,说不定有惊喜呢
    tonyluj
        7
    tonyluj  
       2014-09-11 00:51:43 +08:00
    不能补全的话 继续看看官方文档 看看错误日志
    pydog
        8
    pydog  
    OP
       2014-09-11 08:15:27 +08:00
    @Tonni 自带的补全只能补全目录和文件名,对大工程还是不行的 。。。
    pydog
        9
    pydog  
    OP
       2014-09-11 08:16:13 +08:00
    @tonyluj 看了错误日志,没问题,应该是我的ycm_extra_conf.py没配置对
    pydog
        10
    pydog  
    OP
       2014-09-11 08:32:13 +08:00
    @ChiangDi 看了配置文件,就是添加了相应的头文件目录,谢谢分享 。。。 YCM折腾起来麻烦,惊喜的效果还没有。
    lingxi27
        11
    lingxi27  
       2014-09-11 08:45:46 +08:00
    ycm折腾过一次,不喜欢,还是回到clangcomplete了
    jsfaint
        12
    jsfaint  
       2014-09-11 08:55:45 +08:00
    ycm要配合这个用 https://github.com/tdcdev/ycm_simple_conf
    不然配置太麻烦了

    neocomplete其实还是有很多优点ycm没有的,但是ycm基于clang的语义补全,Neocomplete做不到……
    banbanchs
        13
    banbanchs  
       2014-09-11 08:55:50 +08:00
    自己看文档去...C的函数要手动补全,只有结构是自动补全(通过. ->触发),看大项目在项目根目录放个.ycm_extra_conf.py效果比较好
    chengdujin
        14
    chengdujin  
       2014-09-11 10:16:20 +08:00
    youcompleteme在linux上还好用,mac上由于系统自带vim版本太老,用起来总有各种问题
    zinev
        15
    zinev  
       2014-09-11 10:25:07 +08:00
    歪个楼,请教下各位,我用YCM写Python,每次一按这个“.”就出现一些东西占了一大半的vim空间,求教怎么解决?被这个弄得很恼火啊,
    whatot
        16
    whatot  
       2014-09-11 10:56:01 +08:00
    开发时在项目根目录放一个.ycm_extra_conf.py才是王道,配好flag那一段应该就差不多了。(include路径、-Dxxx、-Wall、-std=c99等编译参数)
    pydog
        17
    pydog  
    OP
       2014-09-11 11:02:34 +08:00
    @whatot
    @zinev
    @chengdujin
    @jsfaint
    @lingxi27
    惊喜出现了,就是每次打开超级慢,15s文件才能正常打开,文档中说的加载一次难道是第一次用vim打开工程中的文件。。。YCM还是比其它好用些,响应快
    ChiangDi
        18
    ChiangDi  
       2014-09-11 11:36:40 +08:00   ❤️ 1
    @zinev 在vimrc里面加一行 :let g:ycm_autoclose_preview_window_after_completion=1
    试试应该就好了。
    pydog
        19
    pydog  
    OP
       2014-09-11 15:04:17 +08:00
    @ChiangDi 加上去了,打开还是很久 。。。 可能是我工程太大了
    whatot
        20
    whatot  
       2014-09-11 15:28:13 +08:00
    @pydog 打开文件应该不会需要很久,我打开3.16内核代码中随意一个文件,都是秒开,我的vimrc,为内核的ycm_extra_conf.py配置在下面,可以看看
    https://github.com/whatot/whatot-dot/blob/master/ycm.vimrc
    https://github.com/whatot/whatot-dot/blob/master/vim/ycm_extra_conf.py
    pydog
        21
    pydog  
    OP
       2014-09-11 16:58:14 +08:00
    @whatot
    难道是我的插件影响了吗?我的还是很慢
    ├── ag.vim
    ├── ctrlp.vim
    ├── ctrlsf.vim
    ├── fencview.vim
    ├── Marks-Browser
    ├── mark.vim
    ├── nerdcommenter
    ├── nerdtree.vim
    ├── powerline.vim
    ├── ShowMarks
    ├── srcexpl.vim
    ├── tabular
    ├── TagHighlight
    ├── taglist.vim
    ├── Trinity.vim
    ├── vim-colors-solarized
    ├── vim-fugitive
    ├── vimwiki
    └── YouCompleteMe
    whatot
        22
    whatot  
       2014-09-11 17:44:35 +08:00
    @pydog 使用gvim --startuptime 'time.txt' 或者 vim --startuptime 'time.txt'生成详细启动信息,查看到底在哪个步骤耗时过多。
    pydog
        23
    pydog  
    OP
       2014-09-11 19:05:28 +08:00
    @whatot
    thanks,YouCompleteMe启动用了36.626501s 。。。 要命
    pydog
        24
    pydog  
    OP
       2014-09-11 23:19:01 +08:00
    为什么打开需要这么长时间,我的工程有uboot + kernel + app,差不多就两个内核的代码量 。。。
    pydog
        25
    pydog  
    OP
       2014-09-16 23:27:27 +08:00
    @whatot
    @ChiangDi
    @chengdujin
    @banbanchs
    @tonyluj

    最近有时间就折腾,发现是配置文件的问题,YCM打开文件的时候编译出错导致的,不知道YCM是怎么搜索头文件的,比如linux内核根目录下的include/目录下有linux,asm-generic等目录,目录下还有子目录,YCM的配置文件是只要写include目录,还是包括子目录都要写在flag表中,thank you all!
    TL
        26
    TL  
       2014-09-26 14:45:16 +08:00
    @ChiangDi
    @whatot
    @pydog
    @banbanchs

    不想自己写配置了,实在受不了ycm的配置了,每个工程目录都要手写一次,扛不住了。于是有了ycm_conf_add
    其实,就是把代码中,有源文件或头文件的目录取出,自动加入ycm配置中,具体见地址:

    https://github.com/tlhc/SMK/tree/master/ycm_conf_add

    使用简单。根据自己情况修改。(ps:python 初学,代码烂,各位见谅)
    whatot
        27
    whatot  
       2014-09-26 16:13:27 +08:00
    @TL ycm_extra_conf.py配置的重点在于flag段中添加的编译参数与头文件路径,这个办法并没有解决编译参数的问题。
    另外添加所有有源文件或头文件的目录,并没有恰当的解决头文件包含的问题,只是提供了所有的可能目录,可能反而减慢补全速度。
    并且在一般项目中include的目录应该是非常少的,你应该更加深入地精确理解项目的编译过程,而不是盲目地添加目录。
    TL
        28
    TL  
       2014-09-26 17:13:02 +08:00
    @whatot 其实,我是觉得,针对ycm,编译参数的设置,由母版提供就行,在ycm设置通用的参数就行,因为ycm只做补全就行了. 毕竟,项目的编译绝不依赖ycm,它只起到补全的作用。所以,ycm的扩充没必要做的那么细致,存在错误也是可以的: 比如不该包含的目录,ycm配置文件中有说明,包含多余的目录不会产生什么影响)至于补全速度,我觉得挺快了。这个小脚本,只是为了解决每次手动配置ycm的问题。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:39 · PVG 04:39 · LAX 12:39 · JFK 15:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.