如何修复Vi中整个文件的缩进?


625

在Vim中,什么命令可以更正所有行的缩进?

通常,我会复制代码并将其粘贴到远程终端中,并使整个过程变得混乱。我想一口气解决这个问题。



8
预防胜于治疗。本着这种精神,发表了这一评论。在进入插入模式并从远程终端粘贴代码之前,请执行“:set paste”。
Chthonic Project 2013年

Answers:


1215

=,indent命令可以动作。因此,gg要获取文件的开头,=缩进G到文件的末尾,gg=G


39
我将永远无法取消我宝贵的1G =)我最喜欢的一个是=%站在开口支架上。它修复了整个块的缩进。
PEZ'Feb 3'3

2
:0 <return>还不错,但是gg很不错。(是的,我是第一个学到教育的)
埃里克·奥尔森

8
我可以缩进整个文件而不离开当前行吗?
法比奥·佩雷斯

86
@Fábio:(''两个单引号)将您带回原处,因此gg=G''应缩进然后返回。
2011年

@ArchimedesTrajano Mac OS的原始vim很旧,我推荐HomeBrew的版本;它是新的。Mac的vim有一些烦人的问题。另外,我听说您不应该破坏内置的,因此除非您非常小心,否则不要尝试自己对其进行更新。
AlexMA 2014年

126

在粘贴到终端之前,请先尝试:set paste然后:set nopaste完成。这将关闭自动缩进,换行和其他使您的粘贴混乱的功能。

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


5
您可以equalprg在ftplugin中设置选项,以使用外部过滤器进行=缩进,而不是使用自定义键绑定。
Josh Lee,

还有一个pastetoggle键绑定选项,例如。:set pt \ p在模式之间切换
迈克尔

注意:在grml的vimconfig中,pastetoggle键映射到F11
Thomas Thomas

我使用formatpgm整洁和astyle然后gq。以下是我的一些示例.vimrcau FileType xml set fp=tidy\ -q\ -i\ -xmlau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
Raffi Khatchadourian

刚读完这篇文章就下载了perltidy,它比默认的vim自动缩进要好得多
Joey Ciechanowicz 2014年

29

如果要缩进所在的音块而不必键入任何和弦,则可以执行以下操作:

[[=]]

1
很抱歉,无法恢复该功能,但是您所说的和弦是什么意思?坐标?
约翰·P

7
这里的“和弦”指的是在按住一个键的同时按下另一个键发出的命令,类似于和弦,一次发出多个音符。所以G是shift + g,^]是ctrl +],依此类推。这些键入比单键绑定花费更长的时间。
拉尔夫·吉尔斯

您也可以使用=aB根本不移动光标的。
阿敏

7
在北欧键盘上,[[=]]需要5个和弦:(
k4kuz0

29

所有命令的主人是

gg=G

这会使整个文件缩进!

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

缩进当前行下的所有行

=G

缩进当前行

==

缩进n当前行下方的行

n==

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

4==

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

=%

17

您可以使用整洁的应用程序/实用程序缩进HTML和XML文件,并且在缩进那些文件时效果很好。

整理XML文件

:!tidy -mi -xml %

美化HTML文件

:!tidy -mi -html %

16

按Escape键,然后快速键入以下组合:

gg=G

28
我打的很慢,您不会相信接下来会发生什么。
k0pernikus

我只是给了答案和评论,因为那是无价的!大声笑@ k0pernikus
眼镜

12

1G=G。那应该缩进文件中的所有行。1G将带您进入第一行,=将开始自动缩进,最后G将带您进入文件的最后一行。


甚至1gg=G
-Biggybi,

1G = G为我修复了它。太棒了!
Natus Drew

8

:set paste是您的朋友,我使用腻子并最终在Windows之间复制代码。出于这个原因,在我打开:set paste(和:set nopaste)复制/粘贴之前,适合我。


1
是的,我也在用腻子。:set粘贴真棒
mmcdole'Feb 3'2009


7

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

"*p
"+p

这样一来,您不必离开普通模式。如果您必须粘贴+*取决于您如何选择文本,请参见:help quoteplus



3

对于复杂的C ++文件,使用vim的=filter命令时,vim并非总是能正确设置格式。因此,在这种情况下,最好使用外部C ++格式化程序,例如astyle(或uncrustify),例如:

:%!astyle

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



1

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

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

nmap <leader>ai mzgg=G`z

0

对于vi编辑器,请使用:insert。这将保留所有格式,并且不会插入自动缩进。完成后,请按Escape键以查看实际的格式化文件,否则会看到一些垃圾字符。像^ I例如:

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

0

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


我会避免这种情况。视觉模式适用于不确定动作的情况,如果您知道如何捕获一组字符,那么就没有必要采取额外的步骤进入视觉模式。为什么ggvG=什么时候可以gg=G。使运动可见的意义何在?这适用于所有采取行动的动作。
alextes's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.