.vimrc

需要说明的是,.clang-format 不能直接转换成 .vimrc。

原因是它们负责的事情不同:

  • .clang-format:定义代码格式规则(缩进、括号、换行、空格等),由 clang-format 程序执行。
  • .vimrc:配置 Vim 编辑器(按键、缩进显示、插件、主题等)。

正确的做法是:

在 .vimrc 中配置 Vim 使用 clang-format。

方案一:最推荐(保存时自动格式化)

c 复制代码
" ========== 基本设置 ==========
set expandtab
set tabstop=4
set softtabstop=4
set shiftwidth=4
set number
set relativenumber
set autoindent
set smartindent
set nowrap
syntax on
filetype plugin indent on
" ========== clang-format ==========
autocmd FileType c,cpp,objc,objcpp nnoremap <buffer> <F3> :%!clang-format<CR>
autocmd BufWritePre *.cpp,*.cc,*.cxx,*.hpp,*.h,*.c silent! execute '%!clang-format'

效果:

  • F3:格式化当前文件
  • Ctrl+S(保存):自动格式化

方案二:Visual 模式格式化

vnoremap f :!clang-format

选中一段代码:

V

然后:

\f

即可格式化选中的内容。

方案三:使用 clang-format 官方 Vim 插件(推荐)

LLVM 自带了 Vim 插件。

例如:

let g:clang_format#auto_format = 0

augroup ClangFormat

autocmd!

autocmd FileType c,cpp,cuda nnoremap f :ClangFormat

augroup END

按:

\f

即可格式化。

这个插件支持:

  • 只格式化选中的代码
  • 保留光标位置
  • 不需要 %!clang-format

体验比直接调用命令好很多。

方案四:如果你用的是 Neovim + clangd(最推荐)

如果已经安装了 clangd,可以直接使用 LSP 的格式化能力:

nnoremap f lua vim.lsp.buf.format()

或者自动格式化:

autocmd BufWritePre .cpp,.hpp lua vim.lsp.buf.format()

这里的格式规则仍然来自项目中的 .clang-format 文件,因此团队成员可以共享同一套格式,而不需要每个人维护自己的 Vim 配置。

我建议的配置(适合你的开发环境)

根据之前的交流,你主要使用 Neovim + clangd + CMake + C++/CUDA,我建议采用下面这套:

  • 项目根目录放一份 .clang-format(团队共享)
  • .vimrc 或 init.lua 不写任何格式规则,只负责调用 clang-format
  • 使用 f 手动格式化
  • 保存时自动格式化(可根据个人习惯开启或关闭)
  • clangd、clang-format、clang-tidy 使用同一 LLVM 版本(例如 LLVM 20),避免格式和诊断不一致

这种方式也是目前绝大多数现代 C++ 项目(包括 LLVM、Chromium、许多企业项目)采用的方案。