diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-07-29 02:42:51 +0200 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2019-07-29 20:50:07 +0200 |
commit | aa680f6acb84b876584cbe5c958d50c692154c75 (patch) | |
tree | c034205a78a1b272e8b381c001a03c9a9983de04 /runtime/indent/xml.vim | |
parent | c8f34a9a3efa6e260e97c9c064f7e6cb8a099aa9 (diff) | |
download | rneovim-aa680f6acb84b876584cbe5c958d50c692154c75.tar.gz rneovim-aa680f6acb84b876584cbe5c958d50c692154c75.tar.bz2 rneovim-aa680f6acb84b876584cbe5c958d50c692154c75.zip |
vim-patch:9d87a37ee9d8
Update runtime files.
https://github.com/vim/vim/commit/9d87a37ee9d87f5bdbc779bc940d5f1e6f055d0a
Diffstat (limited to 'runtime/indent/xml.vim')
-rw-r--r-- | runtime/indent/xml.vim | 116 |
1 files changed, 77 insertions, 39 deletions
diff --git a/runtime/indent/xml.vim b/runtime/indent/xml.vim index 7afcc89b7f..bc64aacfe1 100644 --- a/runtime/indent/xml.vim +++ b/runtime/indent/xml.vim @@ -1,15 +1,21 @@ -" Language: xml -" Repository: https://github.com/chrisbra/vim-xml-ftplugin -" Maintainer: Christian Brabandt <cb@256bit.org> -" Previous Maintainer: Johannes Zellner <johannes@zellner.org> -" Last Change: 20181022 - Do not overwrite indentkeys setting -" https://github.com/chrisbra/vim-xml-ftplugin/issues/1 -" 20180724 - Correctly indent xml comments https://github.com/vim/vim/issues/3200 -" Notes: 1) does not indent pure non-xml code (e.g. embedded scripts) -" 2) will be confused by unbalanced tags in comments -" or CDATA sections. -" 2009-05-26 patch by Nikolai Weibull -" TODO: implement pre-like tags, see xml_indent_open / xml_indent_close +" Language: xml +" Repository: https://github.com/chrisbra/vim-xml-ftplugin +" Last Changed: Dec 07th, 2018 +" Maintainer: Christian Brabandt <cb@256bit.org> +" Previous Maintainer: Johannes Zellner <johannes@zellner.org> +" Last Change: +" 20181116 - Fix indentation when tags start with a colon or an underscore +" https://github.com/vim/vim/pull/926 +" 20181022 - Do not overwrite indentkeys setting +" https://github.com/chrisbra/vim-xml-ftplugin/issues/1 +" 20180724 - Correctly indent xml comments https://github.com/vim/vim/issues/3200 +" +" Notes: +" 1) does not indent pure non-xml code (e.g. embedded scripts) +" 2) will be confused by unbalanced tags in comments +" or CDATA sections. +" 2009-05-26 patch by Nikolai Weibull +" TODO: implement pre-like tags, see xml_indent_open / xml_indent_close " Only load this indent file when no other was loaded. if exists("b:did_indent") @@ -20,11 +26,12 @@ let s:keepcpo= &cpo set cpo&vim " [-- local settings (must come before aborting the script) --] +" Attention: Parameter use_syntax_check is used by the docbk.vim indent script setlocal indentexpr=XmlIndentGet(v:lnum,1) setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,},!^F if !exists('b:xml_indent_open') - let b:xml_indent_open = '.\{-}<\a' + let b:xml_indent_open = '.\{-}<[:A-Z_a-z]' " pre tag, e.g. <address> " let b:xml_indent_open = '.\{-}<[/]\@!\(address\)\@!' endif @@ -40,7 +47,7 @@ unlet s:keepcpo " [-- finish, if the function already exists --] if exists('*XmlIndentGet') - finish + finish endif let s:keepcpo= &cpo @@ -53,13 +60,13 @@ endfun " [-- check if it's xml --] fun! <SID>XmlIndentSynCheck(lnum) - if '' != &syntax - let syn1 = synIDattr(synID(a:lnum, 1, 1), 'name') - let syn2 = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name') - if '' != syn1 && syn1 !~ 'xml' && '' != syn2 && syn2 !~ 'xml' - " don't indent pure non-xml code - return 0 - endif + if &syntax != '' + let syn1 = synIDattr(synID(a:lnum, 1, 1), 'name') + let syn2 = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name') + if syn1 != '' && syn1 !~ 'xml' && syn2 != '' && syn2 !~ 'xml' + " don't indent pure non-xml code + return 0 + endif endif return 1 endfun @@ -68,41 +75,72 @@ endfun fun! <SID>XmlIndentSum(lnum, style, add) let line = getline(a:lnum) if a:style == match(line, '^\s*</') - return (shiftwidth() * - \ (<SID>XmlIndentWithPattern(line, b:xml_indent_open) - \ - <SID>XmlIndentWithPattern(line, b:xml_indent_close) - \ - <SID>XmlIndentWithPattern(line, '.\{-}/>'))) + a:add + return (shiftwidth() * + \ (<SID>XmlIndentWithPattern(line, b:xml_indent_open) + \ - <SID>XmlIndentWithPattern(line, b:xml_indent_close) + \ - <SID>XmlIndentWithPattern(line, '.\{-}/>'))) + a:add else - return a:add + return a:add endif endfun +" Main indent function fun! XmlIndentGet(lnum, use_syntax_check) " Find a non-empty line above the current line. - let lnum = prevnonblank(a:lnum - 1) + let plnum = prevnonblank(a:lnum - 1) + " Find previous line with a tag (regardless whether open or closed) + let ptag = search('.\{-}<[/:A-Z_a-z]', 'bnw') " Hit the start of the file, use zero indent. - if lnum == 0 - return 0 + if plnum == 0 + return 0 endif + let syn_name = '' if a:use_syntax_check - let check_lnum = <SID>XmlIndentSynCheck(lnum) - let check_alnum = <SID>XmlIndentSynCheck(a:lnum) - if 0 == check_lnum || 0 == check_alnum - return indent(a:lnum) - elseif -1 == check_lnum || -1 == check_alnum - return -1 - endif + let check_lnum = <SID>XmlIndentSynCheck(plnum) + let check_alnum = <SID>XmlIndentSynCheck(a:lnum) + if check_lnum == 0 || check_alnum == 0 + return indent(a:lnum) + endif + let syn_name = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name') endif - let ind = <SID>XmlIndentSum(lnum, -1, indent(lnum)) - let ind = <SID>XmlIndentSum(a:lnum, 0, ind) + if syn_name =~ 'Comment' + return <SID>XmlIndentComment(a:lnum) + endif + " Get indent from previous tag line + let ind = <SID>XmlIndentSum(ptag, -1, indent(ptag)) + " Determine indent from current line + let ind = <SID>XmlIndentSum(a:lnum, 0, ind) return ind endfun +" return indent for a commented line, +" the middle part might be indented on additional level +func! <SID>XmlIndentComment(lnum) + let ptagopen = search(b:xml_indent_open, 'bnw') + let ptagclose = search(b:xml_indent_close, 'bnw') + if getline(a:lnum) =~ '<!--' + " if previous tag was a closing tag, do not add + " one additional level of indent + if ptagclose > ptagopen && a:lnum > ptagclose + return indent(ptagclose) + else + " start of comment, add one indentation level + return indent(ptagopen) + shiftwidth() + endif + elseif getline(a:lnum) =~ '-->' + " end of comment, same as start of comment + return indent(search('<!--', 'bnw')) + else + " middle part of comment, add one additional level + return indent(search('<!--', 'bnw')) + shiftwidth() + endif +endfunc + let &cpo = s:keepcpo unlet s:keepcpo -" vim:ts=8 +" vim:ts=4 et sts=-1 sw=0 |