Vim formatting using gg=G with xml

13,060

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

Share:
13,060
grimetime
Author by

grimetime

I like stuff and do things

Updated on June 02, 2022

Comments

  • grimetime
    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 saying 54 lines indented, yet my file remains un-nested?

    • ephemient
      ephemient almost 12 years
      Not a direct answer, but have you tried xmllint --format?
    • grimetime
      grimetime almost 12 years
      No, 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
    grimetime almost 12 years
    Thanks! 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
    darcyparker almost 12 years
    Great 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
    ctrueden about 9 years
    I'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