(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>