让 Vim 在保存文件时自动格式化代码
2020 年 11 月 04 日 2020 年 11 月 05 日 Computer Skills 314
1.5k 3 分钟
写代码时,遵循一定的代码风格是很有必要的。对于这种机械性的工作,我们的主张是要寻找自动化的解决方案。
对于 Vim 和 C++ 的组合,这里推荐以下搭配,并辅以适当配置:
clang-format
vim-autoformat
插件
在mingw安装好之后,只需去llvm官网下载llvm软件就可以包含clang-format。同时用plug安装一下插件就好了。
Plug 'Chiel92/vim-autoformat'
安装llvm
官网地址: https://releases.llvm.org/download.html 选择pre-built,预构建好的安装包,并在安装过程中选择加入到系统路径。
配置分为两部分。一是实现在保存文件时自动格式化代码;二是实现在 visual 模式下格式化部分代码。
在保存文件时自动格式化代码
autocmd FileType c,cpp autocmd BufWritePre * :Autoformat
这里对 C 和 C++ 代码,在保存文件之前,自动执行 :Autoformat
,以便使用 vim-autoformat
插件调用 clang-format
格式化代码。
在 visual 模式下格式化部分代码
" autoformat
nnoremap <leader>ff :call FormatCode("", "file")<CR>
vnoremap <leader>ff :call FormatCode(visualmode(), "file")<CR>
nnoremap <leader>gf :call FormatCode("", "Google")<CR>
vnoremap <leader>gf :call FormatCode(visualmode(), "Google")<CR>
nnoremap <leader>cf :call FormatCode("", "Chromium")<CR>
vnoremap <leader>cf :call FormatCode(visualmode(), "Chromium")<CR>
nnoremap <leader>lf :call FormatCode("", "LLVM")<CR>
vnoremap <leader>lf :call FormatCode(visualmode(), "LLVM")<CR>
func! FormatCode(exe_mode, style) range
if a:exe_mode == ""
let firstline_no = 1
let lastline_no = line("$")
else
let firstline_no = a:firstline
let lastline_no = a:lastline
endif
let l:save_formatdef = g:formatdef_clangformat
let l:tmpa = join(["clang-format --lines=", firstline_no, ":", lastline_no], "")
let g:formatdef_clangformat = "'" . l:tmpa . " --assume-filename=' . bufname('%') . ' -style=" . a:style . "'"
let formatcommand = ":Autoformat"
exec formatcommand
let g:formatdef_clangformat = l:save_formatdef
endfunc
这里利用 range 函数,根据调用时的所在的模式的不同,格式化整个文件,或者是在 Visual 模式下格式化选中的行。
这里的意思是,在可视模式选中行之后,就可以,cf
对选中的代码格式化了。其中逗号是我定义的leader键。