【问题标题】:How do I fix the indentation of an entire file in Vi?如何在 Vi 中修复整个文件的缩进?
【发布时间】:2010-10-05 02:23:10
【问题描述】:

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

我经常将代码复制并粘贴到远程终端中,然后把整个事情搞砸了。我想一口气解决这个问题。

【问题讨论】:

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

标签: vim vi indentation


【解决方案1】:

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

【讨论】:

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

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

edit:另外,我应该指出,通常可以通过使用外部程序获得比= 缩进更好的结果。例如,我一直运行:%!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自动缩进好多了
【解决方案3】:

所有命令的主人是

gg=G

这会缩进整个文件!

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

缩进当前行下面的所有行

=G

缩进当前行

==

在当前行下面缩进n

n==

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

4==

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

=%

【讨论】:

  • 谢谢!使用=G,您可以使用.(点)命令在整个选项卡中重复该命令。
【解决方案4】:

如果你想重新缩进你所在的块而不需要输入任何和弦,你可以这样做:

[[=]]

【讨论】:

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

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

gg=G

【讨论】:

  • 我打字很慢,你不会相信接下来发生的事情。
  • 我只是给了答案和评论,因为那是无价的!大声笑@k0pernikus
【解决方案6】:

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

美化 XML 文件

:!tidy -mi -xml %

美化 HTML 文件

:!tidy -mi -html %

【讨论】:

    【解决方案7】:

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

    【讨论】:

    • 甚至1gg=G
    • 1G=G 为我修复了它。太棒了!
    【解决方案8】:

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

    "*p
    "+p
    

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

    【讨论】:

      【解决方案9】:

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

      【讨论】:

      • 是的,我也在使用腻子。 :set paste 很棒
      【解决方案10】:

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

      【讨论】:

        【解决方案11】:

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

        【讨论】:

          【解决方案12】:

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

          :%!astyle
          

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

          【讨论】:

            【解决方案13】:

            对于 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

            【讨论】:

              【解决方案14】:

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

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

              nmap <leader>ai mzgg=G`z
              

              【讨论】:

                【解决方案15】:

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

                【讨论】:

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

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

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

                【讨论】:

                  猜你喜欢
                  • 2010-10-23
                  • 1970-01-01
                  • 2010-11-30
                  • 2019-06-14
                  • 2010-11-04
                  • 2023-03-29
                  • 1970-01-01
                  • 1970-01-01
                  • 2010-09-20
                  相关资源
                  最近更新 更多