tab 与 space 孰好孰坏这个问题是程序界的圣战之一。StackExchange 旗下的 programmers 就有关于这个问题的 讨论 , 没有必要大打出手,倒是可以了解下各种情况下使用这两者的差异及各自的优势。不过本篇不准备讨论这个问题,本篇只想解决日常开发中的需求:将 tab 转化为空格。
总结了一下,大概有以下几种思路:
第一个思路适合大批量的替换,也适合大文件的替换,第二个思路实际上是读取文件替换后生成新文件,和第一种差别其实不大,但是很多软件支持指定参数,就非常适合通过管道及重定向来进行替换了。
在 ~/.vimrc 中加入以下配置
set tabstop=4 set shiftwidth=4 set expandtab
打开要格式化的文件,运行 :retab
即可格式化。
或者一行搞定: :set tabstop=4 shiftwidth=4 expandtab | :retab
这种配置方式对所有的文件都生效,如果需要添加例外,添加下面的配置即可 autocmd FileType make setlocal noexpandtab
FileType 后接文件类型名称。
这种方式是通过配置的方式来格式化文本,定制性比较高。
打开文件,直接运行下面的命令即可: :%s//t/ /g
。
由于 expand 是通过读取文件或标准输入并重定向至标准输出,故要达到更改的效果,需重新写入原文件。
expand -t 4 input > output # 间隔默认为 8
原理同 expand :
cat -vt tab_file | col -x > output
大杀器登场,通过 sed 来处理文本替换这种事情无疑是科学有效又简洁的姿势。
sed -iE 's//t/ /g' file # 从头换到底
不过在我看来,为什么这么做,比怎么做到更有价值,网上的讨论还是很多的,在我看来最主要的是习惯问题,以及涉及到团队合作时,统一格式及风格,再就是涉及到文件交换及接口约定时,使用符合特定领域约定俗成的规范。基本就是这样的原则。
看看西乔给的问卷及统计结果 缩进圣战的统计结果 。