关于vim:如何在Vi中修复整个文件的缩进?

How do I fix the indentation of an entire file in Vi?

在Vim中,纠正所有行缩进的命令是什么?

很多时候我会将代码复制并粘贴到远程终端中并使整个过程搞砸了。 我想一举解决这个问题。


=,缩进命令可以采取动作。所以,gg来获取文件的开头,=来缩进,G到文件的末尾,gg=G


在粘贴到终端之前,尝试:set paste(然后在完成后再:set nopaste)。这将关闭搞乱粘贴的自动缩进,换行等功能。

编辑:另外,我应该指出,通常可以通过使用外部程序获得比=缩进更好的结果。例如,我一直运行:%!perltidy。也可以使用astyle,cindent等。当然,您可以将它们映射到键击 - 并根据文件类型将不同的键映射到相同的击键


如果你想重新加入你所在的块而不必键入任何和弦,你可以这样做:

1
[[=]]


所有命令的主人都是

gg=G

这会缩进整个文件!

下面是一些简单而优雅的命令,用于在Vim或gVim中快速缩进行。

缩进当前行下面的所有行

1
=G

缩进当前行

1
==

缩进当前行下方的n

1
n==

例如,缩进当前行下面的4行

1
4==

要缩进代码块,请转到其中一个大括号并使用命令

1
=%

您可以使用整洁的应用程序/实用程序来缩进HTML& XML文件,它在缩进这些文件时非常有效。

整理XML文件

1
:!tidy -mi -xml %

整理HTML文件

1
:!tidy -mi -html %

按下转义然后快速输入以下组合:

1
gg=G


1G=G。这应该缩进文件中的所有行。 1G带您到第一行,=将启动自动缩进,最后G将带您到文件的最后一行。


:set paste是你的朋友我使用putty并最终在windows之间复制代码。在我开启:set paste(和:set nopaste)之前,复制/粘贴让我适合这个原因。


在Vim中,使用:insert。这将保留所有格式,而不是自动延迟。有关更多信息help :insert


如果您不想使用:set paste,请单击中键,set nopaste,您也可以粘贴剪贴板的内容:

1
2
"*p
"+p

这样您就不必离开正常模式。
如果必须粘贴+*取决于您选择文本的方式,请参阅:help quoteplus


vim-autoformat使用特定于您的语言的外部程序格式化您的源文件,例如rbeautify"gem for Ruby files,"js-beautify"npm package for JavaScript。


对于复杂的C ++文件,当使用vim的=过滤器命令时,vim并不总能正确地获得格式。因此,对于这种情况,最好使用外部C ++格式化程序,如astyle(或uncrustify),例如:

1
:%!astyle

Vim的'='函数默认使用它的内部格式化程序(它并不总能使事情正确)但是也可以设置它使用外部格式化程序,如astyle,通过正确设置它,如本问题所述。


对于XML文件,我使用此命令

1
:1,$!xmllint --format --recover - 2>/dev/null

你需要安装xmllint(包libxml2-utils)

(来源:http://ku1ik.com/2011/09/08/formatting-xml-in-vim-with-indent-command.html)


vi应该尊重制表符和空格,但是你应该考虑vi可能使用不同于其他编辑器的长度选项卡。你能比"整件搞砸了"更具体吗?


只需在vim中进入可视模式,然后在选择按下=后选择从上到下的行,所有选定的行都将缩进。


您可以创建映射来为您执行此操作。

这个将自动缩进整个文件并仍然将光标保持在您所在的位置:

1
nmap <leader>ai mzgg=G`z


对于vi编辑器,请使用:insert。这将保留所有格式,而不是插入自动缩进。完成后按下转义查看实际格式化的文件,否则你会看到一些垃圾字符。喜欢^我
例如:

1
2
3
4
public static void main(String[] args) {
^I
^I System.out.println("Some Garbage printed upon using :insert");
}