1

前言(不看也无所谓)

作为一个非科班的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,就有了。
image.png
这是大致的效果,这里的主题就是上面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,终于装好了。

to be continue


捕虫中年
1 声望1 粉丝

[巴达蝶] 使用了 [沉睡粉]


引用和评论

0 条评论