Vim formatting using gg=G with xml
Solution 1
in case you wanna try Vim's own XML indenter thing, you can...
:filetype indent on (load indent files for specific file types etc.)
:e (to reload the current buffer)
this will load the vimscript at $VIMRUNTIME/indent/xml.vim
then when you do
:set indentexpr?
...it'll say indentexpr=XmlIndentGet(v:lnum, 1)
~~
xmllint is better though, see... http://vim.wikia.com/wiki/VimTip349
i have handy keybinding like this for it in my .vimrc!
" one or more lines:
vmap ,px !xmllint --format -<CR>
" pretty-print current line
nmap ,px !!xmllint --format -<CR>
Solution 2
Try typing: :set equalprg?
. If it says equalprg=
it means that you do not have a program set for xml indentation, so it's probably doing some dumb default action. Here's a guide for setting xmllint as your formatter: http://ku1ik.com/2011/09/08/formatting-xml-in-vim-with-indent-command.html
Comments
-
grimetime almost 2 years
I have a correctly formatted xml file, and following the command given as an answer here:
How can I autoformat/indent C code in vim?
I am trying to auto indent my file to display correct nesting.
Before I tried to use this command I set the file type to xml using
:set ft=xml
as the file I started with has an extension of.mm
, and also:set nowrap
.Here is my ~/.vimrc file:
syntax on set history=1000 set smartindent set tabstop=2 set shiftwidth=2 set expandtab
How come when I issue
gg=G
, I get a message saying54 lines indented
, yet my file remains un-nested?-
ephemient almost 12 yearsNot a direct answer, but have you tried xmllint --format?
-
grimetime almost 12 yearsNo, I haven't, I don't really have an inherent need to have the file formatted at this moment - I'm really just looking for the reason why this command isn't doing what I expect it to in vim. Thanks for the suggestion though.
-
-
grimetime almost 12 yearsThanks! That worked great. I was watching one of Derek Wyatt's vim Screencasts and just assumed that vim knows how to nest xml on it's own.
-
darcyparker almost 12 yearsGreat reference to the guide on setting up xmllint as a formatter. Formatting XML can be a very personalized thing... for example, you may not want to indent every tag in all situations or you may want text wrapping for long text() nodes. So an alternative to xmllint could be xmlformat!
-
ctrueden about 9 yearsI'm curious why you feel xmllint is better. In my experience, it is overly aggressive in pruning out blank newlines and comments, whereas Vim's built-in XML indenter only indents the leading whitespace as expected. As an aside to those interested: I had loads of trouble getting Vim's built-in XML formatter to work at all, until I adopted tpope's vim-sensible defaults, at which point everything "just worked" including vim's equals (=) operator. See also stackoverflow.com/a/28365920/1207769