aboutsummaryrefslogtreecommitdiff
path: root/runtime/indent/xml.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/indent/xml.vim')
-rw-r--r--runtime/indent/xml.vim31
1 files changed, 20 insertions, 11 deletions
diff --git a/runtime/indent/xml.vim b/runtime/indent/xml.vim
index ad22de1d50..883af98563 100644
--- a/runtime/indent/xml.vim
+++ b/runtime/indent/xml.vim
@@ -1,9 +1,10 @@
" Language: xml
" Repository: https://github.com/chrisbra/vim-xml-ftplugin
-" Last Changed: Feb 04, 2019
+" Last Changed: July 27, 2019
" Maintainer: Christian Brabandt <cb@256bit.org>
" Previous Maintainer: Johannes Zellner <johannes@zellner.org>
" Last Change:
+" 20190726 - Correctly handle non-tagged data
" 20190204 - correctly handle wrap tags
" https://github.com/chrisbra/vim-xml-ftplugin/issues/5
" 20190128 - Make sure to find previous tag
@@ -33,6 +34,8 @@ set cpo&vim
" 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
+" autoindent: used when the indentexpr returns -1
+setlocal autoindent
if !exists('b:xml_indent_open')
let b:xml_indent_open = '.\{-}<[:A-Z_a-z]'
@@ -103,37 +106,43 @@ fun! XmlIndentGet(lnum, use_syntax_check)
return 0
endif
" Find previous line with a tag (regardless whether open or closed,
- " but always start restrict the match to a line before the current one
+ " but always restrict the match to a line before the current one
" Note: xml declaration: <?xml version="1.0"?>
" won't be found, as it is not a legal tag name
- let ptag_pattern = '\%(.\{-}<[/:A-Z_a-z]\)'. '\%(\&\%<'. line('.').'l\)'
+ let ptag_pattern = '\%(.\{-}<[/:A-Z_a-z]\)'. '\%(\&\%<'. a:lnum .'l\)'
let ptag = search(ptag_pattern, 'bnW')
" no previous tag
if ptag == 0
return 0
endif
- let syn_name = ''
+ let pline = getline(ptag)
+ let pind = indent(ptag)
+
+ let syn_name_start = '' " Syntax element at start of line (excluding whitespace)
+ let syn_name_end = '' " Syntax element at end of line
+ let curline = getline(a:lnum)
if a:use_syntax_check
let check_lnum = <SID>XmlIndentSynCheck(ptag)
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')
+ let syn_name_end = synIDattr(synID(a:lnum, strlen(curline) - 1, 1), 'name')
+ let syn_name_start = synIDattr(synID(a:lnum, match(curline, '\S') + 1, 1), 'name')
endif
- if syn_name =~ 'Comment'
+ if syn_name_end =~ 'Comment' && syn_name_start =~ 'Comment'
return <SID>XmlIndentComment(a:lnum)
+ elseif empty(syn_name_start) && empty(syn_name_end)
+ " non-xml tag content: use indent from 'autoindent'
+ return pind + shiftwidth()
endif
- let pline = getline(ptag)
- let pind = indent(ptag)
" Get indent from previous tag line
let ind = <SID>XmlIndentSum(pline, -1, pind)
- let t_ind = ind
" Determine indent from current line
- let ind = <SID>XmlIndentSum(getline(a:lnum), 0, ind)
+ let ind = <SID>XmlIndentSum(curline, 0, ind)
return ind
endfun
@@ -148,7 +157,7 @@ func! <SID>HasNoTagEnd(line)
endfunc
" return indent for a commented line,
-" the middle part might be indented on additional level
+" the middle part might be indented one additional level
func! <SID>XmlIndentComment(lnum)
let ptagopen = search(b:xml_indent_open, 'bnW')
let ptagclose = search(b:xml_indent_close, 'bnW')