我正在学习Vim,但我认为这是一项简单任务,但我无法使其正常工作。我已经在Stack Overflow上查找了解决方案,但它们对我无效。
我正在尝试正确地缩进一个文件(xml)。我使用的命令是:
gg=G
或者 ggVG=(我自己想出来的,可能会有不同的效果;)
我的 .vimrc 文件如下:
syntax on
filetype plugin indent on
set nu
我喜欢Berei的答案。不过,我认为以下方法更加灵活,因为您无需更改vimrc
文件。而且更容易格式化所选部分的XML文件(这是我经常做的事情)。
首先,突出显示要格式化的XML。
然后,在可视模式下,键入!xmllint --format -
底部的命令行将如下所示:
:'<,'>! xmllint --format -
然后按回车键。
所选文本被发送到xmllint
命令,然后进行--format
操作,并且xmllint
的结果被放置在vim中您选择的文本上方。命令末尾的-
用于接收标准输入流,即此处vim发送给xmllint
的所选文本。
:%!xmllint --format -
,%
表示整个 XML 文件范围。 - hakunami使用外部程序对您的 xml
文件进行缩进。在这种情况下,我选择了 xmllint
,因此将命令设置为 equalprg
选项:
:set equalprg=xmllint\ --format\ -
现在您可以执行
gg=G
让xmllint
格式化您的xml
文件。
要在每次使用vim时都使用它,请使用autocommand
进行设置。
autocommand
参见下面的评论
au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null
au FileType xml setlocal equalprg=xmllint\ --format\ --recover\ -\ 2>/dev/null
. 出处- http://ku1ik.com/2011/09/08/formatting-xml-in-vim-with-indent-command.html - studgeeklibxml2-utils
软件包才能获取xmllint。 - hoffmanc%s/</\r</g
gg=G
自动缩进%s/></>\r</g
,这样每个文本元素都保持在同一行。 - Nicola Musatti%s/> *</>\r</g
进行替换。请注意,我会尽最大努力保持原文的意思和表达方式不变,同时使翻译更加通俗易懂。 - Arthur Tacca简短回答: 打开matchit.vim。您可以在.vimrc
中添加packadd matchit
,或使用vim-sensible,它默认启用。
详细回答: 我尝试了许多策略来自动缩进Vim中的XML,包括在Vim Wiki上讨论的xmllint方法。 xmllint
(以及其他外部CLI工具,如xmlformat
和tidy
)的问题在于它们都坚持挤出空白换行符。如果您只想缩进XML而不删除空行、注释和/或其他有意格式,则xmllint
不是最佳选择。
原来Vim的等号(=)命令已经支持XML,只要启用matchit.vim脚本即可。一种超级简单的方法是采用tpope的vim-sensible。另一种方法是在.vimrc
中添加packadd matchit
。然后,XML格式化将直接“运作”。
matchit.vim
是实际的解决方案。您可以通过添加以下行在您的 vimrc
中启用它:packadd matchit
。 - Christian Rondeau=
命令。如果您在文件顶部,可以键入 =G
。或者,您可以使用 1G
到达文件顶部,使用 V
进入可视行选择模式,然后键入 G
到达文件底部并选择所有内容。然后按 =
缩进整个文件。同样,如果您只想缩进文件的一部分,请仅选择该部分,然后按 =
。 - ctrueden=
命令不会插入(或删除)不存在的换行符。它只影响前导缩进。因此,matchit.vim
不是将所有挤在一行上的XML格式化的解决方案。请使用xmllint
或类似工具进行格式化。 - ctruedenfiletype indent on
set smartindent
使用 gg=G 可以将光标移动到文件顶部并进行自动缩进。
在可视模式下选择所需文本,然后按下 = 键进行缩进。
.vimrc
而不是 .bashrc
。 - BireiJesse Hogan的答案很好,但我更喜欢更简单的答案:
当您在vim中打开XML文件时,在正常模式下写入以下内容:
:%!xmllint --format %
然后按下回车键。您的整个XML文件将被格式化。
请记住,在此之前,您应该已经安装了xmllint。
:%!XMLLINT_INDENT="^I" xmllint --format -
^I
是一个单字符,你可以通过以下方式生成:CTRL+v,CTRL+i
set viewdir=~\.vim\views\
.vimrc
文件中引起了问题。只要确保你没有它。由于某些Java问题,无法使工作。事实证明,使用Python的xml模块可能是一个快速解决方案,因为许多现代系统已经配备了Python。将以下内容添加到您的<.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文本(可视模式)并在命令模式下执行!base64 -d
来快速解码vim / neovim中的base64。 命令如下所示:
:'<,'>!base64 -d
对于那些使用 coc.nvim
插件的人,你可以通过 :CocInstall coc-xml
安装 coc-xml
。然后在您的配置文件中映射格式键:nmap <silent> fm <Plug>(coc-format)
。从现在开始,你可以非常容易地格式化不仅是 XML 文件,还有其他文件。
:set ft? indentexpr?
的输出是什么?它是否读取filetype=xml indentexpr=XmlIndentGet(v:lnum,1)
?! - Ingo Karkatm'ggVG=''
,它可以保存当前行的位置,在重新缩进文件后返回到该行。 - Hovis Biddle