在vim中将2-space缩进更改为4-space

我有一些代码从Internet复制,有2空间缩进,我想将其更改为4空间缩进。 我不知道是否有一个简短的vim例程来完成任务,而不必编写vim脚本? 下面是我目前正在做一个HTML文件:

  • logging一个macros
  • 转到一行的开头
  • 直观地select所有的空格直到第一次出现“<”
  • 抽出并粘贴所有的空格(基本上是把它们加倍)
  • 重播macros,直到文件结束

总之qa0vt<yp<esc>jq

陷阱:

该macros未能为空行或不以“<”开头的行。 而我不知道如何将这个解决scheme扩展到非HTML文件。

改变缩进的一般方法是改变tabstop:

将你的文件粘贴到一个空的缓冲区,然后:

 :set ts=2 sts=2 noet :retab! 

这将每2个空格更改为一个TAB字符,然后:

 :set ts=4 sts=4 et :retab 

这将每个TAB更改为4个空格。

这种方法的优点是,你也可以反过来使用它,例如从4到2的空间转换。

这可能是:set shiftwidth=4gg=G

我所做的与esneider和cforbish的方法非常相似,但打字速度更快一些:

 :%s/^\s*/&& 

用两倍的前导空间( &replace为匹配的expression式)简单地replace前导空格(空格或制表符)。

我使用了这个正则expression式(它将前导空格数加倍):

 %s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g 

类似(但稍微简单一点)来克服这个问题的答案,这个正则expression式将复制前导空格

 :%s/^\( \+\)/\1\1 

或者你可以使用这个其他的正则expression式来将2-空间转化为4-空间,保留单个空间(一般情况下为奇数)

 :%s/^\(\( \)\+\)/\1\1 

那是,

  • 1个空间⇢1个空间
  • 2个空格×4个空格
  • 3个空格×5个空格
  • 4个空格×8个空格

这是一个非常古老的问题,然而所有的答案都是……错误的… Vim有一个简单的方法来重新整理整个文件。 我写了自己的function后才知道这一点,所以我在同一条无知的船上;)

types

 gg=G 

这是假设你有你的tabstop设置为你喜欢什么(所以对于OP它将是ts = 4)

我从http://vim.wikia.com/wiki/Fix_indentation了解到这一点,其中提到;

在正常模式下,inputgg = G将重新整理整个文件。 这是一个特例, =是一个操作员。 就像d或y一样,它将对任何使用光标移动命令移动的文本起作用。 在这种情况下,gg将光标置于第一行,然后= G从当前光标位置重新缩进到缓冲区的末尾。