我从互联网上复制了一些具有 2 个空格缩进的代码,我想将其更改为 4 个空格缩进。我想知道是否有一个简短的 vim 例程来完成任务而无需编写 vim 脚本?这是我目前使用 HTML 文件的方式:
- 录制宏
- 转到一行的开头
- 视觉选择所有空格,直到第一次出现“<”
- 拉出并粘贴所有空格(基本上将它们加倍)
- 重播宏直到文件结束
简而言之qa0vt<yp<esc>jq
陷阱:
宏因空行或不以“<”开头的行而失败。而且我不知道如何将此解决方案扩展到非 HTML 文件。
我从互联网上复制了一些具有 2 个空格缩进的代码,我想将其更改为 4 个空格缩进。我想知道是否有一个简短的 vim 例程来完成任务而无需编写 vim 脚本?这是我目前使用 HTML 文件的方式:
简而言之qa0vt<yp<esc>jq
宏因空行或不以“<”开头的行而失败。而且我不知道如何将此解决方案扩展到非 HTML 文件。
更改缩进的一般方法是更改制表位:
将文件粘贴到空缓冲区中,然后:
:set ts=2 sts=2 noet
:retab!
这将每 2 个空格更改为一个 TAB 字符,然后:
:set ts=4 sts=4 et
:retab
这会将每个 TAB 更改为 4 个空格。
这种方法的优点是您也可以反过来使用它,例如将 4 个空格转换为 2 个空格。
可能有:set shiftwidth=4
和gg=G
。
我所做的与 esneider 和 cforbish 的方法非常相似,但输入起来要快一些:
:%s/^\s*/&&
只需将前导空格(空格或制表符)替换为两倍的前导空格(&
替换为匹配的表达式)。
这是一个非常古老的问题,但是所有的答案都是......错误...... Vim 有一个非常简单的方法来重新缩进整个文件。我是在编写自己的函数之后才知道的,所以我在同一条无知的船上;)
类型
gg=G
这是假设您将制表位设置为您喜欢的,(因此对于 OP 它将是 ts=4)
我从http://vim.wikia.com/wiki/Fix_indentation了解到这一点,其中提到
在正常模式下,输入 gg=G 将重新缩进整个文件。这是一种特殊情况;= 是一个运算符。就像 d 或 y 一样,它将作用于您使用光标移动命令移过的任何文本。在这种情况下, gg 将光标定位在第一行,然后 =G 从当前光标位置重新缩进到缓冲区的末尾。
我使用了这个正则表达式(它将前导空格的数量加倍):
%s;^\(\s\+\);\=repeat(' ', len(submatch(0))*2);g
与 cforbish 的答案类似(但更简单),这个正则表达式将复制前导空格
:%s/^\( \+\)/\1\1
或者您可以使用这个其他正则表达式将 2 个空格转换为 4 个空格,保留单个空格(通常是奇数)
:%s/^\(\( \)\+\)/\1\1
那是,
除了@spro 的回答,我把它放在我的.vimrc
command! -range=% Format :<line1>,<line2>s/^\s*/&&
只需键入:Format
.
使用视觉选择,这只会格式化选定的行。
如果没有视觉选择,这会格式化整个文件。
这是基于正则表达式的答案的变体。
我的本地 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>
我通常的工作流程是:
或者只是更改从另一个缓冲区粘贴的拉块上的缩进。