【问题标题】:How do I tidy up an HTML file's indentation in VI?如何在 VI 中整理 HTML 文件的缩进?
【发布时间】:2010-10-23 08:48:23
【问题描述】:

我如何修复他的巨大html文件的缩进,这一切都搞砸了?

我尝试了通常的"gg=G command,这是我用来修复代码文件缩进的。但是,它似乎不适用于 HTML 文件。它只是删除了所有格式。

我还尝试设置:filetype = xml,看看是否可以让它认为这是一个 XML 文件会有所帮助,但它仍然没有这样做。

【问题讨论】:

    标签: html vim vi indentation


    【解决方案1】:

    有几件事都需要到位。将它们全部汇总在一个位置:

    设置以下选项:

    :filetype indent on
    :set filetype=html           # abbrev -  :set ft=html
    :set smartindent             # abbrev -  :set si
    

    然后将光标移动到文件顶部并缩进到末尾:gg=G
    或者选择想要缩进的文本并点击 = 来缩进它。

    【讨论】:

    • @tyrel,谢谢,但对我来说不起作用。这是文件的内容:pastebin.com/gagia8W2。该文件名为home.html。缩进 .php 文件没有任何问题。这里有我的 .vimrc:pastebin.com/FAJ0MCA9
    • 有没有办法可以在 .vimrc 中设置它?我不想每次打开 HTML 文件时都告诉它它是一个 HTML 文件。非常感谢 gg,=,G 快捷方式。真的很方便。
    • 请注意,在vim 7.4 中,默认缩进设置将失败,因为htmlbodyp 默认情况下不缩进。见this answer
    • smartindent 不是必需的。它还针对 C 和 C++ 进行了调整,我更喜欢使用更通用的 autoindent
    • 它与 vim7.4 配合得很好。 @tylerl 有什么方法可以让这个配置在 7.4 中永久保存在 html 文件中?
    【解决方案2】:

    在我的.vimrc 中使用filetype indent on,Vim 可以很好地缩进 HTML 文件。

    shiftwidth 为 2 的简单示例:

    <html>
      <body>
        <p>
        text
        </p>
      </body>
    </html>
    

    【讨论】:

    • 将此问题页面的html复制粘贴到html文件中。用 VIM 打开,输入“set smartindent”,然后输入“gg=G”,它并没有修复文件的缩进。
    • 它对我有用。设置 ft=html设置 sigg=G。很好地格式化此页面。
    • +1 验证“文件类型缩进开/关”打开或关闭魔法。
    • 是的,在设置智能缩进后,filetype=html 和 filetype ident 对我有用。
    • 来自chovy.com/web-development/fix-indentation-and-tabs-in-vim 发现我需要在文件类型缩进后使用 :e 重新加载文件。
    【解决方案3】:

    使用智能缩进的主要问题是,如果 XML(或 HTML)位于一行上,因为它可能最终从 curl 请求中返回,那么 gg=G 将无法解决问题。相反,我刚刚使用从 VI 直接调用的 tidy 体验了一个很好的缩进:

    :!tidy -mi -xml -wrap 0 %
    

    这基本上告诉 VI 调用 tidy 来清理 XML 文件,而不是换行以使它们适合默认的 68 个字符宽的行。我处理了一个 29MB 的大型 XML 文件,花了 5 到 6 秒。我猜对于 HTML 文件,命令应该是:

    :!tidy -mi -html -wrap 0 %
    

    如 cmets 中所述,tidy 是一个基本工具,您可以在许多基本 Linux / MacOS 系统上找到它。这是项目的页面,以防您希望拥有它但没有:HTML Tidy

    【讨论】:

    • 我认为不需要 html,因为它默认为 html
    • 同意你@Isieber。但是,我想它更容易理解逻辑,甚至可能被某些人认为是好的做法。
    • 仅供参考,如果 HTML 包含 SVG(例如,图表等),则整洁阻塞。
    • 是的,如果html代码在一行,vim indent命令就不起作用了!
    • 除了字典里的单词还有什么整洁的?如果没有链接到项目,这不是一个完整的答案。
    【解决方案4】:

    正如上面 tylerl 解释的那样,设置以下内容:

    :filetype indent on
    :set filetype=html
    :set smartindent
    

    但是,请注意,在 vim 7.4 中,HTML 标签 htmlheadbody 和其他一些标签默认缩进。这是有道理的,因为 HTML 文件中的几乎所有内容都属于这些标签。如果你真的想要,你可以让这些标签像这样缩进:

    :let g:html_indent_inctags = "html,body,head,tbody" 
    

    有关详细信息,请参阅“HTML indenting not working in compiled Vim 7.4, any ideas?”和“alternative html indent script”。

    【讨论】:

      【解决方案5】:

      这是我的解决方案,可以很好地以间隔良好的方式打开“丑陋”的 HTML:

      vim fileIn.html -c "set sw=2 | %s/>/>\r/ | execute 'normal gg=G' | set nohlsearch | g/^\\s*\$/d"
      
      • sw 命令是因为我的默认值是 4,这对于 HTML 来说太高了。
      • 下一部分在每个元素 (&gt;) 之后添加一个换行符(Vim 认为这是回车,叹息)。
      • 然后用=重新缩进整个文件。
      • 然后取消突出显示 &gt;(因为我的 vimrc 中有 set hlsearch)。
      • 然后删除所有空/仅空白行(请参阅“Vim delete blank lines”了解更多信息,这也是双转义的,因为它在 shell 中)。

      如果你根本不想进入 Vim,你甚至可以在末尾添加| wq! fileOut.html,只需清理文件即可。

      【讨论】:

      • 完美解决方案!我将其修改为:%s/&gt;\s*/&gt;\r/g(添加了g 用于全局替换,\s* 删除了尾随空格)。我还添加了:%s/&lt;/\r&lt;/g 在左括号前添加换行符。否则,&lt;td&gt;foo&lt;/td&gt; 之类的标签将像 &lt;td&gt;foo&lt;/td&gt; 一样拆分。
      • 公平点,我默认开启了全局替换,这就是为什么它不在我的解决方案中。
      【解决方案6】:

      我使用这个脚本: https://github.com/maksimr/vim-jsbeautify

      在上面的链接中你有所有的信息:

      1. 安装
      2. 配置(复制第一个示例)
      3. 运行:call HtmlBeautify()

      干得漂亮!

      【讨论】:

      • 哈哈,你为什么要使用 node + js 来清理 vim 中的 html,它的内置功能比 node 存在的时间还要长... 让我大吃一惊..
      【解决方案7】:

      没有一个答案对我有用,因为我所有的 HTML 都在一行中。

      基本上,您首先需要使用以下命令分隔每一行,该命令将&gt;&lt; 替换为相同的字符,但中间有一个换行符。

      :%s/></>\r</g
      

      然后是命令

      gg=G
      

      将缩进文件。

      【讨论】:

        【解决方案8】:

        你试过在 Vim 网站上使用 HTML 缩进脚本吗?

        【讨论】:

        • +1,我没看到。如果我不需要运行脚本会很好,但看起来这可能是唯一的方法。
        • 这个脚本现在已经被弃用了,一个更新的版本带有 vim (例如/usr/share/vim/vim74/indent/html.vim)。 “2014 年 7 月 4 日:Vim 7.4.356 或更高版本包含此脚本的后代(官方脚本现在由 Bram 维护并包含大量更改)”
        【解决方案9】:

        这是一个重量级的解决方案,可以让您缩进,以及所有您在编辑时不一定要关心的 HTML 漂亮打印。

        首先,下载Tidy。确保将二进制文件添加到路径中,以便可以从任何位置调用它。

        接下来,创建一个描述您喜欢的 HTML 风格的配置文件。文档对于 Tidy 来说不是很好,但这里有一个 overview 和一个 all the options 的列表。这是我的配置文件:

        bare: yes
        break-before-br: no
        clean: yes
        drop-proprietary-attributes: yes
        fix-uri: yes
        indent-spaces: 4
        indent: yes
        logical-emphasis: yes
        markup: yes
        output-xhtml: yes
        quiet: yes
        quote-marks: yes
        replace-color: yes
        tab-size: 4
        uppercase-tags: no
        vertical-space: yes
        word-2000: yes
        wrap: 0
        

        在您的ftplugin 文件夹中(在vimfiles 下)将其保存为tidyrc_html.txt

        另一个文件:将以下行添加(或创建)html.vim,也在ftplugin

        map <leader>tidy :%! tidy -config ~/vimfiles/ftplugin/tidyrc_html.txt <CR>
        

        要使用它,只需打开一个 HTML 文件,然后输入 /tidy。 (/&lt;leader&gt; 键。)

        给你!无论如何,这不是一个快速的解决方案,但现在您可以更好地编辑那些庞大、混乱的 HTML 文件了。

        【讨论】:

          【解决方案10】:

          您可以通过安装插件vim-autoformat 自动集成tidyhtml-beautify。 之后,您可以通过一次按键执行安装的任何格式化程序。

          【讨论】:

            【解决方案11】:

            我尝试了常用的“gg=G”命令,该命令用于修复代码文件的缩进。但是,它似乎不适用于 HTML 文件。它只是删除了所有格式。

            如果 vim 的自动格式化/缩进 gg=G 似乎“损坏”(例如左缩进每一行),很可能是未启用/加载缩进插件。它应该真正给出错误消息,而不是仅仅做不好的缩进,否则用户只会认为自动格式化/缩进功能很糟糕,而实际上它非常好。

            要检查是否启用/加载了缩进插件,请运行:scriptnames。查看.../indent/html.vim 是否在列表中。如果没有,那么这意味着插件没有加载。在这种情况下,将此行添加到~/.vimrc

            filetype plugin indent on
            

            现在如果您打开文件并运行:scriptnames,您应该会看到.../indent/html.vim。然后运行gg=G,它现在应该执行正确的自动格式化/缩进。 (虽然它不会添加换行符,所以如果所有的html代码都在一行,它不会缩进)。

            注意:如果您在 vim 命令行上运行 :filetype plugin indent on 而不是 ~/.vimrc,则必须重新打开文件 :e

            另外,您无需担心autoindentsmartindent 设置,它们与此无关。

            【讨论】:

              猜你喜欢
              • 2010-10-05
              • 2010-11-30
              • 2014-06-09
              • 2010-09-20
              • 2010-09-19
              • 1970-01-01
              • 1970-01-01
              • 2019-06-14
              • 2011-05-16
              相关资源
              最近更新 更多