32.9 Vim 开发环境

Vim 是一款高度可配置的文本编辑器,旨在实现高效的文本编辑。它是 vi 编辑器的改进版本,包含在大多数 UNIX 系统中。

Vim 常被称为“程序员的编辑器”,在编程实践中实用性极强,因此许多开发者将其视为完整的 IDE。实际上,Vim 的用途不限于编程,而是适用于各类文本编辑工作,从撰写电子邮件到编辑配置文件均可胜任。

思考题

从工具哲学视角审视,过度投入编辑器的美化和配置而忽视实际编程效率的提升,是一种值得反思的工具使用倾向。

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

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

安装 Vim 及插件管理器

注意

本节中 clangd20clang20clang-format19 等 LLVM 版本号为撰写时的 Ports 版本。请根据当前 FreeBSD Ports 中可用的最新 LLVM 版本调整,可通过 pkg search llvm 查询可用版本。

在开始配置之前,需要先安装 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 是一款基于 Node.js 的代码补全插件,适用于 Vim 和 Neovim,支持完整的 LSP(Language Server Protocol,语言服务器协议)。LSP 是一种用于编辑器与语言服务之间通信的开放协议,它将代码分析、补全、跳转定义等功能从编辑器中分离出来,由独立的语言服务提供。其配置方式及插件系统的整体风格与 VS Code 相似。clangd 用于为 C/C++ 提供 LSP 支持。

安装 coc.nvim 的依赖时,请参照本书 Node.js 相关章节安装 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 项目为例,在项目文件夹下,项目结构如下:

CMake 项目

或者在 CMakeLists.txt 中添加:

这样即可自动生成 compile_commands.json 文件,生成该文件后,编辑源文件时即可使用补全功能。

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

再执行 cmake 以使用 clang20。

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

这样可使 clang20 和 clang++20 成为默认编译程序,但具体是否设置应根据项目要求决定。

Neovim

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

Neovim

注意

以下操作在 sh/bash/zsh 中使用,csh/tcsh 请做相应改动。请确保已正确配置 shell 环境。

代码格式化

代码格式化可统一代码风格,提升代码可读性。vim-clang-format 插件不兼容新版 clang-format 的命令行接口变更,且多年未更新,对新版 clang-format 支持存在问题(clang-format15 可正常运行,而 clang-format17 和 clang-format19 可能存在异常),因此推荐使用 vim-codefmt。

vim-codefmt 代码格式化

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

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

配置项
说明

Glaive codefmt clang_format_executable

设置 clang-format 执行文件路径

Glaive codefmt clang_format_style

设置格式化风格,也可设为 "file""file:<format_file_path>"。参考 ClangFormatStyleOptions[EB/OL]. [2026-03-25]. https://clang.llvm.org/docs/ClangFormatStyleOptions.html. 该文档列举了 clang-format 所有可配置的格式化选项及其取值说明

autocmd FileType c,cpp AutoFormatBuffer clang-format

在文件类型为 c/cpp 时启用 AutoFormatBuffer clang-format

autocmd InsertLeave *.h,*.hpp,*.c,*.cpp :FormatCode

在文件后缀为 .h.hpp.c.cpp 时,退出插入模式后执行 :FormatCode 命令


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

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

vim-clang-format 代码格式化

除了 vim-codefmt 外,vim-clang-format 也是一款代码格式化插件,可参照以下配置:

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

并在 ~/.vimrc 文件中设置:

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

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

Vim 插件

退出插入模式

vim 退出插入模式

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 中运行程序

未竟事宜

后续工作方向

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

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

如果希望补充上述内容,可通过 Pull Request 方式提交。

最后更新于