104

我从互联网上复制了一些具有 2 个空格缩进的代码,我想将其更改为 4 个空格缩进。我想知道是否有一个简短的 vim 例程来完成任务而无需编写 vim 脚本?这是我目前使用 HTML 文件的方式:

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

简而言之qa0vt<yp<esc>jq

陷阱:

宏因空行或不以“<”开头的行而失败。而且我不知道如何将此解决方案扩展到非 HTML 文件。

4

8 回答 8

189

更改缩进的一般方法是更改​​制表位:

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

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

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

:set ts=4 sts=4 et
:retab

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

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

于 2013-06-03T07:42:13.210 回答
63

可能有:set shiftwidth=4gg=G

于 2013-06-03T00:46:51.047 回答
38

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

:%s/^\s*/&&

只需将前导空格(空格或制表符)替换为两倍的前导空格(&替换为匹配的表达式)。

于 2013-09-24T03:24:04.240 回答
5

这是一个非常古老的问题,但是所有的答案都是......错误...... Vim 有一个非常简单的方法来重新缩进整个文件。我是在编写自己的函数之后才知道的,所以我在同一条无知的船上;)

类型

gg=G

这是假设您将制表位设置为您喜欢的,(因此对于 OP 它将是 ts=4)

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

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

于 2015-02-18T02:12:51.617 回答
3

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

%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g
于 2013-06-03T01:00:48.483 回答
1

与 cforbish 的答案类似(但更简单),这个正则表达式将复制前导空格

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

或者您可以使用这个其他正则表达式将 2 个空格转换为 4 个空格,保留单个空格(通常是奇数)

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

那是,

  • 1 个空格 ⇢ 1 个空格
  • 2 个空格 ⇢ 4 个空格
  • 3 个空格 ⇢ 5 个空格
  • 4 个空格 ⇢ 8 个空格
于 2013-06-04T04:11:33.937 回答
1

除了@spro 的回答,我把它放在我的.vimrc

command! -range=% Format :<line1>,<line2>s/^\s*/&&

只需键入:Format.

使用视觉选择,这只会格式化选定的行。

如果没有视觉选择,这会格式化整个文件。

于 2019-04-22T00:59:00.837 回答
0

这是基于正则表达式的答案的变体。

我的本地 bin 目录中有一个 bash 脚本,它将使行首的空格量加倍。输入可以是标准输入或文件:

$ cat ~/bin/dblsp
#!/bin/bash

file=${1--}

while IFS= read -r line; do
    echo "$line" | sed 's/\s*/&&/'
done < <(cat -- "$file")

我通过视觉选择一行并发出以下命令在 vim 中使用它:

:'<,'>!dblsp

这让我无需输入(或记住)正则表达式。

我也在如下地图中使用它:

nnoremap <leader>] `[V`]!dblsp<CR>

这会将其应用于最近粘贴的文本块。我通常使用下面的地图来粘贴而不是:set paste

nnoremap <leader>p :r !xclip -o<CR>

我通常的工作流程是:

  • 选择代码片段(例如,此页面上的示例代码是 2 个空格,但我想要 4 个)
  • 粘贴代码片段 (,p)
  • 更改间距 (,])

或者只是更改从另一个缓冲区粘贴的拉块上的缩进。

于 2018-03-28T02:40:12.683 回答