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.