我从互联网上复制了一些有2个空格缩进的代码,我想把它改成4个空格的缩进。我想知道是否有一个简短的vim例程来完成任务而不必编写vim脚本?以下是我目前使用HTML文件执行此操作的方法:
简而言之qa0vt<yp<esc>jq
宏无法显示空白行或不以“&lt;”开头的行。我不知道如何将此解决方案扩展到非HTML文件。
答案 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=4
和gg=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
即,
答案 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>
我通常的工作流程是:
或者只是更改从另一个缓冲区粘贴的抽出块上的缩进。
答案 7 :(得分:0)
除了@spro的答案,我还把它放在了.vimrc
command! -range=% Format :<line1>,<line2>s/^\s*/&&
只需输入:Format
。
通过视觉选择,这只会格式化选定的行。
如果没有视觉选择,则会格式化整个文件。