Vim缩进XML文件


101

我正在学习Vim,但我认为这是一个简单的任务,但是我无法使其正常工作。我有浏览器,但解决方案不适用于我。

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

gg=G 

或ggVG =(我自己做了一个,可能做的不一样;))

我的.vimrc是:

syntax on 
filetype plugin indent on 
set nu 

原始,结果和预期输出是什么?
Ingo Karkat 2014年

:set ft? indentexpr?它读取的输出是什么filetype=xml indentexpr=XmlIndentGet(v:lnum,1)?!
Ingo Karkat 2014年

filetype = xml indentexpr = XmlIndentGet(v:lnum,1)。是啊
哈艮地


1
我想在此地图上添加一些内容并使其成为m'ggVG='',这只会保存您所在的行,并在重新缩进文件后移回该行。
Hovis Biddle 2014年

Answers:


193

我喜欢贝雷的答案。但是,我认为以下内容更具灵活性,因为您不必更改vimrc文件。另外,格式化XML文件的选定部分更加容易(我碰巧做了很多事情)。

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

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

您底部的命令行将如下所示:

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

然后按回车。

技术说明

选定的文本被发送到xmllint命令,然后进行--format'ed'操作,并将的结果xmllint放在vim中的选定文本上。的-在命令的末尾是用于接收标准输入-其中,在这种情况下,是VIM发送到所选择的文本xmllint


6
当然,这仅在您安装了外部工具xmllint并将其添加到路径时才有效。
Polymorphix

66
从而简化了命令,:%!xmllint --format -%表示该XML文件的整个范围。
hakunami

1
为什么每个人都期望有一个xmllint工具?在Ubuntu 15.04中没有,并且apt-get也找不到。
erikbwork,2015年

8
@ erikb85 搜索软件包和软件包内容时apt-cache search,请使用,而不要使用apt-getlibxml2-utils包含缺少的工具。
ParanoiaPuppy 2015年

@hakunami我希望我可以投票给您1000次,以简化该过程
打破

69

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

:set equalprg=xmllint\ --format\ -

现在您可以执行

gg=G

xmllint您格式化xml文件。

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

autocommand 从下面的评论

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

不知道为什么这样对初学者有效,但是我会解决这个问题;)谢谢您现在能正常工作;)
Haagenti 2014年

8
您可以在.vimrc中使用以下命令在编辑xml文件时启用它- au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null。来源-ku1ik.com/2011/09/08/…–
studgeek

1
谢谢!对于大型XML文件和vim感到非常沮丧,在Sublime中它们重新缩进非常快(5000-10000行和base64数据),但是在Vim中它们缩进几分钟。此解决方案解决了大型XML文件的问题。我再次对Vim感到满意。
Sonique 2015年

如果您使用的是ubuntu,则需要安装该libxml2-utils软件包以获取xmllint
hoffmanc

33

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

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

我已经用一个大的xml文件尝试过了,处理起来很麻烦。
卢克M

谢谢。这很容易,不需要外部工具即可完成工作。
空袭

6
我更喜欢%s/></>\r</g,以便每个文本元素保持在同一行。
Nicola Musatti '17

2
@NicolaMusatti还是如果标签之间有时有间隔,%s/> *</>\r</g
Arthur Tacca

11

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

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

filetype indent on
set smartindent

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

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


2
我想这将是.vimrc代替.bashrc
Birei 2015年

1
哎呀 究竟。固定的。谢谢。
jarederaj

当每个标签排成一行时,这将起作用。如果XML没有空格也没有结尾行,那么这根本不会做任何事情。
何塞·拉蒙

只要标记有效,它始终对我有用。
jarederaj 2015年

如果您的标记不是(一致地?)在不同的行上,则可以使用:%s / </ \ r </ g然后:%s / \ n \ n / \ r /
jarederaj 2016年

11

简短的答案:打开matchit.vim。您可以添加packadd matchit到您的.vimrc,或使用vim-sensible,默认情况下启用它。

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

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


1
更确切地说,它看起来matchit.vim是实际的解决方案。您可以vimrc通过添加以下行在您的计算机中启用它:packadd matchit
Christian Rondeau

1
谢谢克里斯蒂安;我更新了答案以阐明matchit.vim是解决问题的方法。
ctrueden

赞成,因为这对我来说最有效。但是,我建议在简短答案中添加Christian的建议(packadd matchit),因为它非常简单并且可以完成工作(至少对我来说如此)
标记

@mark我更新了答案,以包括Christian的建议。
ctrueden

4

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

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

^I是你通过生成单个字符:CTRL+ vCTRL+i



1

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

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

:%!xmllint --format %

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

请记住,您之前应该已经安装xmllint


0

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.