Vim 缩进 xml 文件

我正在学习 Vim,但我认为这是一个简单的任务,但我不能让它工作。我有浏览器所以,但解决方案不适合我。

我试图正确缩进一个文件(xml):

gg=G

或者 GgVG = (这个是我自己编的,可能做了一些不同的事情;)

我的 vimrc 是:

syntax on
filetype plugin indent on
set nu
76748 次浏览

使用外部程序缩进 xml文件。在本例中,我选择了 xmllint,因此将命令设置为 equalprg选项:

:set equalprg=xmllint\ --format\ -

现在你可以执行了

gg=G

to let xmllint format your xml files.

要在每次使用 时获得它,请使用 autocommand来设置它。

autocommand来自下面的评论

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

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

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

然后,在可视化模式下,键入 ! xmllint --format -

底部的命令行如下所示:

:'<,'>!xmllint --format -

Then hit enter.

技术说明

选定的文本被发送到 xmllint命令,然后 --format‘ ed,并且 xmllint的结果被放置在 vim 中选定的文本上。命令末尾的 -用于接收标准输入——在本例中,标准输入是 vim 发送给 xmllint的选定文本。

简短的回答: 打开 匹配 Vim。您可以将 packadd matchit添加到您的 .vimrc,或者使用 活力四射,默认情况下启用它。

长话短说: 我尝试了很多策略来在 Vim 中自动缩进 XML,包括 xmllint approach discussed on the Vim wikixmllint的问题(其他外部 CLI 工具如 xmlformattidy也采用同样的方法)在于,它们都坚持挤出空白新行。如果您只想缩进 XML,而不想删除空行、注释和/或其他有意设置的格式,那么 xmllint不是最佳选择。

事实证明,只要启用了 匹配 Vim脚本,Vim 的 equals (=)命令就已经支持 XML。一个超级简单的方法,使它是采用 tPope 的 活力四射。另一个是将 packadd matchit添加到 .vimrc。然后,XML 格式化就可以立竿见影了。

一旦 ~/. vimrc 设置正确,就很容易做到这一点。

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

filetype indent on
set smartindent

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

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

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

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

我也有同样的问题,事实证明

set viewdir=~\.vim\views\

是我的 .vimrc引起的问题,确保你没有。

在 VIM 中,我使用以下命令自动缩进整个文件(使用硬选项卡) :

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

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

杰西 · 霍根的回答很好,但我宁愿更简单的回答:

当您在 vim 中并且打开 XML 文件时,在正常模式下编写以下代码:

:%!xmllint --format %

然后按回车键。所有的 XML 文件将被格式化。

请记住,您应该安装 Xmllint之前。

对于那些使用 coc.nvim插件的,你可以通过 :CocInstall coc-xml安装 coc-xml ,然后在配置文件中映射格式键: nmap <silent> fm <Plug>(coc-format)。从现在起,您不仅可以格式化 xml 文件,而且可以非常容易地格式化其他文件

由于某些 Java 问题,无法使 coc-xml工作。考虑到许多现代系统已经提供了 python,使用 python 的 xml 模块可能是一个快速解决方案。将以下内容添加到您的 .vimrc

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

现在您可以从 指挥官模式执行 :FormatXML

:set ft=xml
# OR
:set syntax=xml

额外的好处 : 因为我是用 SAML 做这件事的,所以可以通过选择 base64文本(可视化模式)在 vim/nevim 中快速解码 基地64,并在命令模式下执行 !base64 -d。它将显示如下命令:

: “ < ,”> ! base64-d