如何让现有的标签在vim中显示为4个空格?

5
我正在使用一个 git 仓库,其中所有的缩进都是制表符,但我喜欢使用空格(每个缩进4个空格)。我不想仅仅替换制表符,因为那样会在我的差异中留下可怕的混乱。相反,我希望 vim 将制表符“显示”为空格。
阅读了这篇文章后,我创建了这个问题: 将制表符重新定义为4个空格 其中一个答案(来自Alan Haggai Alavi)如下所述:
set tabstop=4       " The width of a TAB is set to 4.
                    " Still it is a \t. It is just that
                    " Vim will interpret it to be having
                    " a width of 4.

set shiftwidth=4    " Indents will have a width of 4

set softtabstop=4   " Sets the number of columns for a TAB

set expandtab       " Expand TABs to spaces

这似乎表明运行:set expandtab会使制表符显示为空格。显然并非如此。我该如何实现我想要的效果?我正在使用vim 7.4

尝试使用:set noexpandtab - Cole Tierney
1
set expandtab 会将您输入的制表符扩展为空格,但不会影响现有的制表符。要扩展现有的制表符,请使用 :%!expand -t 4 - Keith Thompson
什么是“制表符显示为空格”?它们已经和空格一样了,都是空白字符。除非你设置了“列表”选项? - Ben
4个回答

1
从命令模式下,只需调用:
:retab

这将把现有的制表符转换为空格(前提是您在.vimrc中已经设置了:set expandtab)。此外,由于您已经将tabstop值设置为4个空格,:retab将使用该值并将现有的制表符替换为4个空格。
要获取更多信息,请查看内置帮助。
:help retab

如果你想做更多花哨的事情,可以查看这个链接: http://vim.wikia.com/wiki/Super_retab

启用expandtab不会将现有的制表符转换为空格,只有新插入的TAB字符才会被展开。


这会改变整个文档,对吧?我希望有一个解决方案可以保持文档不变。 - quant
是的,没错!现在我明白了,你只想让 Vim “表现”得好像制表符是空格一样。在这种情况下,你可能需要自己编写一些代码,在读取时将制表符转换为空格,并在写入时将其转换回制表符。虽然不完全不可能,但其他微妙的格式问题可能会出现。一个极其粗糙的方法是使用 :set noexapndatb 命令,然后执行 :retab:w[rite] 命令。你可以编写宏来自动化此过程。 - xk0der
我将此标记为答案,因为它解释了为什么我试图做的事情不能轻易完成。 - quant

1
除非您使用了:set list并且为listchars设置了自定义值,否则在外观上制表符和tabstop空格没有区别。这里是有和没有:set list的相同缓冲区:
<tab>foo
<space><space><space><space><space><space><space><space>bar

tabs vs spaces

那么,您是在询问“外观”还是功能方面的问题?


外观。我希望能够像在4个空格中一样“走过”选项卡。 - quant
2
这是“功能”,而不是“外观”,我所知道的没有办法在不改变整个缓冲区使用空格读取和更改回使用制表符写入的情况下实现您想要的。尽管如此,我建议您咬紧牙关,适应该项目的约定。 - romainl
好的。谢谢。是的,那正是我怀疑的,但我想问一下 :) - quant

0
gg=G

您的设置是正确的。您只需要重新缩进文档即可。


0

这些是我使用的设置:

set tabstop=4
set shiftwidth=4
set noexpandtab

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接