【问题标题】:Vim indent xml fileVim缩进xml文件
【发布时间】:2014-02-19 21:45:40
【问题描述】:

我正在学习 Vim,但我认为这是一项简单的任务,但我无法让它发挥作用。我有浏览器,但解决方案对我不起作用。

我正在尝试正确缩进文件 (xml)。我使用的命令是:

gg=G 

或 ggVG=(我自己做的可能会做一些不同的事情;))

我的 .vimrc 是:

syntax on 
filetype plugin indent on 
set nu 

【问题讨论】:

  • 原始、结果和预期输出是什么?
  • :set ft? indentexpr? 的输出是什么,是 filetype=xml indentexpr=XmlIndentGet(v:lnum,1) 吗?!
  • filetype=xml indentexpr=XmlIndentGet(v:lnum,1)。是的
  • 我喜欢在这张地图上添加一点点,并将其设为m'ggVG='',它只是保存您所在的行并在重新缩进文件后移回该行。

标签: xml vim


【解决方案1】:

由于一些 java 问题,无法使 coc-xml 工作。事实证明,鉴于许多现代系统已经带有 python,使用 python 的 xml 模块可能是一个快速的解决方案。在下面添加到您的.vimrc

com! FormatXML :%!python3 -c "import xml.dom.minidom, sys; print(xml.dom.minidom.parse(sys.stdin).toprettyxml())"

现在您可以在 command 模式下执行:FormatXML。然后用

设置语法高亮
:set ft=xml
# OR
:set syntax=xml

奖励:由于我使用 SAML 执行此操作,因此您可以通过选择 base64 文本(可视模式)并在 vim/neovim 中快速解码 base64 并执行 !base64 -d in命令模式。它将在命令中显示如下:

:'!base64 -d

【讨论】:

    【解决方案2】:

    对于那些使用coc.nvim 插件的人,您可以通过:CocInstall coc-xml 安装coc-xml ,然后在配置文件中映射格式键:nmap <silent> fm <Plug>(coc-format)。从现在开始,您不仅可以格式化 xml 文件,还可以轻松格式化其他文件

    【讨论】:

      【解决方案3】:

      Jesse Hogan 的回答很好,但我宁愿回答更简单:

      当你在 vim 中并且你的 XML 文件被打开时,在正常模式下写这个:

      :%!xmllint --format %
      

      然后按 Enter。您的所有 XML 文件都将被格式化。

      记住你之前应该安装过xmllint

      【讨论】:

        【解决方案4】:

        简答:开启matchit.vim。您可以将packadd matchit 添加到您的.vimrc,或使用默认启用的vim-sensible

        长答案:我尝试了许多在 Vim 中自动缩进 XML 的策略,包括 xmllint approach discussed on the Vim wikixmllint 的问题(以及与其他外部 CLI 工具相同的方法,例如 xmlformattidy)是它们都坚持挤出空白换行符。如果您只想缩进您的 XML,而不删除空行、cmets 和/或其他有意的格式,那么xmllint 不是最佳选择。

        事实证明,只要启用了matchit.vim 脚本,Vim 的等号 (=) 命令就已经支持 XML。启用它的一种超级简单的方法是采用 tpope 的vim-sensible。另一种是将packadd matchit 添加到您的.vimrc。然后,XML 格式将“开箱即用”。

        【讨论】:

        • 更准确地说,看起来matchit.vim 是实际的解决方案。您可以在 vimrc 中添加以下行来启用它:packadd matchit
        • 感谢克里斯蒂安;我更新了答案以澄清 matchit.vim 是解决问题的方法。
        • 赞成,因为这对我最有效。但是,我建议将 Christian 的建议 (packadd matchit) 添加到简短答案中,因为它非常简单并且可以完成工作(至少对我而言)
        • @tohuwawohu 使用= 命令。如果您位于文件顶部,则可以键入=G。或者,您可以使用1G 转到文件顶部,使用V 进入视觉线选择模式,然后键入G 转到文件底部,选择所有内容。然后按= 缩进整个文件。同样,如果您只想缩进文件的一部分,请仅选择该部分,然后按=
        • @tohuwawohu 我刚刚意识到你说“没有任何换行符”。 = 命令不会插入(或删除)不存在的换行符。它只影响前导缩进。因此,matchit.vim 不是用于将所有内容压缩到一行的漂亮打印 XML 的解决方案。为此使用xmllint 或类似名称。
        【解决方案5】:

        使用外部程序缩进您的xml 文件。在这种情况下,我选择了xmllint,因此将命令设置为equalprg 选项:

        :set equalprg=xmllint\ --format\ -
        

        现在可以执行了

        gg=G
        

        xmllint 格式化您的xml 文件。

        要在每次使用 时获取它,请使用 autocommand 进行设置。

        autocommand 来自下面的评论

        au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null
        

        【讨论】:

        • 不知道为什么这是初学者,但我会弄清楚这个;)谢谢它现在可以工作了;)
        • 您可以在 .vimrc 中使用以下内容在编辑 xml 文件时启用它 - au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null。来源 - ku1ik.com/2011/09/08/…
        • 谢谢!对大型 XML 文件和 vim 感到非常沮丧,在 Sublime 中它们重新缩进非常快(5000-10000 行和 base64 数据),但在 Vim 中它们重新缩进几分钟。此解决方案修复了大型 XML 文件的问题。我再次对 Vim 感到满意。
        • 如果你在 ubuntu 上,你需要安装 libxml2-utils 包来获取 xmllint
        【解决方案6】:

        在 VIM 中,我使用以下命令自动缩进整个文件(使用硬制表符):

        :%!XMLLINT_INDENT="^I" xmllint --format -
        

        ^I 是您通过以下方式生成的单个字符:CTRL+v,CTRL+i

        【讨论】:

          【解决方案7】:

          我遇到了同样的问题。原来,这条线

          set viewdir=~\.vim\views\
          

          在我的.vimrc 中引起了问题。只要确保,你没有它。

          【讨论】:

            【解决方案8】:

            我喜欢的一个不需要任何第三方工具的简单解决方案是在每个开始标记“<...>”之前插入一个换行符。然后你可以使用标准的 vim 自动缩进。简而言之:

            1. %s/&lt;/\r&lt;/g
            2. gg=G 自动缩进

            【讨论】:

            • 我已经用一个大的 xml 文件试过了,它的处理时间很长。
            • 谢谢。这很简单,无需外部工具即可完成工作。
            • 我更喜欢%s/&gt;&lt;/&gt;\r&lt;/g,这样每个文本元素都保持在同一行。
            • @NicolaMusatti 或者如果标签之间有时有空格,%s/&gt; *&lt;/&gt;\r&lt;/g
            【解决方案9】:

            一旦 ~/.vimrc 设置正确,这很容易实现。

            在 ~/.vimrc 中设置以下选项:

            filetype indent on
            set smartindent
            

            这允许您将光标移动到文件顶部并缩进到末尾:gg=G

            您还可以使用可视模式选择所需的文本,然后按 = 缩进。

            【讨论】:

            • 我想应该是.vimrc 而不是.bashrc
            • 哎呀。确切地。解决了这个问题。谢谢。
            • 当每个标签都在一行中时,这将起作用。如果 XML 没有空格也没有结束行,这根本不会做任何事情。
            • 只要标记有效,它就一直对我有用。
            • 如果您的标记不是(始终?)在不同的行上,您可以草率地使用 :%s/\r进行更改,然后使用 :%s/\n\n/\r /
            【解决方案10】:

            我喜欢贝雷的回答。但是,我认为以下内容更加灵活,因为您不必更改 vimrc 文件。另外,格式化 XML 文件的选定部分更容易(我经常这样做)。

            首先,突出显示要格式化的 XML。

            然后,在正常模式下,输入! xmllint --format -

            底部的命令行如下所示:

            :'&lt;,'&gt;!xmllint --format -

            然后回车。

            技术说明

            选中的文本被发送到xmllint 命令,然后--format'ed,xmllint 的结果被放置在 vim 中你选中的文本上。命令末尾的- 用于接收标准输入——在​​这种情况下,它是vim 发送给xmllint 的选定文本。

            【讨论】:

            • 这当然只有在您安装了外部工具 xmllint 并将其添加到您的路径时才有效。
            • 为了简化命令,:%!xmllint --format -,%表示这个xml文件的整个范围。
            • 为什么每个人都希望有一个 xmllint 工具?在 Ubuntu 15.04 中没有,apt-get 也找不到。
            • @erikb85 在搜索包和包内容时使用apt-cache search,而不是apt-getlibxml2-utils 包含缺少的工具。
            • @hakunami 我希望我能为您投票 1000 次以简化该过程
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-11-30
            • 1970-01-01
            • 2023-04-01
            • 1970-01-01
            • 1970-01-01
            • 2011-06-18
            相关资源
            最近更新 更多