在vim中删除空格,保留缩进。

3

我想在vim中删除所有的空格,但保留默认的缩进。目前我们所有的文件都使用空格而不是制表符:

content
    content inside[Sneeky white space of epicness]
content

应该是:

content
    content inside
content

注意: [神秘的空白区块] 表示一块空白区域。


1
缩进意味着在任何文本之前的空白,所以这将把您的示例转换为“contentinside”。我猜你的意思是末尾的空格。 - Ingo Karkat
2个回答

5
使用替换命令(substitute) 参考网址
%s/ *$//g

$ 表示行尾。
* 表示匹配前一个元素的零个或多个实例(由 Jite 建议)。

请注意,可能有制表符... 要表示任何空白字符,请使用 \s

%s/\s*$//g

编辑:

根据kojiro的建议,您可以使用+代替*。使用*时,vim将在每行上执行替换。而+仅在需要替换的情况下执行替换。

+表示至少匹配前一个元素的一个实例。
vim中,您需要转义+

有关详细信息,请参见:help pattern-overview

我的最终答案:

%s/\s\+$//g

1
或许更好的解释是,* 表示匹配前面的零个或多个实例... - Jite
没错,但你不想用空白取代 空格。那会影响到每一行。你需要使用 \s\s* 或者 \s\+ - kojiro
我同意kojiro的观点,我会用“+”替换“*”,这意味着至少匹配一个或多个先前的实例。 - Jite
@kojiro 你所说的零空格是什么意思? - Luc M
2
@LucM 我的意思是\s*$匹配行末的零个或多个空格。 "foo"以零个空格结尾,因此这将匹配,并且替换表达式将发生作用,将行末的零个空格替换为空字符串。该行将保持不变,但是做无用操作是一项昂贵的操作。 - kojiro
2
@LucM,你的最终答案中缺少一个$来结束字符串,没有它就会非常错误 :) - Jite

0

有几个插件可以检测并(按需甚至自动)删除行尾空格。我的DeleteTrailingWhitespace plugin就是其中之一,它可以处理更多的边角情况,而不仅仅是简单的:%s命令通常能解决的问题。(该插件页面还提供了其他插件的链接。)


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