这个问题有点大,全说清楚不太现实,说一些基本概念以供参考: 首先对于你想知道的事情,gg=G 里只有 = 才是关键,剩下的只是帮助 = 确定作用 范围而已。 = 的工作机制是这样的: 首先它寻找用户指定的外部缩进工具,若有则使用该工具对目标范围进行缩进操作。用 于指定外部缩进工具的选项是 equalprg,你应该看一下关于它的文档,另外 vimcasts 有一期视频演示了一个实例,在该实例中 Drew Neil 演示了如何使用 Par 来 格式化纯文本,之后还有一个实例演示了用 pandoc 来格式化 HTML。尽管这两个例子里 使用的是 formatprg 和 formatexpr 参数(对应的是 gq 而不是 =,即格式化 而不是缩进),但原理和用法却是相通的。 然而 equalprg 默认值是空,如果你没有合适的外部缩进工具,Vim 就会使用内置的 缩进功能 C-indenting 和 'lisp',这两个的文档你也最好看一看。此外若你使用 的 Vim 编译时未包含内置缩进功能的话,就会用自带的 indent() 函数来干活儿—— 这是最后的手段了,文档也值得一看(你自己写缩进脚本时可以用到)。 还有一个重要的设置是 indentexpr。刚才说过若 equalprg 未设置,= 会使用C-indenting 和 'lisp' 的功能,但如果此时设置了 indentexpr 的话,则会取 代前面二者以及其他所有的内置缩进表达式(indent-expression)。 如果你对 equalprg 和 indentexpr 傻傻分不清楚,很简单:前者只影响 = 的效果 而后者决定所有的缩进功能,比如说我们除了可以使用 = 调整缩进之外,在 INPUT 模 式下换行 Vim 也会自动调整缩进。所以 indentexpr 的影响范围更大,也是用来自定义 缩进规则的主要手段(同时还有一个 indentkeys 也很有用,这俩的文档更要好好看)。
这个问题有点大,全说清楚不太现实,说一些基本概念以供参考:
首先对于你想知道的事情,
gg=G
里只有=
才是关键,剩下的只是帮助=
确定作用范围而已。
=
的工作机制是这样的:于指定外部缩进工具的选项是
equalprg
,你应该看一下关于它的文档,另外vimcasts 有一期视频演示了一个实例,在该实例中 Drew Neil 演示了如何使用 Par 来
格式化纯文本,之后还有一个实例演示了用 pandoc 来格式化 HTML。尽管这两个例子里
使用的是
formatprg
和formatexpr
参数(对应的是gq
而不是=
,即格式化而不是缩进),但原理和用法却是相通的。
equalprg
默认值是空,如果你没有合适的外部缩进工具,Vim 就会使用内置的缩进功能 C-indenting 和 'lisp',这两个的文档你也最好看一看。此外若你使用
的 Vim 编译时未包含内置缩进功能的话,就会用自带的
indent()
函数来干活儿——这是最后的手段了,文档也值得一看(你自己写缩进脚本时可以用到)。
indentexpr
。刚才说过若equalprg
未设置,=
会使用C-indenting 和 'lisp' 的功能,但如果此时设置了
indentexpr
的话,则会取代前面二者以及其他所有的内置缩进表达式(indent-expression)。
如果你对
equalprg
和indentexpr
傻傻分不清楚,很简单:前者只影响=
的效果而后者决定所有的缩进功能,比如说我们除了可以使用
=
调整缩进之外,在 INPUT 模式下换行 Vim 也会自动调整缩进。所以
indentexpr
的影响范围更大,也是用来自定义缩进规则的主要手段(同时还有一个
indentkeys
也很有用,这俩的文档更要好好看)。