VIM 中 tabstop 与 softtabstop, shiftwidth 的区别

文章目录

    VIM 中处理 TAB 异常的方便。

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

    显示当前文件中的 Tab

    /\t
    

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

    VIM 高亮 TAB

    shiftwidth

    用于设置

    • 换行时的自动缩进列数
    • 行选择后,使用 < 或者 > 做缩进时,缩进的列数

    疑问来了!

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

    从测试来看

    • 如果 expandtab 开启是 Space
    • noexpandtab 且 softtabstop 与 tabstop 一致时,是 TAB 符号。

    那就是说,如果在 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
    
    • insert 模式下,按 TAB,依然是 4 个 space。
    • 但是 insert 模式下连按两个 TAB 键,就变成了一个 TAB 符号。
    • 连续按下3个 TAB 键,就变成了一个 TAB 符号,加上 4 个空格。

    如图:

    VIM noexpandtab tabstop=8

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

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

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

    VIM noexpandtab tabstop=16

    这说明了什么?

    说明,tabstop 有两个作用

    • 识别多少个空格形成一个 TAB
    • 显示既有文件时,将 TAB 显示成多个个空格

    不同语言的规范并不一致

    C 语言在 Linux Kernel 中

    tabstop=8 softtabstop=8 shiftwidth=8 noexpandtab
    

    从 github 上看源码如图

    C 语言在 Linux Kernel 中8格缩进

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

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

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

    :set expandtab
    :retab
    

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

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式