我从Internet复制了一些具有2空格缩进的代码,我想将其更改为4空格缩进。我想知道是否有一个简短的vim例程来完成任务而不必编写vim脚本?这是我目前使用HTML文件执行的操作:
- 录制宏
- 转到一行的开头
- 视觉选择所有空格,直到第一次出现“ <”
- 拉动并粘贴所有空格(基本上是将它们加倍)
- 重播宏,直到文件末尾
简而言之 qa0vt<yp<esc>jq
陷阱:
宏对于空白行或不以“ <”开头的行失败。而且我不知道如何将该解决方案扩展到非HTML文件。
Answers:
更改缩进的一般方法是更改制表符:
将文件粘贴到空缓冲区中,然后:
:set ts=2 sts=2 noet
:retab!
这将每2个空格更改为TAB字符,然后:
:set ts=4 sts=4 et
:retab
这会将每个TAB更改为4个空格。
这种方法的优点是您还可以使用另一种方法,例如将4转换为2。
retab
的论点会有用,为什么我们不能将其用于此任务?
:set sts=2 noet
,:retab! 2
因此那样会更短(虽然可读性较低)。
:set ts=2 sts=2 noet | retab! | set ts=4 sts=4 et | retab!
然后@:
在不同的文件中使用以快速应用相同的操作。
我的操作与esneider和cforbish的方法非常相似,但是键入起来要快一些:
:%s/^\s*/&&
只需用两倍的前导空格(&
用匹配的表达式替换)替换前导空格(空格或制表符)。
%
。
sed
并将其应用到目录superuser.com/a/159286/41494
这是一个非常老的问题,但是所有答案都是错误的……Vim提供了一种非常简单的方法来重新缩进整个文件。我在编写自己的函数后才学到了这一点,所以我在同一条无知的船上;)
类型
gg=G
这是假设您已将Tabstop设置为所需的值(因此,对于OP来说,ts = 4)
我是从http://vim.wikia.com/wiki/Fix_indentation了解到的,
在普通模式下,键入gg = G将重新缩进整个文件。这是一个特例;=是运算符。就像d或y一样,它将对使用光标移动命令移动的任何文本起作用。在这种情况下,gg将光标置于第一行,然后= G从当前光标位置重新缩进缓冲区的末尾。
我使用了此正则表达式(它使前导空格的数量加倍):
%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g
%s/\s\+/&&/
做同样的事情?顺便说一句,我认为该g
标志是不必要的(对于一个标志^pattern
,每行中只有1个匹配,是吗?)
%s/^\s\+/&&/g
更近。
这是基于正则表达式的答案的变体。
我的本地bin目录中有一个bash脚本,它将使行首的空白量增加一倍。输入可以是stdin或文件:
$ 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>
我通常的工作流程是:
或者只是更改从另一个缓冲区粘贴的粘贴块的缩进。
ts
::=tabstop
,sts
:=softtabstop
和[no]et
:=[no]expandtab
。