用Vim在tab和space之间轻松转换

2017-08-31|Categories: Vim|

为什么需要转换?

在程序员的世界里,到底该用tab还是space的争论已经进行了很久,争论的双方互不相让,谁也说服不了谁,比较理智可行的观点是:项目团队明确制定统一的编程风格,团队成员严格遵守。

我是一个实用主义者,在选择tab还是space的时候,我依赖文本编辑器的默认设置,Vim默认把expandtab选项设为off,也就是不会把tab转换为space,因此除非必要,我不会特意去改变默认值。

什么时候必须要转换呢?从Vim复制内容到其它软件就需要。Vim默认的tabstop=8,也就是1 tab = 8 spaces,而其它软件可能1 tab = [2,4,6,8] spaces,如果和Vim不匹配,对齐和缩进就会出现问题。提前把tab转换为space可以解决这个问题,而Vim可以轻松完成这个任务。

tab转换为space

示例图片的代码是tab分隔的:

用tab分隔的示例代码

通过:set list可以让tab以指定的符号显示出来:

用指定符号显示tab

listchars控制list如何显示不可见的特殊字符,详见:h 'listchars',我的.vimrc的相关设置如下:

" in insert mode, use `ctrl-v u 00b6` to input utf-8 character ¶ (PARAGRAPH SIGN)
" as explained in `:h utf-8-typing`
" https://wincent.com/blog/making-vim-highlight-suspicious-characters
set listchars=nbsp:¬,eol:¶,tab:>-,trail:•,extends:»,precedes:«

这里除了tab对应的>-是直接通过键盘输入的字符,其它几个都是Unicode字符,需要通过类似ctrl-v u 00b6这样的方式输入,当然也可以直接复制粘贴。

通过:set et? ts?查看expandtabtabstop当前的值,

  • 输出expandtab表示expandtab已开启,
  • 输出noexpandtab表示已关闭,
  • tabstop=2表示1个tab会被转换为2个spaces

输出必须是expandtab,如果是noexpandtab,就输入:set et

接下来是关键的一步:输入:%retab!进行转换。这里的%表示转换整个文件。转换结果如下图:

tab转换成空格

space转换为tab

接下来是反向操作,把space转换为tab,步骤如下:

:set noexpandtab
:set tabstop=2
:%retab!

tabstop的值很重要

从上面的图片可以看到,第一行代码仅有1个tab,宽度等于2个spaces,如果设置tabstop=4,就无法转换,因为宽度不够,其它行也会出现同样的问题:

宽度不够,空格未转换成tab

Leave A Comment