vim:删除多行的前2个空格


79

使用VIM删除每行的前2个空格的最简单方法是什么?基本上,每行重复“ 2x”。

澄清:这里假设前两个字符是空格。因此,问题在于一起对多行进行缩进。


到底是空格还是前两个字符(无论它们是什么)?
杰森·唐

这是前两个字符。假设前两个字符为空格。
twimo 2011年

我已经展示了一种在ex编辑器模式下通过搜索和替换来实现此目的的方法。一种方法保证只对以两个空格开头的行执行此操作(并且仅删除两个空格)。另一个仅破坏前两个字符,而不管它们是什么。
杰森·唐

Vim的问题并不是SO的主题(请查看有关meta和... SO FAQ的讨论)。此外压痕与发展有关的...
吕克Hermitte

Answers:


93

还有更多选择。您可以决定哪种是“最简单的方法”。

删除每行的前2个字符:

:%normal 2x

仅删除空格中每行的前2个字符:

:%s/^  /

请注意,最后一个斜杠是可选的,并且仅在此处,以便您可以看到两个空格。如果没有斜杠,则只有7个字符,包括:

每行向左移动缩进:

:%normal <<

11
我喜欢在Vim中执行某项操作的30种不同方法。诸如此类的问题带来了您从未了解的事情。我不知道%normal。
杰森·唐

感谢您对最后一个破折号的澄清。这很有帮助。
ryanjdillon 2014年

1
我要补充一点,该%符号仅表示“对文档中的每一行执行此命令,而不仅仅是对当前行执行”。我认为。找不到太多关于它的文档。
萨玛隆(Sammaron)2015年

119
  1. 使用Ctrl-V(或Ctrl-Q如果Ctrl-V用于粘贴)进入可视块模式;
  2. 用箭头选择要删除的区域;
  3. 然后按d删除所选区域。
  4. Esc

7
ctrl-v选择要删除的字符,然后按d进行剪切。
亨里克·K

2
热门星标答案!:-)
Nikos Alexandris

这在我使用的所有vim中都不起作用,但是对于那些确实起作用的vim来说,这非常方便,并且能够在实际执行操作之前可视化您要删除的区域,这是很好的。
searchengine27

可视块模式的默认绑定可能不同吗?也许是较旧的Unix发行版VI(与VIM相反)之间的区别。
汤姆·克尔

这可能是最简单,最明智的答案。
威廉·范·凯奇维奇'17

13

您还可以使用搜索和替换(在ex编辑器中,通过:字符访问):

无论如何删除前两个字符:

%s/^.\{2}//

删除前两个空格字符(必须在开头,并且两个字符都必须是空格...与标准不匹配的任何行都将被跳过):

%s/^\s\{2}//

2
最后的/ g是多余的。每行只进行一场比赛。
bhinesley 2011年

imo这是一个很好的解决方案
Victoria Stuart


4

两个空格还是两个字符?(2x后者。)

:[range]s/^  //

在每一行的开头删除两个空格;在整个文件中使用%(等效于1,$[range]

:[range]s/^..//

删除每行的前两个字符,无论它们是什么。(请注意,它将删除两个字符,而不必删除两;制表符将被视为一个字符)。

如果您真正在做的是更改缩进,则可以使用<命令减小缩进,或使用>命令增大缩进。设置shiftwidth以控制其移动的距离,例如

:set shiftwidth=2

3

我会尝试以下两种方法之一:

  1. 在要删除的块上进行列编辑Ctrl+V(通常映射到Ctrl+Q)。
  2. 使用q1(或您要表示记录寄存器的任何其他数字/字母)在第一行记录一个宏,然后使用@1(重播我的上一个示例。多次重播该宏。更好的是,使用前一个数字告诉它多少运行时间-例如10@1,运行该宏10次,但是确实取决于您所录制的内容-请确保倒带光标0或放下一行j(如果相关)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.