VIM 里如何对代码格式化

作者: , 共 3003 字 , 共阅读 0

vim 里对代码简单对齐缩进,可以选定文本区域后用快捷键=。如果全文对齐,可以用ggvG=ggvG可以选中全文)。但对于某些复杂的代码(比如html),其对齐可能会乱。

除了缩进,还有其它一些特别的格式化和式样标准化,这时候可以用格式化插件。

1、配置 vim-autoformat

~/.vimrc(或你的~/.vimrc.bundles)里添加:

Plug 'vim-autoformat/vim-autoformat'
noremap <Leader>f :Autoformat<CR>

let g:formatdef_prettier = "'prettier --stdin --stdin-filepath '.expand('%:p')"
let g:formatters_javascript = ['prettier']
let g:formatters_css = ['prettier']
let g:formatters_html = ['prettier']
let g:formatters_json = ['prettier']
let g:formatters_typescript = ['prettier']
let g:formatters_markdown = ['prettier']
let g:formatters_vue = ['prettier']
let g:formatters_yaml = ['prettier']
let g:formatters_graphql = ['prettier']

let g:formatdef_black = "'black -'"
let g:formatters_python = ['black']

然后重启 vim 后,输入:PlugInstall进行安装。

除了安装插件,还需要安装对应的工具:

sudo -E apt install -y python3.8-venv clang-format
sudo -E npm install black prettier -g

这里面涉及到三个工具:

  • clang-format :用来格式化 C++代码。
  • black :用来格式化 Python 代码。
  • prettier :用来格式化 HTML 相关代码(包括 html, css, javascript, vue 等)。

2、配置格式化

主要是配置缩进,最大行宽等。缩进一般是 4 ,但对 html 等缩进层级较多的语言,我一般设置最大缩进为 2。最大行宽则设置 97 (刚好是 1080P 分辨率显示器竖起来能显示的宽度)。在~/.vimrc里可以添加下面设置,设置缩进,并在对应位置显示竖条,标记最大宽度:

filetype indent on 
set colorcolumn=98,120 

set smartindent  
set autoindent     
set tabstop=4     
set shiftwidth=4   
set softtabstop=4  
set smarttab       
set expandtab     
set shiftround    

autocmd FileType javascript,vue setlocal tabstop=2 shiftwidth=2 softtabstop=2 

解释:

  • set smartindent: 开启智能缩进。这会在某些情况下自动缩进新的行,例如在 { 后面的行。
  • set autoindent: 开启自动缩进。这会在新的一行使用与前一行相同的缩进。
  • set tabstop=4: 设置制表符的宽度为 4 个空格。这意味着当你在 Vim 中输入一个制表符时,它会显示为 4 个空格的宽度。
  • set shiftwidth=4: 设置每次缩进的空格数为 4。这意味着当你在 Vim 中使用缩进命令(如 >>)时,它会缩进 4 个空格。
  • set softtabstop=4: 设置在按退格键时一次删除 4 个空格。这意味着当你在 Vim 中按退格键时,它会一次删除 4 个空格。
  • set smarttab: 在行首插入制表符时,根据 shiftwidth ,而不是 tabstop 来决定制表符的宽度。
  • set expandtab: 将制表符自动转换为空格。这意味着当你在 Vim 中输入一个制表符时,它实际上会插入相应数量的空格。如果你需要输入真正的制表符,可以使用 Ctrl+V ,然后按 Tab。
  • set shiftround: 在使用 < 和 > 进行缩进时,使得缩进量为 shiftwidth 的倍数。例如,如果 shiftwidth 为 4 ,而当前行的缩进为 5 个空格,那么使用 > 命令将会增加缩进到 8 个空格,而不是 7 个空格。

2.1、clang-format

在格式化 C++代码时,在项目根目录下添加.clang-format文件,具体的选项可参考https://clang.llvm.org/docs/ClangFormatStyleOptions.html(更快的方法是咨询 chatgpt 或百度文心一言):

BasedOnStyle: Google
IndentWidth: 4
ColumnLimit: 97
SortIncludes: true 
AlwaysBreakTemplateDeclarations: true
AllowShortFunctionsOnASingleLine: InlineOnly
BreakBeforeBraces: Mozilla
AllowShortIfStatementsOnASingleLine: false
AllowShortBlocksOnASingleLine: false

这里比较让人迷惑的是 clang-format 默认会调整 include 头文件的顺序。IncludeCategories 会设置头文件的级别,同样级别则按照字母排序。调整头文件顺序可能会引起错误(主要是某些宏的定义可能会引起其它头文件内部的变动),可以设置上面的SortIncludes: false关闭该自动调整。

2.2、black

black 的配置选项位于项目根目录下的pyproject.toml文件:

[tool.black]
line-length = 97

2.3、prettier

prettier 的配置选项位于项目根目录下的.prettierrc文件:

{
    "vueIndentScriptAndStyle": true,
    "printWidth": 97,
    "tabWidth": 2
}

Q. E. D.

类似文章:
编程 » vim
vim 有一个注释相关的插件 nerdcommenter ,特别好用。可以使用<leader>c快速切换注释状态(不是注释就改成注释,已经是注释则取消注释):
IT » windows terminal, vim
在 VIM 里, Ctrl+V 用来标记一个矩形区域,可以同时操作多行文本,某些时候特别方便。但若用的 SSH 客户端是 windows terminal ,这个快捷键默认为粘贴文本,和 VIM 矩形区域标记的功能冲突(参考 issue: Ctrl+V (vertical selection in Vim) does not work)。
相似度: 0.094
IT » javascript, vue
写项目的时候遇到有需要就往 package.json里面添加新的包,即使后面没用也忘了删除,结果越积累越多。depcheck是检查依赖项的工具,会提示哪些包没有实际用到。安装:
编程 » Linux, Vim, 字符编码
由于 UNICODE 的优势,目前推荐都用 UTF-8 进行编码。
IT »
有时候用vim打开文件,每行结尾都有一个灰色的^M。这个原因是该文件在 windows 或 mac 系统上被创建:
IT » vim
vim 和普通的文本编辑器不一样,不能用鼠标拖动,需要用快捷键操作,控制光标所在位置。
IT » vim
之前用的是 ctrlp ,现在改用 leaderf ,配置更简单(主要是没搞定 ctrlp 过滤指定文件和文件夹),功能也更多一点。
IT » Markdown, Pelican, Mkdocs
最近写文档和写博客都开始用 markdown ,其中博客用得是Pelican,文档用Mkdocs。它们俩都用python-markdown模块来处理 markdown 文件。而这个模块支持扩展,可以大大提升 markdown 的表现力:
编程 » Python
在 Python3 以上,通常说的字符串是指unicode字符串,以下将不再重复强调。
相似度: 0.058
编程 » Excel, VBA
Excel VBA 出错时给出的错误信息极少,需要充分利用各种工具来进行调试。
绿野童军几家一块儿,骑行了 42 公里绿道~温榆河~清河大环线,一共 52 公里,耗时 5 个小时。