VIM 中处理 TAB 异常的方便。

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

显示当前文件中的 Tab

/\t

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

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  spaces for indenting, not tabs.

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

autocmd FileType php setl shiftwidth= tabstop= softtabstop= expandtab

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

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

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

autocmd FileType php setl shiftwidth= tabstop= softtabstop= expandtab

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

/\t

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

再测试一下这个配置

autocmd FileType php setl shiftwidth= tabstop= softtabstop= noexpandtab
  • insert 模式下,按 TAB,依然是 4 个 space。
  • 但是 insert 模式下连按两个 TAB 键,就变成了一个 TAB 符号。
  • 连续按下3个 TAB 键,就变成了一个 TAB 符号,加上 4 个空格。

如图:

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

autocmd FileType php setl shiftwidth= tabstop= softtabstop= noexpandtab

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

这说明了什么?

说明,tabstop 有两个作用

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

不同语言的规范并不一致

C 语言在 Linux Kernel 中

tabstop= softtabstop= shiftwidth= noexpandtab
从 github 上看源码如图

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

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

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

:set expandtab
:retab

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

转载自:https://www.sunzhongwei.com/difference-between-vim-tabstop-and-softtabstop-shiftwidth

下面是如何设置vim缩进方法的(转载):

找到/etc/vimrc文件(路径或者在/etc/vim/vimrc)在文件,用vim将其打开,在此文件开头加上如下
1)设置(软)制表符宽度为4:
set tabstop=4
set softtabstop=4
2)设置缩进的空格数为4
set shiftwidth=4
3)设置自动缩进:即每行的缩进值与上一行相等;使用 noautoindent 取消设置:
set autoindent
4)设置使用 C/C++ 语言的自动缩进方式:
set cindent
5)设置C/C++语言的具体缩进方式(以我的windows风格为例):
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s
6)如果想在左侧显示文本的行号,可以用以下语句:
set nu
在此文件尾部加入如下信息:
最后,如果没有下列语句,就加上吧:
if &term=="xterm"
set t_Co=8
set t_Sb=^[[4%dm
set t_Sf=^[[3%dm
endif
还有中文显示问题,
可以添加:
let &termencoding=&encoding
set fileencodings=utf-8,gbk,ucs-bom,cp936
上面这两行命令即可

vim Tab的设置问题的更多相关文章

  1. vim tab 中设置title

    在.bashrc添加 export PROMPT_COMMAND='echo -ne "\033]0;your wanted title\007"'

  2. VIM - tab 相关的简单配置

    1. 概述 vim 是强大的文本编辑器 使用 vim 前, 需要做些简单配置, 来让 vim 更符合自己的操作习惯 想看配置项的, 直接到最后 2. 准备 安装 vim 略 配置文件 位置 /etc/ ...

  3. Vim代码缩进设置

    前段配置VPS,无奈只能使用Vim编辑Python代码,比较头疼的没法设置自动缩进,所以搜索了相关的配置,特记录如下. 将以下的设置加入到~/etc/vim/.vimrc中: set sw=4 set ...

  4. vim vi Ubuntu 设置

    1. 在vi编辑模式下按退格键不能删除内容,按方向键不能上下左右移动?如果是则:一 在vi里非编辑模式下按冒号进入到末行命令模式,然后输入set nocompatible,回车,然后在进入vi编辑模式 ...

  5. Vim增强工具设置

    Vim增强工具设置操作准备:vim ~/.vimrc11. 缩进 & 制表符使 Vim 在创建新行的时候使用与上一行同样的缩进: set autoindent 2. 设置文件里的制表符 (TA ...

  6. vim 编辑器的设置

    vi编辑器的配置:http://blog.mcuol.com/User/fenghua/Article/17411_1.htm ******************************vim ~/ ...

  7. IAR修改工程名称Tab键设置模板建立

    IAR 修改工程名称 很多时候用IAR开发都是基于已有工程模板开发的,但是工程模板的名称经常让人头疼:以下是修改办法: 从一个实例工程复制后缀名为"dep,ewd,ewp,eww" ...

  8. vim各种编码设置问题

    vim各种编码设置问题 vim中主要有四个编码相关的设置,详细是~/.vimrc中: 下面是我的设置: set fileencodings=gb18030,utf-8,gb2312,gbk: set ...

  9. idea关于tab的设置

    新手使用,一不小心tab显示在右面了,这不学习下给搞正常点. settings===>Editor=====>Editor Tabs; Palacement设置的是tab显示的部位: Ta ...

随机推荐

  1. Codeforces 388D Fox and Perfect Sets

    链接:CF388D 题目大意 给定一个数\(n\),求选择\(0 \sim n\)中任意个数的数字组成的集合\(S\)中,有多少满足若\(a\in S,b\in S\),则\(a \bigoplus ...

  2. 制作FastDFS的RPM包

    首先获取fastdfs的源码,因为fastdfs还依赖一个libfastcommon的库,所以也要准备好. fastdfs的源码目录结构: libfastcommon的源码目录结构: 接下来将以Cen ...

  3. img属性src的特点

    img属性src的特点: src=“图片地址” 成功则加载图片,失败则显示alt文字和断裂的图片 src="" 则不加载,不显示alt文字和断裂的图片 因此当图片加载失败后,$(& ...

  4. 第七章 Odoo 12开发之记录集 - 使用模型数据

    在上一篇文章中,我们概览了模型创建以及如何从模型中载入和导出数据.现在我们已有数据模型和相关数据,是时候学习如何编程与其进行交互 了.模型的 ORM(Object-Relational Mapping ...

  5. LUOGU P3387 【模板】缩点 (缩点+DAG dp)

    解题思路 缩点后按拓扑排序跑一个dp. #include<iostream> #include<cstdio> #include<cstring> #include ...

  6. 绕过CDN查找真实IP方法总结

    CDN的全称是Content Delivery Network,即内容分发网络.CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡.内容分发.调度等功能模 ...

  7. 【转载】Fiddler抓包及模拟服务端

    此文章转载公众号‘云测学院'链接:https://mp.weixin.qq.com/s/qXmBDh980nBJ8IchbRGC3Q 及公众号gloryroadtrain 在HTTP接口的测试过程中, ...

  8. xml中的<if>和截取字符串

    <#if (envPollute=='1')>√</#if><#if (envPollute=='0')>√</#if>${as_title?subst ...

  9. Python学习day13-函数进阶(1)

    Python学习day13-函数进阶(1) 闭包函数 闭包函数,从名字理解,闭即是关闭,也就是说把一个函数整个包起来.正规点说就是指函数内部的函数对外部作用域而非全局作用域的引用. 为函数传参的方式有 ...

  10. elasticsearch 中文API 更新(五)

    更新API 你能够创建一个UpdateRequest,然后将其发送给client. UpdateRequest updateRequest = new UpdateRequest(); updateR ...