Years ago I wrote about a custom function
that uses shell-command-on-region to run xmllint on an XML buffer.
There is nothing wrong with this function, but a simpler approach is using
reformatter, a nice tool from the prolific mind of Steve Purcell.
Once installed, defining a new formatter is trivial:
(reformatter-define xml-format
:program "xmllint"
:args '("--format" "-")
:mode nil)
Now I can add a key binding for xml-format or simply type M-x
xml-format in an XML buffer to have it nicely printed.
Note that setting :mode to nil tells reformatter-define to not create a
minor mode, which I don’t need in this particular case. The minor mode could be
useful if you want your formatter to be called automatically when you save a
buffer. For instance, without changing the default setting for :mode you could
set up the formatter in a project via .dir-locals.el with:
((nxml-mode
(mode . xml-format-on-save)))
You can also specify other options when creating a formatter, so be sure to
check the documentation of reformatter-define (C-h f reformatter-define).