Lokvin Wiki
(Created page with "==install vim == yum install vim ==create ~/.vimrc == touch ~/.vimrc ==add vim format xml== * add below content to ~/.vimrc function! DoPrettyXML() " save the filetype...")
 
Line 36: Line 36:
 
endfunction
 
endfunction
 
command! PrettyXML call DoPrettyXML()
 
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>

Revision as of 03:39, 22 August 2014

install vim

yum install vim

create ~/.vimrc

touch ~/.vimrc

add vim format xml

  • add below content to ~/.vimrc
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>