VIM 中 tabstop 与 softtabstop, shiftwidth 的区别

发布时间: 2018-01-19 14:36:27 作者: 大象笔记

VIM 中处理 TAB 异常的方便。

键盘上的 TAB 键,与文件中的 TAB 符号一定要区分开,这是两个概念。

显示当前文件中的 Tab

/\t

实际上,就是查询 \t 符号。

shiftwidth

用于设置

疑问来了!

shiftwidth 引入的缩进,是 Tab 还是 Space?

从测试来看

那就是说,如果在 PHP 代码文件中,不对 Tab 做自动转换,那么代码中的缩进就是 Space 与 Tab 混用的。

PHP 代码规范是如何规定缩进的

PSR 是PHP Standard Recommendations 的简写。

PSR-2: 即编码规范 http://www.php-fig.org/psr/psr-2/

Code MUST use 4 spaces for indenting, not tabs.

所以对于 PHP,使用如下配置即可

autocmd FileType php setl shiftwidth=4 tabstop=4 softtabstop=4 expandtab

expandtab 设置之后,insert 模式下按下 TAB 键就会变成 softtabstop 设置的数个 space。

实践出真知:tabstop 与 softtabstop 的区别

softtabstop 很好理解,即在 insert 模式下,一个 tab 键按下后,展示成几个空格。 而 tabstop 就不好理解了,需要动手测试一下

autocmd FileType php setl shiftwidth=4 tabstop=4 softtabstop=4 expandtab

这种配置下,自己编辑不会引入 tab, 但是如果是打开别人的 php 文件,虽然看上去缩进是一样的,但是如果用

/\t

查看,会看到,还是存在 TAB 符号。

再测试一下这个配置

autocmd FileType php setl shiftwidth=4 tabstop=8 softtabstop=4 noexpandtab

如图:

此时,关闭 PHP 测试文件。修改 .vimrc 如下:

autocmd FileType php setl shiftwidth=4 tabstop=16 softtabstop=4 noexpandtab

再次打开之前的 PHP 测试文件。会发现 TAB 符号被显示成了 16 个空格。而其之后的 space 依旧是4个。

这说明了什么?

说明,tabstop 有两个作用

不同语言的规范并不一致

C 语言在 Linux Kernel 中

tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab

从 github 上看源码如图

而 PHP PSR-2 则是推荐 4 空格缩进。

当然 Python 最极端,不是 4 个空格的缩进,直接报错;并且不允许使用 TAB 作为缩进。

将既有文件中的 TAB 符号替换为 Space

:set expandtab
:retab

注意,这个操作存在风险,其不但会把缩进使用的 tab 符号替换为 space。非缩进使用的 TAB 符号也会被替换。

我是一名山东烟台的开发者,联系作者