前言(不看也无所谓)
作为一个非科班的CPP老登,之前都一直是只使用VS,开发平台都是Windows,工具链也是默认的MSBuild+MSVC,程序员的基本素养约等于0 (Yeah~)。后来在工作中接触到cmake,进而了解到gcc,MinGW,LLVM等工具,才开始有意识地去了解这些工具。
在使用cmake的过程中,我慢慢觉得像cmake这样显式地用文件去控制构建流程,会更透明,跨平台的时候也更好处理。VS则是会悄悄地帮你做很多事。为了满足自己在控制一切的假象(?),我产生了使用轻量化的开发环境的想法,一开始我尝试了VSCode搭配cmake+MinGW去写一些代码,后来看到网上有人竟然在用vim作为开发环境,就又产生了兴趣。
在 2023年我就试过使用vim,当时的感觉是折腾起来有点费劲,有些东西也没理解透,最后老老实实回到VS Code。但是在折腾过程中染上了vim的瘾,用VSCode编辑的时候多少有点不得劲。VSCode上是有vim的插件,但还是模仿编辑方式,一些操作流还是差点意思。然后我开始对自己究竟想要什么样的工具产生了思考。
- 有VS这成熟的IDE作为保底工具,我折腾VSCode也好,vim也好,都更像是折腾玩具。
- 既然是玩具,生产力并不是最重要的。【写】代码这个过程爽,对玩具来说更重要。
【我个人】更喜欢vim的操作。
结论:不如继续折腾vim。所以2024年,我又开始折腾VIM,顺带记录下折腾的过程。本文内容
主要是记录自己配置vim的过程。到目前为止,主要的CPP开发环境是vim+cmake+LLVM, 另外加了个gtags+leaderf作为模糊搜索的工具。之所以强调2024年,是为说明下背景时间,毕竟我在折腾的过程中也会因为一些过时的资料而困惑,提前说明,如果后续步骤遇到问题,有可能是文章时效问题。
VIM
Windows平台的vim直接去官网下载:vim download
Linux是自带的,当然也可以下个别的版本。
另外vim是开源的,可以自己拉仓库编译时选择想要的功能。
我现在装的是 9.1.0。可以在shell中输入vim --version
查看vim的版本。
另外如果打算安装LeaderF这个插件的话,它还需要python支持。对于Windows平台,官网的安装包默认是包含的。都可以看上面version的输出中,python/python3前是否有‘+’号。也可以在vim的一般模式中输入:echo has("python") // 对于python :echo has("python3") // 对于python3
来查看。
Vim Plugin
使用vim-plug管理vim plugin: vim-plug
按照README上说的就行:// Unix (Linux) curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim // Windows iwr -useb https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim |` ni $HOME/vimfiles/autoload/plug.vim -Force
实际上就是从gayhub上把plug.vim这个文件下下来,放在vim的autoload目录下,手动去下载也没问题。
使用方法:" in _vimrc(Windows) or .vimrc(Linux) call Plug#begin() " your plugin. e.g.: Plug 'sainnhe/sonokai' call Plug#end()
然后应用下vimrc文件,然后vim-plug就知道要用哪些插件了,但此时还不一定安装了这些插件,尤其是第一次启用这些插件时。此时在vim普通模式下输入:
:PlugInstall
来下载安装这些插件。同理在vimrc中删除了不想要的插件后,还可以用::PlugClean
来清理。cmake
CPP比较常见的跨平台构建工具。Windows下直接去官网下载安装 cmake
Linux找包管理器要就行。比如Ubuntu:sudo apt-get install cmake
在shell中输入cmake --version
来看看装好了没。我几台机器上装的是3.2x版本的cmake。LLVM工具链
LLVM
LLVM其实是一套工具,里面包括编译器clang/clang++,链接器lld,也有服务于lsp的clangd等等。我是直接到LLVM官网上下载预编译的包的,没有自己编译:LLVM
因为是gayhub上下载的,所以国内可能会有些慢,可以找些工具网站转一下下载链接,会快很多。
下下来之后解压,放在想放的目录,把bin的路径加到环境变量里就可以了。
在shell中输入clang --version
来看看装好了没。我装的是当下最新的llvm,版本是19.1.0。clangd
clangd是lsp的一个实现,在这里我用来实现代码补全。clangd
关于lsp,资深vim佬韦易笑有文skywind-lsp
同样,shell中输入clangd --version
检查是否安装了clangd。coc.nvim
clangd是服务器,在vim这边就需要一个客户端来接头。我选择了coc.nvim,在clangd网站上也有相关说明。在vimrc中通过vim-plug加入coc.nvim插件:
" install via vim-plug call Plug#begin() ... plug 'neoclide/coc.nvim' ... call Plug#end()
然后如上面所述安装coc.nvim,然后使用coc.nvim安装 coc-clangd插件:
:CocInstall coc-clangd
这下clangd在vim中就有你的接头人了。基本的vimrc配置我是照搬gayhub上的README的,所以就不贴出来了。配合cmake
clangd需要一些项目的构建信息。在项目根目录下的cmakelists.txt中加入
# CMakeLists.txt set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
这样在构建项目的时候就可以输出clangd所需的信息。
这一通操作下来,你的CPP项目中应该就可以使用clangd进行代码补全了。
语义高亮
在网上很多vim+clangd文章中,并没有提到语法高亮的用法,包括韦老哥的,vim自带的syntax选项基本上就是关键词高亮。可能是大佬习惯了,所以无所谓,毕竟早期写代码,连关键词高亮都不一定有,但是我自己还是想要的,而且像代码整洁之道之类的书并不建议给类成员起个m_someData之类带'm_'前缀的名字,而是推荐使用能区分成员和变量的IDE。
在查找了vim,coc.nvim和clangd相关的资料后,我发现是整条链其实是通的,只需要在coc的相关配置中打开:在vim普通模式下输入:CocConfig
打开coc配置。这是coc的全局配置,其实还可以基于项目(或者像VSCode说的,基于工作区)来修改配置,不过我怎么会不需要语法高亮呢。
然后在配置中加入
"semanticTokens":{
"enable":true
}
这个放在最外面的{}里就行。然后在vim里挑一个支持语义高亮的colorscheme,就有了。
这是大致的效果,这里的主题就是上面vim-plug示例中的sainnhe/sonokai。
Gtags和LeaderF
Gtags
gtags是ctags的替代品,本质是一种静态的符号索引,它不能像lsp一样给出准确的定位,语义分析,但是胜在快,而且vim中像LeaderF和fzf之类的插件都是用静态符号索引的。
Windows下我是直接从官网上下下来,放到自己的工具文件目录下,再把路径添加到环境变量里。
LeaderF
另一位国内vim佬写的模糊搜索插件,老哥牛逼。直接使用vim-plug安装即可。我选择了带上老哥用C实现的算法库,他说可以快10倍以上。Plug 'Yggdroot/LeaderF', { 'do': ':LeaderfInstallCExtension' }
这里有个坑!
我在安装完LeaderF之后一直用不了,手动调用:LeaderfInstallCExtension
发现C库没安装上,说我没有python2/3, 我在shell里明明用python --version
或python3 --version
都能找到。
看了下LeaderF的脚本发现,它是使用py,而不是python来安装的,了解了下,py是python的管理器,其实相当于套了个壳,因为我已经忘了当前环境的python是怎么安装的了,应该是没有勾选安装py,或都干脆就是下了个二进制文件包。总之,我补完了py之后,再调用LeaderfInstallCExtension,发现这次的错误变成了找不到 setuptools模块。我用python pip list去看,明明就有,又是一翻折腾,才发现py的就得配着py来装:py -3 -m pip install setuptools
不然找不到。只能说python的环境问题真是容易绊倒半吊子。
接下来,继续调用LeaderfInstallCExtension,这次又变成了找不到distutils.msvccompiler了。查了一下leaderf的脚本,里面有个get_build_version啥的一个接口,在2年前就已经被标记deprecated,然后在setuptools的74.1.0版本中完全移除了,所以就无法再使用了。所以解决方案可以是:
- 自己改脚本
- 骚扰作者更新
安装旧版本的setuptools
作为懒狗我选择了最后一种。py -3 -m pip uninstall setuptools py -3 -m pip install setuptools==73.0.0
最后再来一次LeaderfInstallCExtension
damn,madafaka,终于装好了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。