文章目录
前言
Vim作为当下最受欢迎的文本编译器之一,不仅具有强大的文本编辑功能,还提供了高度的可定制性。用户可以根据自己的喜好自定义配置,并且通过自己编写插件或者使用现有的插件来扩展Vim的功能。
虽说工欲善其事必先利其器,然而对于初学者来说,花太多的时间在Vim配置上,显然会劝退一大批人,特别是YCM的插件的配置,可以说网络上 90% 的博客都有或多或少的错误。而今天给大家推荐的开源工具 VimForCpp,具有以下的优点:
- 使用国内的码云作为代码托管平台,安装速度快。在网络畅通的情况下,只需要 1~2 min就可以完成全部的安装配置
- 省去了YouCompleteMe漫长的编译过程,使用已经预编译好的 ycm_core.so
- 真正做到了一键式安装,所有依赖的程序也会自动下载
配置完成后的效果如下图所示,整体看起来还是蛮清爽的
阅读完本篇博客,你将收获以下的内容:
- VimForCpp的安装
- gcc/g++升级后的语法识别问题(默认情况下,VimForCpp只会识别 4.8.5 版本的C++头文件)
- VimForCpp的使用技巧
VimForCpp 项目在 2019 就停止维护了,写这篇博客的目的就是记录 VimForCpp 使用过程中遇到的问题和对应的解决方案,如果你遇到了同样的问题说不定会给你提供帮助
安装与卸载
环境:
注意!目前 VimForCpp只支持 Centos7 x86_64
。如果你的操作系统属于Linux的其他发行版本,就不用继续往下看了
安装:
VimForCpp 的安装非常简单,所有你需要做的便是在shell中执行以下命令:
shell
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
唯一需要注意的是,想让vim配置在那个用户下生效就在哪个用户下执行这个指令。 强烈 "不推荐" 直接在 root 下执行
卸载:
官方提到的卸载方式是在安装了 VimForCpp 的用户下执行:
shell
bash ~/.VimForCpp/uninstall.sh
但是实际运行后会遇到如下的问题:
这是因为 VimForCpp 中使用的 vim 并不是 usr/bin/vim
路径下的vim,而是使用本地目录下安装的nvim(vim的一个分支,具有更好的性能和可扩展性),使用 which
指令就可以证明。
因此就算你重新安装vim也不会解决问题,正确的做法是修改配置文件 .bashrc
的内容,取消对 vim 命令的重命名:
鉴于此时vim用不了,可以使用别的编辑器进行编辑,例如 nano。修改后重启终端后 vim 就可以正常使用了
功能演示
VimForCpp功能演示可以参考Gitee,这里就一些较为常用的功能进行说明。
VimForCpp集成了很多好用的插件,并对其进行了快捷键映射。你需要做的就是在normal模式下按下空格,这样就进入了一级功能菜单页面:
按下 a~t 就进入了二级菜单。这里面的功能大家可以自行探索。
-
我最常用的功能就是 f+a 查看函数列表。按下
crtl + w
就可以移动光标的焦点进入到左边的函数列表了,按下换行后进行进行快速跳转 -
aa可以实现函数/变量跳转,也可以实现头文件的跳转
这一部分的功能由 cquery 提供,
.cquery
文件是其配置文件,我这里特意将头文件路径修改为 11,使用高版本的头文件,原来默认的还是指向 4.8.2 的python%clang %c -std=gnu11 %cpp -std=gnu++14 -pthread # Includes -I/usr/include -I/usr/include/c++/11 -I.
这个功能有个很难受的地方,就是你必须要在你的项目根路径下创建一个 .cquery 功能,里面就是上面的内容。在 cquery 的 github 的 Issue 中我也看到有人提出这个问题,并确实在 cquery 的下一个版本中实现,但是我实测发现最新版的 cquery 好像并不是开箱即用的,和 LanguageClient-neovim 似乎并不直接兼容。有知道的大神可以指点我一下
gcc/g++升级问题
如果gcc 4.8.5就可以满足你所有的需求,那么你就不需要阅读这部分的内容了。不知道怎么给Centos7升级gcc的,可以参考我这篇博文:Centos7下升级gcc/g++版本(简单 + 避坑)
在升级完gcc/g++后,我们随便用vim编写一段代码:
-
如果你之前没有使用 yum install gcc-g++,那么会异常检测出各种各样的错误:
-
如果你之前安装过了,那么上面的代码虽然不会出错,但是如果用到了高版本的C++语法和头文件还是会报错:
我们明明已经安装了高版本的 gcc 和 g++,并且也能正确编译没有任何问题,但是为什么 VimForCpp 语法检测会莫名奇妙的出问题?这和 VimForCpp 使用语法检查插件 YouCompleteMe 的配置有关(虽然 cQuery也有语法检测的功能,但是在 VimForCpp 中其语法检测功能被关闭了)
ycm的配置文件是 ~/.ycm_extra_conf.py
,使用vim打开可以看到这样的内容:
对于C/C++来说,YouCompleteMe 使用 clangd 作为语法检查器。clangd 是基于 clang 编译器的语言服务器,和任何编译器相同,clangd 在解析代码时同样需要一组编译标志(compile flags)来指导其工作,否则就无法正确地解析代码。
而 flags 列表中的参数就是即将提供给 clangd 的编译标志,我们重点关注以下参数:
-std
:这个参数指定语法检查所使用的C++标准,例如-std=c++20
-isystem
:这个参数指定了系统头文件目录,我们可以看到默认 VimForCpp 设置的C++头文件检索目录是在 4.8.5 这个文件夹下的,这也就解释了为什么 VimForCpp 语法检测只会对 g++ 4.8.5 感冒-I
: 用于指定用户头文件目录,看的出来开发人员还"夹带私货"了 😄
好的,我们现在已经定位问题了,只需要将头文件搜索路径修改为高版本的库的路径即可,那么如何确保我们头文件添加没有遗漏呢?这里教大家一个小技巧:前面提到,我们编译是没有问题的,因此可以使用 g++ -v
命令来显示 g++ 编译器详细的编译过程,其中就包含了标准库的搜索路径、头文件搜索路径
shell
g++ -v test.cc
在这个部分就可以看到所有的头文件搜索路径,最后我修改的结果如下。供大家参考:
python
[
'-std=c++17',
'-x','c++',
'-isystem','/opt/rh/devtoolset-11/root/usr/include/c++/11',
'-isystem','/opt/rh/devtoolset-11/root/usr/include/c++/11/x86_64-redhat-linux',
'-isystem','/opt/rh/devtoolset-11/root/usr/include/c++/11/backward',
'-isystem','/opt/rh/devtoolset-11/root/usr/lib/gcc/x86_64-redhat-linux/11/include',
'-isystem','/usr/include',
'-isystem','/usr/local/include',
'-I','.',
]
重启打开vim后就会生效,现在对于高版本的C++语法也不再会莫名其妙的报错误了:
最后我还想说,ycm是一个非常强大的自动补齐插件,他也为用户提供了很大的个性化配置,对这个有兴趣的可以看看 ycm Github上的介绍。相关设置可以在 ~/.vimrc
文件中配置