在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=4
和gg=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从当前光标位置重新缩进到缓冲区的末尾。