在vim中将2空格缩进更改为4空格

Lim*_* H. 83 vim

我从互联网上复制了一些有2个空格缩进的代码,我想把它改成4个空格的缩进.我想知道是否有一个简短的vim例程来完成任务而不必编写vim脚本?以下是我目前使用HTML文件执行此操作的方法:

  • 录制一个宏
  • 转到一行的开头
  • 视觉选择所有空格,直到第一次出现"<"
  • 猛拉并粘贴所有空格(基本上将它们加倍)
  • 重播宏直到文件结束

简而言之 qa0vt<yp<esc>jq

陷阱:

宏无法显示空白行或不以"<"开头的行.我不知道如何将此解决方案扩展到非HTML文件.

Daa*_*ker 162

更改缩进的一般方法是更改​​tabstop:

将文件粘贴到空缓冲区中,然后:

:set ts=2 sts=2 noet
:retab!
Run Code Online (Sandbox Code Playgroud)

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

:set ts=4 sts=4 et
:retab
Run Code Online (Sandbox Code Playgroud)

这会将每个TAB更改为4个空格.

这种方法的优点是你也可以反过来使用它,例如转换为4到2个空格.

  • @ XavierT.I实际上认为这个答案很容易理解.也许更清楚的是,短命令名称是否以其全名替换:`ts`:=`tabstop`,`sts`:=`softtabstop`和`[no] et`:=`[no] expandtab `. (14认同)
  • 把它们放在一起:`:set ts=2 sts=2 noet | 复盘!| 设置 ts=4 sts=4 et | retab!` 然后在不同的文件中使用 `@:` 来快速应用相同的操作。 (3认同)

per*_*eal 55

:set shiftwidth=4和可能是可能的gg=G.

  • 什么`gg = G`意味着什么?据我所知,`gg`表示"移动到1,1",而"G"表示"移动到最后一行". (3认同)
  • @JonathonReinhart` =`确实缩进,所以它只是意味着从文本的开头到结尾缩进 (2认同)

spr*_*pro 27

我所做的与esneider和cforbish的方法非常相似,但输入的速度要快一些:

:%s/^\s*/&&
Run Code Online (Sandbox Code Playgroud)

简单地用前导空格替换前导空格(空格或制表符)(&用匹配的表达式替换).

  • 这很方便,因为它适用于视觉选择(V),只需删除`%`. (2认同)

小智 8

这是一个非常古老的问题,但是所有答案都是......错误......Vim 有一个非常简单的方法来重新缩进整个文件。我是在编写自己的函数来执行此操作后才了解到这一点的,所以我也处于同样的无知状态;)

类型

gg=G
Run Code Online (Sandbox Code Playgroud)

这是假设你将制表符设置为你喜欢的,(所以对于OP来说它是ts=4)

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

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

  • 1. 如果你一直向下滚动到底部,你会看到一个提到 gg=G 的答案。2.它并不总是有效。 (3认同)