Vim 开发环境配置

Vim 是一款功能强大的模态文本编辑器,自 1991 年发布以来,通过合理的配置和完善的插件生态系统,可以构建为高度定制化的集成开发环境(IDE)。

思考题

从工具哲学的视角来看,过度投入于编辑器的美化和配置,而忽视了实际的编程生产力提升,这是一种值得反思的工具使用倾向。

工具的选择应区分探索性使用与生产性使用。前者出于对技术的好奇心,后者则服务于特定的工程目标。专业主义不仅体现在正式场合,同样也适用于业余爱好者的探索活动中。

读者如何看待工具优化与实际生产力之间的平衡?

安装 Vim 及插件管理器

在开始配置之前,我们需要先安装 Vim 及其插件管理器,为后续的开发环境配置打下基础。

安装 Vim

首先我们需要安装 Vim 编辑器本身。使用 pkg 安装:

# pkg install vim

或者使用 Ports 安装:

# cd /usr/ports/editors/vim/ 
# make install clean

安装 Vim 插件管理器

Vim 的功能可以通过插件进行扩展,我们需要先安装一个插件管理器来管理这些插件。此处将安装 vim 插件管理器 vim-plug。若使用其它插件管理器,请自行调整:

coc.nvim 添加 clangd 补全

代码补全是开发环境的重要功能,coc.nvim 可以为 Vim 提供强大的智能补全能力。Coc.nvim 是一款基于 Node.js 的智能补全插件,适用于 Vim 和 Neovim,支持完整的 LSP(Language Server Protocol,语言服务协议)。其配置方式和插件系统整体风格类似 VS Code。clangd 用于为 C/C++ 提供 LSP 支持。

使用 pkg 安装 coc.nvim 依赖,请读者参照其他章节安装 npm,其中 Node.js 作为依赖会自动安装。

~/.vimrc 中写入:

进入 vim,输入以下命令,使用 vim-plug 安装配置的所有插件:

插件安装完成后,继续在 Vim 中安装 JSON、clangd、CMake 补全插件:

配置 clangd 补全:

打开配置文件后,输入并保存(你也可以手动编辑 ~/.vim/coc-settings.json 写入):

此时已经可以通过 Coc.nvim 使用代码补全功能。


对简单的小程序,在源文件目录下新建 compile_flags.txt 文件,输入:

如此可在 coc 中对 /usr/local/include 下的头文件进行补全(指定编译器搜索头文件的路径为 /usr/local/include)。

对于复杂项目,应使用 compile_commands.json 文件来配置补全。clangd 会在文件所在目录的父目录及名为 build/ 的子目录中查找。例如,正在编辑 $SRC/gui/window.cpp 时,clangd 会依次查找 $SRC/gui/$SRC/gui/build/$SRC/$SRC/build/ 等目录。

以基于 CMake 的项目为例,在项目文件夹下,项目结构如下所示:

或者在 CMakeLists.txt 中添加:

这样可自动生成 compile_commands.json 文件,有了这个文件再编辑源文件时就可以使用补全功能了。

CMake 默认使用系统自带的 Clang 编译器,可以通过以下方式指定使用 clang20:

再执行 cmake 以使用 clang20。

可以在 .xprofile 等文件中写入:

以使 clang20 和 clang++20 成为默认编译器,但是否设置应根据项目要求决定。

此时已生成 compile_commands.json 文件,可以在 Vim 中进行补全。

注意

以下操作在 sh/bash/zsh 中使用,csh/tcsh 请作相应改动。

代码美化

代码格式化可以使代码风格统一,提高代码的可读性。vim-clang-format 多年未更新,因此对新版本的 clang-format 支持存在问题(clang-format15 可正常使用,而 clang-format17 和 clang-format19 可能存在异常)。因此,推荐使用 vim-codefmt。

vim-codefmt 代码美化

vim-codefmt 是 Google 开发的代码格式化插件。在 ~/.vimrc 中加入:

同时在 ~/.vimrc 中设置如下:

  • 第一句 Glaive 语句用于设置 clang-format 执行文件路径。

  • 第二句 Glaive 语句设置格式化的风格样式。也可以设为 "file""file:<format_file_path>"。参考 格式arrow-up-right 备份arrow-up-right。该文档详细列出了 ClangFormat 的所有配置选项与用法。

  • 第一句 autocmd 设置在文件类型为 c/cpp 时启用 vim-codefmt 的 AutoFormatBuffer clang-format。

  • 第二句 autocmd 设置在文件后缀为 .h.hpp.c.cpp 时,退出插入模式后执行 :FormatCode 命令。


保存 ~/.vimrc 后,使用 vim-plug 安装配置的所有 Google 插件:

此时可以在退出插入模式后自动格式化代码,也可以在 Vim 中手动执行 :FormatCode 命令进行格式化。

vim-clang-format 代码美化

除了 vim-codefmt 外,vim-clang-format 也是一个常用的代码格式化插件。clang-format 代码美化需安装插件 vim-clang-format。

~/.vimrc 中加入以下行,以安装 vim-clang-format 插件,用于自动格式化代码:

并在 ~/.vimrc 中设置:

保存 ~/.vimrc 后,使用 vim-plug 安装 vim-clang-format 插件:

安装插件后可以使用,例如:

退出插入模式

asynctasks.vim 构建任务系统

构建任务管理可以简化编译、运行和测试等工作流程。插件 asynctasks.vim 为 Vim 引入类似 VSCode 的 tasks 任务系统,以统一方式系统化管理各类编译、运行、测试和部署任务。

安装插件

~/.vimrc 中设置

其中 asyncrun_rootmarks 用于指定标记项目根目录的文件/文件夹。

asynctasks.vim 在每个项目的根文件夹下面放一个 .tasks 来描述针对该项目的局部任务,同时维护一份 ~/.vim/tasks.ini 的全局任务配置,适配一些通用性很强的项目,避免每个项目重复写 .tasks 配置。

Vim 可以用 :AsyncTaskEdit 来编辑本地任务,:AsyncTaskEdit! 来编辑全局任务。

例如:

参考:

最后以最简单的 C++ hello world 项目为例

为了更好地理解上述配置的使用方法,下面以最简单的 C++ 项目为例,展示整个开发环境的使用流程。项目文件结构如下:

  • /home/j/project/CMakeLists.txt 文件

  • /home/j/project/src/CMakeLists.txt 文件

  • /home/j/project/src/main.cpp 文件

编译运行:

生成程序文件 /home/j/project/build/src/test,然后正常运行即可。

或者在 Vim 中运行 :AsyncTask project-build:AsyncTask project-run

未竟事项

本文介绍了 Vim 开发环境的基本配置,但还有一些内容需要进一步完善。

未来工作方向

本章节聚焦于 Vim 作为开发环境的基础配置,以下方向值得进一步探索:

  • 扩展功能范围:当前配置主要涵盖代码补全和格式化,未来可纳入运行、调试、自动化构建、GUI 集成以及 AI 辅助编程等功能模块

感兴趣的读者可参与上述内容的撰写,并通过 Pull Request 方式贡献。

最后更新于