N3xtchen 的数字花园

Search

Search IconIcon to open search

Vim: 缩进

上次更新于 Aug 19, 2023 编辑源文件

# Vim 的自动缩进方式

缩进方式官方文档说明
自动缩进:help autoindent起新行的时候复制当前的缩进形式;
智能缩进:help smartindentautoindent 基础上添加一些缩进规则;
能识别一些 C 语法,合适的时候进行自动增减缩进;
C语言缩进:help cindent能够分析上下文,提供 C 相似语言的自动增减缩进能力;
缩进表达式:help indentexpr自定义自动缩进的方式;
完全自定义比较高阶,就不过多介绍了;

# Vim 的自动缩进配置方式

缩进方式开启的选项配置生效优先级
自动缩进set autoindent最后
智能缩进+smartindentset smartindent第三
C语言缩进+cindnetset cindent其次
缩进表达式set indentexpr=最高
文件类型缩进filetype indent on它是上述四种的组合,看实际实现

Vim 提供了哪些文件类型的智能缩进表达式? 你可以在 Normal 模式下,键入 echo $VIMRUNTIME,获取 VimRuntime 目录,在 ${VIMRUNTIME}/indent 目录下就可以看到 Vim 支持的文件类型。

# Vim 下常用的缩进快捷键

操作所在的模式产生的效果
EnterINSERT下一行自动增减缩进
O/oNormal下一行自动增减缩进
>>Normal/Visual增加当前行/选中行缩进
<<Normal/Visual减少当前行/选中行缩进
Ctrl+TInsert增加当前行缩进
Ctrl+DInsert减少当前行缩进
==Normal/Visual根据上下文,对当前行/选中行自动缩进
gg=GNormal自动缩进整个文档
=a{Normal自定缩进当前所在的代码块,即花括号之间

# 我对 Vim 缩进的推荐配置

.vimrc 中需要开启的配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
...

" 兼容模式下,不能使用 setlocal
" setlocal 可以保证不同文件类型的配置隔离
set nocompatible

" 缩进配置
set autoindent        " 针对普通文本,作为缩进的补充
" Vim 需要编译时引入的功能 `+cindnet`(可以使用 `:version` 中查看),因为有些语言依赖
" 不需要再配置中直接 `+cindnet`,filetype 会根据情况自行引入
filetype indent on    " 打开文件检测,并识别和匹配缩进方式

...

验证配置是否生效,detectionindent 需要打开状态,前者识别文件类型,后者告诉 Vim 根据识别的文件类型需要加载缩进配置:

1
2
:filetype
filetype detection:ON  plugin:ON  indent:ON

不推荐 smartindent ,诞生之初,就是 autoindent 的更智能版本的存在,但是在他诞生的同期,大部份语言都有自己的缩进表达式或者基于 cindent 定制自己的规则, 所以 smartindent 就显得鸡肋了。^[1]

[1]: vi - autoindent is subset of smartindent in vim? - Stack Overflow