Skip to content

Commit 02730cd

Browse files
added indent support
1 parent 4e8e678 commit 02730cd

File tree

1 file changed

+76
-0
lines changed

1 file changed

+76
-0
lines changed

indent/twig.vim

+76
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
if exists("b:ran_once")
2+
finish
3+
endif
4+
5+
let b:ran_once = 1
6+
7+
setlocal indentexpr=GetTwigIndent()
8+
9+
fun! GetTwigIndent()
10+
let currentLineNumber = v:lnum
11+
let currentLine = getline(currentLineNumber)
12+
let previousLineNumber = prevnonblank(currentLineNumber - 1)
13+
let previousLine = getline(previousLineNumber)
14+
15+
if (previousLine =~ s:startStructures || previousLine =~ s:middleStructures) && (currentLine !~ s:endStructures && currentLine !~ s:middleStructures)
16+
echo "below start or middle"
17+
return indent(previousLineNumber) + &shiftwidth
18+
elseif currentLine =~ s:endStructures || currentLine =~ s:middleStructures
19+
let previousOpenStructureNumber = s:FindPreviousOpenStructure(0, 0, currentLineNumber)
20+
let previousOpenStructureLine = getline(previousOpenStructureNumber)
21+
echo "finding previous open structure"
22+
return indent(previousOpenStructureNumber)
23+
endif
24+
25+
echo "none"
26+
27+
return HtmlIndent()
28+
endf
29+
30+
31+
function! s:FindPreviousOpenStructure(countOpen, countClosed, lineNumber)
32+
echo a:countOpen . a:countClosed . a:lineNumber
33+
if a:countOpen > a:countClosed
34+
return a:lineNumber
35+
elseif a:lineNumber <= 0
36+
return 0
37+
endif
38+
39+
let currentLineNumber = a:lineNumber - 1
40+
let currentLine = getline(currentLineNumber)
41+
if currentLine =~ s:startStructures
42+
return s:FindPreviousOpenStructure(a:countOpen + 1, a:countClosed, currentLineNumber)
43+
elseif currentLine =~ s:endStructures
44+
return s:FindPreviousOpenStructure(a:countOpen, a:countClosed + 1, currentLineNumber)
45+
else
46+
return s:FindPreviousOpenStructure(a:countOpen, a:countClosed, currentLineNumber)
47+
endif
48+
49+
endfunction
50+
51+
function! s:StartStructure(name)
52+
return '{%\s*' . a:name . '.*%}'
53+
endfunction
54+
55+
function! s:EndStructure(name)
56+
return '{%\s*end' . a:name . '.*%}'
57+
endfunction
58+
59+
function! s:Map(Fun, list)
60+
if len(a:list) == 0
61+
return []
62+
else
63+
return [a:Fun(a:list[0])] + s:Map(a:Fun, a:list[1:])
64+
endif
65+
endfunction
66+
67+
fun! s:BuildStructures()
68+
let structures = ['if','for','block']
69+
let mStructures = ['elseif','else']
70+
let s:startStructures = join(s:Map(function('s:StartStructure'), structures), '\|')
71+
let s:endStructures = join(s:Map(function('s:EndStructure'), structures), '\|')
72+
let s:middleStructures = join(s:Map(function('s:StartStructure'), mStructures), '\|')
73+
let s:allStructures = '{%.*%}'
74+
endfun
75+
76+
call s:BuildStructures()

0 commit comments

Comments
 (0)