diff options
author | Adam Stankiewicz <sheerun@sher.pl> | 2016-09-11 13:50:56 +0200 |
---|---|---|
committer | Adam Stankiewicz <sheerun@sher.pl> | 2016-09-11 13:50:56 +0200 |
commit | 74652b465d7eff97070001317a4ea5557717378d (patch) | |
tree | 5bf1df2e0decbedf0bebef7e5b1640d75b0c2f14 /indent | |
parent | 7575da2064c81f4d44cd5a10cc419e8fb97a2dba (diff) | |
download | vim-polyglot-2.13.0.tar.gz vim-polyglot-2.13.0.zip |
Update twig sourcev2.13.0
Diffstat (limited to 'indent')
-rw-r--r-- | indent/twig.vim | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/indent/twig.vim b/indent/twig.vim new file mode 100644 index 00000000..421f7201 --- /dev/null +++ b/indent/twig.vim @@ -0,0 +1,80 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'twig') == -1 + +if exists("b:ran_once") + finish +endif + +let b:ran_once = 1 + +let s:baseIndentExpr=&indentexpr +setlocal indentexpr=GetTwigIndent(v:lnum) + +fun! GetTwigIndent(currentLineNumber) + let currentLine = getline(a:currentLineNumber) + let previousLineNumber = prevnonblank(a:currentLineNumber - 1) + let previousLine = getline(previousLineNumber) + + if (previousLine =~ s:startStructures || previousLine =~ s:middleStructures) && (currentLine !~ s:endStructures && currentLine !~ s:middleStructures) + return indent(previousLineNumber) + &shiftwidth + elseif currentLine =~ s:endStructures || currentLine =~ s:middleStructures + let previousOpenStructureNumber = s:FindPreviousOpenStructure(a:currentLineNumber) + let previousOpenStructureLine = getline(previousOpenStructureNumber) + return indent(previousOpenStructureNumber) + endif + + return s:CallBaseIndent() +endf + +function! s:CallBaseIndent() + exe 'redir => s:outputOfBaseIndent' + exe 'silent echo ' . s:baseIndentExpr + exe 'redir END' + return split(s:outputOfBaseIndent)[0] +endf + + +function! s:FindPreviousOpenStructure(lineNumber) + let countOpen = 0 + let countClosed = 0 + let lineNumber = a:lineNumber + while lineNumber != 1 && countOpen <= countClosed + let lineNumber -= 1 + let currentLine = getline(lineNumber) + + if currentLine =~ s:startStructures + let countOpen += 1 + elseif currentLine =~ s:endStructures + let countClosed += 1 + endif + endwhile + + return lineNumber +endfunction + +function! s:StartStructure(name) + return '^\s*{%\s*' . a:name . '.*%}' +endfunction + +function! s:EndStructure(name) + return '^\s*{%\s*end' . a:name . '.*%}' +endfunction + +function! s:Map(Fun, list) + if len(a:list) == 0 + return [] + else + return [a:Fun(a:list[0])] + s:Map(a:Fun, a:list[1:]) + endif +endfunction + +fun! s:BuildStructures() + let structures = ['if','for','block'] + let mStructures = ['elseif','else'] + let s:startStructures = join(s:Map(function('s:StartStructure'), structures), '\|') + let s:endStructures = join(s:Map(function('s:EndStructure'), structures), '\|') + let s:middleStructures = join(s:Map(function('s:StartStructure'), mStructures), '\|') +endfun + +call s:BuildStructures() + +endif |