ChatGPT解决这个技术问题 Extra ChatGPT

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

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

很多时候,我会将代码复制并粘贴到远程终端中,然后整个事情就搞砸了。我想一口气解决这个问题。

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

i
ib.

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


我永远无法忘记我宝贵的 1G =) 我的最爱之一是 =% 站在开口支架上。它修复了整个块的缩进。
:0 还不错,但 gg 很好。 (是的,我先学了ed)
我可以在不离开当前行的情况下缩进整个文件吗?
@Fábio:''(两个单引号)带您回到原来的位置,因此 gg=G'' 应该缩进然后返回。
@ArchimedesTrajano Mac OS 的股票 vim 很老,我推荐 HomeBrew 的版本;它要新得多。我对 Mac 的 vim 有一些烦人的问题。另外,我听说你不应该乱用内置的,所以除非你非常小心,否则不要尝试自己更新它。
t
the Tin Man

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

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


您可以在 ftplugin 中设置 equalprg 选项以使用外部过滤器进行 = 缩进,而不是自定义键绑定。
还有一个 pastetoggle 键绑定选项,例如。 :set pt \p 在模式之间切换
注意:在 grml 的 vimconfig 中,pastetoggle 键映射到 F11
我将 formatpgm 与 tidy 和 astyle 一起使用,然后使用 gq。以下是我的 .vimrc 中的一些示例:au FileType xml set fp=tidy\ -q\ -i\ -xmlau FileType java set fp=/usr/local/bin/astyle\ --mode=java\ --indent=tab
刚读完就下载了perltidy,比默认的vim自动缩进好多了
S
Sagar Jain

所有命令的主人是

gg=G

这会缩进整个文件!

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

缩进当前行下方的所有行

=G

缩进当前行

==

在当前行下方缩进 n

n==

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

4==

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

=%

谢谢!使用 =G,您可以使用 .(点)命令在整个选项卡中重复该命令。
A
Andrew Wagner

如果您想重新缩进您所在的块而无需键入任何和弦,您可以执行以下操作:

[[=]]

很抱歉恢复这个,但是你说的和弦是什么意思?坐标?
这里的“和弦”是指按住一个键,同时按下另一个键发出的命令,类似于音乐和弦是同时发出几个音符。所以 G 是 shift+g,^] 是 ctrl+],以此类推。这些需要比单键绑定更长的时间来键入。
您也可以使用完全不移动光标的 =aB
在北欧键盘上,[[=]] 需要 5 个和弦 :(
i
ib.

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

美化 XML 文件

:!tidy -mi -xml %

美化 HTML 文件

:!tidy -mi -html %

t
tokhi

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

gg=G

我打字慢,你不会相信接下来发生的事情。
我只是给了答案和评论,因为那是无价的!大声笑@k0pernikus
i
ib.

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


甚至1gg=G
1G=G 帮我修好了。惊人的!
0
0x89

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

"*p
"+p

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


E
Eric Johnson

在 Vim 中,使用 :insert。这将保留您的所有格式并且不进行自动缩进。更多信息help :insert


i
ib.

:set paste 是你的朋友,我使用腻子并最终在窗口之间复制代码。在我开始使用 :set paste(和 :set nopaste)之前,复制/粘贴正是出于这个原因。


是的,我也在使用腻子。 :set paste 很棒
C
Community

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

:%!astyle

Vim 的 '=' 函数默认使用其内部格式化程序(这并不总是正确的),但也可以设置它使用外部格式化程序,如 astyle,方法是按照 this question 中的讨论进行适当设置。


t
the Tin Man

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


a
alphayax

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

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

您需要安装 xmllint(软件包 libxml2-utils)

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


S
Sergio D. Márquez

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

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

nmap <leader>ai mzgg=G`z

R
Ramanand Yadav

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


我会避免这种情况。视觉模式适用于当您不确定自己的动作时,如果您知道如何捕捉一组角色,那么进入视觉模式的额外步骤是没有意义的。既然可以gg=G,为什么还要ggvG=。使动作可见的意义何在?这适用于所有采取动作的动作。
A
Alex

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

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