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

时间:2013-06-03 00:37:06

标签: vim

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

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

简而言之qa0vt<yp<esc>jq

缺陷:

宏无法显示空白行或不以“&lt;”开头的行。我不知道如何将此解决方案扩展到非HTML文件。

8 个答案:

答案 0 :(得分:154)

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

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

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

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

:set ts=4 sts=4 et
:retab

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

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

答案 1 :(得分:54)

可以使用:set shiftwidth=4gg=G

答案 2 :(得分:26)

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

:%s/^\s*/&&

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

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

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

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

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

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

即,

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

答案 5 :(得分:1)

这是一个非常古老的问题,但所有答案都是......错误的... Vim有一种非常简单的方法可以重新整理整个文件。我在写完自己的功能之后就学到了这一点,所以我在同样的无知船上;)

输入

gg=G

这假设您将tabstop设置为您喜欢的(对于OP,它将是ts = 4)

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

  

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

答案 6 :(得分: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>

我通常的工作流程是:

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

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

答案 7 :(得分:0)

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

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

只需输入:Format

通过视觉选择,这只会格式化选定的行。

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