From 7fbcdcfeff2e3c54b660e6b79dc51273d09b905c Mon Sep 17 00:00:00 2001 From: ache Date: Mon, 17 Jul 2017 00:38:31 +0200 Subject: Add svg support --- plugin/svg.vim | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 plugin/svg.vim diff --git a/plugin/svg.vim b/plugin/svg.vim new file mode 100644 index 0000000..b1597a9 --- /dev/null +++ b/plugin/svg.vim @@ -0,0 +1,105 @@ +" Vim indent file +" +" Language: svg +" Maintainer: Jason Shell +" Last Change: 2015 Sep 23 +" Notes: 1) will be confused by unbalanced tags in comments + +" Only load this indent file when no other was loaded. +if exists('b:did_indent') + finish +endif +let b:did_indent = 1 +let s:keepcpo= &cpo +set cpo&vim + +" [-- local settings (must come before aborting the script) --] +setlocal indentexpr=SvgIndentGet(v:lnum,1) +setlocal indentkeys=o,O,*,<>>,<<>,/,{,} + +if !exists('b:svg_indent_open') + let b:svg_indent_open = '.\{-}<\a' + " pre tag, e.g.
+ " let b:svg_indent_open = '.\{-}<[/]\@!\(address\)\@!' +endif + +if !exists('b:svg_indent_close') + let b:svg_indent_close = '.\{-} + " let b:svg_indent_close = '.\{-}SvgIndentWithPattern(line, pat) + let s = substitute('x'.a:line, a:pat, "\1", 'g') + return strlen(substitute(s, "[^\1].*$", '', '')) +endfun + +" [-- check if it's svg --] +fun! SvgIndentSynCheck(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 !~ 'svg' && '' != syn2 && syn2 !~ 'svg' + " don't indent pure non-xml code + return 0 + + " elseif syn1 =~ '^xmlComment' && syn2 =~ '^xmlComment' + elseif syn1 =~ '^svgComment' && syn2 =~ '^svgComment' + " indent comments specially + return -1 + endif + endif + return 1 +endfun + +" [-- return the sum of indents of a:lnum --] +fun! SvgIndentSum(lnum, style, add) + let line = getline(a:lnum) + if a:style == match(line, '^\s*SvgIndentWithPattern(line, b:svg_indent_open) + \ - SvgIndentWithPattern(line, b:svg_indent_close) + \ - SvgIndentWithPattern(line, '.\{-}/>'))) + a:add + else + return a:add + endif +endfun + +fun! SvgIndentGet(lnum, use_syntax_check) + " Find a non-empty line above the current line. + let lnum = prevnonblank(a:lnum - 1) + + " Hit the start of the file, use zero indent. + if lnum == 0 + return 0 + endif + + if a:use_syntax_check + let check_lnum = SvgIndentSynCheck(lnum) + let check_alnum = SvgIndentSynCheck(a:lnum) + if 0 == check_lnum || 0 == check_alnum + return indent(a:lnum) + elseif -1 == check_lnum || -1 == check_alnum + return -1 + endif + endif + + let ind = SvgIndentSum(lnum, -1, indent(lnum)) + let ind = SvgIndentSum(a:lnum, 0, ind) + + return ind +endfun + +let &cpo = s:keepcpo +unlet s:keepcpo -- cgit v1.2.3