Lokvin Wiki
Advertisement

install vim[]

yum install vim

create ~/.vimrc[]

touch ~/.vimrc

add vim format xml[]

function! DoPrettyXML()
 " save the filetype so we can restore it later
 let l:origft = &ft
 set ft=
 " delete the xml header if it exists. This will
 " permit us to surround the document with fake tags
 " without creating invalid xml.
 1s/<?xml .*?>//e
 " insert fake tags around the entire document.
 " This will permit us to pretty-format excerpts of
 " XML that may contain multiple top-level elements.
 0put ='<PrettyXML>'
 $put ='</PrettyXML>'
 silent %!xmllint --format -
 " xmllint will insert an <?xml?> header. it's easy enough to delete
 " if you don't want it.
 " delete the fake tags
 2d
 $d
 " restore the 'normal' indentation, which is one extra level
 " too deep due to the extra tags we wrapped around the document.
 silent %<
 " back to home
 1
 " restore the filetype
 exe "set ft=" . l:origft
endfunction
command! PrettyXML call DoPrettyXML()
" XML formatter
function! DoFormatXML() range
	" Save the file type
	let l:origft = &ft

	" Clean the file type
	set ft=

	" Add fake initial tag (so we can process multiple top-level elements)
	exe ":let l:beforeFirstLine=" . a:firstline . "-1"
	if l:beforeFirstLine < 0
		let l:beforeFirstLine=0
	endif
	exe a:lastline . "put ='</PrettyXML>'"
	exe l:beforeFirstLine . "put ='<PrettyXML>'"
	exe ":let l:newLastLine=" . a:lastline . "+2"
	if l:newLastLine > line('$')
		let l:newLastLine=line('$')
	endif

	" Remove XML header
	exe ":" . a:firstline . "," . a:lastline . "s/<\?xml\\_.*\?>\\_s*//e"

	" Recalculate last line of the edited code
	let l:newLastLine=search('</PrettyXML>')

	" Execute external formatter
	exe ":silent " . a:firstline . "," . l:newLastLine . "!xmllint --noblanks --format --recover -"

	" Recalculate first and last lines of the edited code
	let l:newFirstLine=search('<PrettyXML>')
	let l:newLastLine=search('</PrettyXML>')
	
	" Get inner range
	let l:innerFirstLine=l:newFirstLine+1
	let l:innerLastLine=l:newLastLine-1

	" Remove extra unnecessary indentation
	exe ":silent " . l:innerFirstLine . "," . l:innerLastLine "s/^  //e"

	" Remove fake tag
	exe l:newLastLine . "d"
	exe l:newFirstLine . "d"

	" Put the cursor at the first line of the edited code
	exe ":" . l:newFirstLine

	" Restore the file type
	exe "set ft=" . l:origft
endfunction
command! -range=% FormatXML <line1>,<line2>call DoFormatXML()

nmap <silent> <leader>x :%FormatXML<CR>
vmap <silent> <leader>x :FormatXML<CR>
Advertisement