【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

时间:2022-09-24 12:00:52

背景

  由于不可抗拒的原因,学习环境由之前centos的一台机器上,变成了ubuntu的一台机器上。因此,需要在新的ubuntu的机器上再配置一次vim环境。算起来这已经是第三次配置vim环境了(mac上配过一次,centos上配过一次,ubuntu上再配置一次)。这次配置大体上比较顺利,还是沿用之前日志用的方法(http://www.cnblogs.com/xbf9xbf/p/4860484.html),用pathogen管理插件;而且这次ubuntu机器能联网,比之前在centos上无网的情况下方便很多。

  其中,稍有难度的插件就是YouCompleteMe(YCM)插件。之前趟过YCM的坑了(http://www.cnblogs.com/xbf9xbf/p/4876306.html),这次又遇到了些新的问题。

问题

  YCM需要在本机编辑才能够install,这个过程就参照之前的完成的。(下载ubuntu对应版本的clang+llvm的预编译文件,编译YCM,install的时候注意要加入--clang-completer来支持C-family的smantic)。但是,在搞一个.c文件的时候遇到了点儿YCM的补全的问题。

  简单说,问题就是:用vim编辑.c文件的时候,ycm能够补全user define的结构体,但是却无法补全<netdb.h>中的struct addrinfo系统结构体。

  能够补全user defined的结构体:

  【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

  不能补全<netdb.h>中的struct addrinfo结构体:

  【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

Solution:

  这个问题现在已经解决了,记录下当时解决问题的一些逻辑轨迹,从中吸取经验。

  思路一:ycm的编译过程出了问题。

      ycm编译过程真的没错:支撑的现象有(1)ycm编译过程中没有报错 (2)vim中ycm可以补全user define的结构体。

      ycm编译过程真的出错:猜想的原因(1)可能是各种clang+llvm版本的问题,后面用3.7重新编译了也米有问题(2)ubuntu系统的问题

      如果真的没错,那么就不用考虑编译过程;如果真的出错了,这种跟编译器版本和系统implementation的问题也是我力所不及的。

      因此,这个思路的结论是,必须PASS这个方面solution。

  思路二:ycm的配置出了问题。

      以为是.ycm_extra_conf.py的配置出了问题:主要集中在flags选项中的'-isystem',是不是该include的没有include进去呢?

      这个查了好久,并没有什么实质的斩获。当时是PASS了。

  思路三:ubuntu系统的netdb.h文件的问题

      同样的代码,在我的mac和原来的centos上就可以补全出来,但是在ubuntu上就不能补全出来。一个主要变数就是netdb.h文件。

      可能是netdb.h中没有这个struct addrinfo呢?vi /usr/include/netdb.h查看一下,确实有这个结构体。PASS。

  思路四:文件访问权限的问题

      可能是我的代码没有访问netdb.h的权限。sudo chmod 777之后,还是不行,看来不是权限的问题。

      直接把/usr/include/netdb.h文件放在工程文件的同一个目录下,.c文件直接#include "netdb.h"。

      这样不存在文件和文件夹的权限问题了,结果还是悲剧,无法补全。

  上面四个思路都否定之后,有些束手无策了。

  最后放了一个大招,直接把mac上的/usr/include/netdb.h直接scp到ubuntu的工程文件同个目录下,.c文件还是#include "netdb.h"

  这样做之后,ycm终于可以补全出来struct addrinfo这个结构体的成员了~

  这样,问题就一定在ubuntu上的/usr/include/netdb.h这个文件了,再回头看这个文件的struct addrinfo的部分:

  【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

  而mac上的/usr/include/netdb.h的文件先关部分如下:

  【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

  对,二者的产别就是红框框的部分 #ifdef __USE_POSIX

  到此,基本可以确定,就是因为多了ifidef,导致ycm的补全机制直接漏过了struct addrinfo这个结构体

  但是又有一个矛盾的事情:既然ycm补全机制把这个strut addrinfo错过了,为什么在ubuntu上用gcc编译链接的程序还能正确执行结果呢?证明只是ycm漏过了这个struct addrinfo,但是gcc缺没有漏过。

  又想起来,ycm后台用的clang编译器相关的内容,而不是gcc。既然ubuntu的文件既然能被gcc正确编译链接,可以判定,还是问题出在了ycm的配置本身。但是,这又回到之前的思路二,似乎又没有什么办法了。

  也是偶然,我试验能不能补全另一个结构体。试验/usr/include/netinet/in.h中的结构体,居然能够ycm补全出成员变量:

  【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

  这就证明了,ycm的编译一定是没有问题的,问题一定出在ycm的配置了,并且跟idef __USE_POSIX有关。

  于是,走出了解决问题的一步:直接google “ubuntu #ifdef __USE_POSIX”:

http://*.com/questions/12024703/why-cant-getaddrinfo-be-found-when-compiling-with-gcc-and-std-c99

  通过这个帖子,知道了问题出在了.ycm_extra_conf.py配置文件中-std=c99这个上面,改为gnu99,问题就解决了。如图:

  【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题

  问题大概就是这样解决了。

  总之,-std=c99是标准的c,如果把这个喂给clang的配置,则clang就会忽略“#ifdef __USE_POSIX”这种的定义,因为这属于c extension,不属于c99的范畴;因此改为-std=gnu99就OK了。搞笑的是,clang的默认-std是gnu99,结果在这里我画蛇添足,导致了后面的各种问题。

  这么看来,gcc编译器的默认选项也是-std=gnu99,至少肯定是支持一些c extrension的。否则,程序也不可能正确执行出结果,gcc编译链接的过程就报错了。

  如果还想再多了解些c的标准和编译器的问题,可以看看这个日志:

  http://www.crifan.com/summary_c_language_version_c89_amd1_c99_c11/

  

  另,ycm的自动语法检查暂时有些碍事儿,将其关掉的方法查了一下:http://*.com/questions/24500281/youcompleteme-and-syntastic-compatibility

  添加了ycm的跳转配置:gb跳转到定义或者声明,ctrl+o跳转回去。

【vim环境配置】解决ubuntu上 由YouCompleteMe插件配置不当引起的 自动补全失效的问题的更多相关文章

  1. xcode4 语法高亮和自动补全失效的解决办法

    xcode4 语法高亮和自动补全失效的解决办法xcode4有一个bug,某些时候会造成类名的着色显示不出来,还有就是代码补全不能完全显示,而且没有参数. 解决方法: 首先关闭项目窗口,然后到Organ ...

  2. ubuntu1204上不能正常用emacs配合gocode进行自动补全

    我按gocode的页面https://github.com/nsf/gocode上去做,可是还是未成功,,我确认auto-complete在c-mode中是可以使用的,因为有补全出来了, 我再找了ht ...

  3. vnc xfce tab自动补全失效的解决方法

    edit~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xml find the line <proper ...

  4. Ubuntu eclipse 命令补全失效 (转载)

    我的eclipse 3.4,从ibm网站上下载解压后使用.发觉自动补全功能(alt + /)失效. 解决的办法: 1.(eclipse)window --> preferences --> ...

  5. VIM中使用tab键自动完成(vim tab键自动补全 )插件supertab

    supertab.vmb 这个插件好好用, Tab自动补全 http://www.vim.org/scripts/script.php?script_id=1643 安装步骤: 1.下载 supert ...

  6. 如何配置webpack让浏览器自动补全前缀

    一.postcss-loader有什么用? PostCSS 本身是一个功能比较单一的工具.它提供了一种方式用 JavaScript 代码来处理 CSS.它负责把 CSS 代码解析成抽象语法树结构(Ab ...

  7. Linux实战(12):解决Centos7 docker 无法自动补全

    环境:centos最小化安装,会出现一些命令无法自动补全的情况,例如在docker start 无法自动补全 start 命令,无法自动补全docker容器名字.出现这种情况的可参考以下操作: yum ...

  8. Vim自动补全神器YouCompleteMe的配置

    简介:YouCompleteMe号称Vim的自动补全神器,该项目在github的地址:YouCompleteMe:以下在10.0.1 build-1379776平台配置完成 插件安装操作: 1.确保V ...

  9. Vim&plus;Taglist&plus;AutoComplPop之代码目录分栏信息和自动补全提示(Ubuntu环境)

    一步: 首先在Ubuntu环境中安装ctags:  sudo apt-get install ctags 第二部:       安装Taglist-------------Taglist是vim的一个 ...

随机推荐

  1. &period;Net 中的反射&lpar;反射特性&rpar; - Part&period;3

    反射特性(Attribute) 可能很多人还不了解特性,所以我们先了解一下什么是特性.想想看如果有一个消息系统,它存在这样一个方法,用来将一则短消息发送给某人: // title: 标题:author ...

  2. ImFire即时通讯系统构建(架构)

    msgServer集群(ms) 设计作用: 该服务主要提供客户端的接入服务.每个ms维护当前接入用户的用户状态和心跳,每个ms地位是对等的. 设计考虑: ms之间不会直接交互,减少交互的复杂度.在用户 ...

  3. iOS 工作遇到问题记录

    iOS 工作遇到问题记录 1.UITableView的scrollDelegate问题 下午遇到一个奇怪的问题,之前都没有注意过,由于A VC中要实现tableView和其他View位置的联动,所以实 ...

  4. MongoDB起步

    1.Mongodb基本概念和SQL的区别:SQL术语        MongoDB术语database    databasetable        collectionrow        doc ...

  5. 每天进步一点点out1

    1● attend ətend   2● infant əfənd  

  6. TP框架&lpar;接口文档模板框架&rpar;

    https://blog.csdn.net/s390124971/article/details/51995497

  7. Python并行编程的几个要点

    一.基于线程的并行编程 如何使用Python的线程模块 如何定义一个线程 如何探测一个线程 如何在一个子类中使用线程 Lock和RLock实现线程同步 信号实现线程同步 条件(condition)实现 ...

  8. 微信小程序篇(微信小程序的支付)

    微信小程序的支付和微信公众号的支付是类似的,对比起来还比公众号支付简单了一些,我们只需要调用微信的统一下单接口获取prepay_id之后我们在调用微信的支付即可. 今天我们来封装一般node的支付接口 ...

  9. 代码混淆防止APP被反编译指南

    本文来自网易云社区 安卓App安全包含很多内容,包括混淆代码.整体Dex加固.拆分 Dex 加固.虚拟机加固等方面.事实上,这些内容也是国内近几年Android App安全保护的一种主要趋势. 混淆代 ...

  10. linux内核设计与实现第一章

    1.1 unix的历史 Thompson实现unix 伯克利大学对其进一步开发推出了著名的BSD 其他各大厂商相继推出自己的unix 1.1.2 unix的特性 unix系统是一个强大,健壮,稳定的操 ...