summaryrefslogtreecommitdiff
path: root/.vim/indent/mako.vim
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--.vim/indent/mako.vim353
1 files changed, 353 insertions, 0 deletions
diff --git a/.vim/indent/mako.vim b/.vim/indent/mako.vim
new file mode 100644
index 0000000..bd85ac5
--- /dev/null
+++ b/.vim/indent/mako.vim
@@ -0,0 +1,353 @@
+" Vim indent file
+" Language: Mako
+" Author: Scott Torborg <storborg@mit.edu>
+" Version: 0.4
+" License: Do What The Fuck You Want To Public License (WTFPL)
+"
+" ---------------------------------------------------------------------------
+"
+" DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+" Version 2, December 2004
+"
+" Copyright (C) 2004 Sam Hocevar <sam@hocevar.net>
+"
+" Everyone is permitted to copy and distribute verbatim or modified
+" copies of this license document, and changing it is allowed as long
+" as the name is changed.
+"
+" DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
+" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+"
+" 0. You just DO WHAT THE FUCK YOU WANT TO.
+"
+" ---------------------------------------------------------------------------
+"
+" This script does more useful indenting for Mako HTML templates. It indents
+" inside of control blocks, defs, etc. Note that this indenting style will
+" sacrifice readability of the output text for the sake of readability of the
+" template.
+"
+" We'll use HTML indenting globally, python inside <% %> blocks. Inspired by
+" the excellent PHP + HTML indentation files such as php.vim by Pim Snel.
+"
+" Changelog:
+" 0.4 - 5 March 2010
+" - Added license information
+" 0.3 - 15 September 2009
+" - Added explicit indenting for ## comments, fixed unindenting count,
+" thanks to Mike Lewis (@MikeRLewis) for this
+" 0.2 - 15 June 2009
+" - Fixed issue where opening and closing mako tags on the same line
+" would cause incorrect indenting
+" 0.1 - 06 June 2009
+" - Initial public release of mako indent file
+
+let sw=2 " default shiftwidth of 2 spaces
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+setlocal noautoindent
+setlocal nocindent
+setlocal nolisp
+
+setlocal indentexpr=GetMakoIndent()
+setlocal indentkeys+=*<Return>,<>>,<bs>,end,:
+
+" Only define the function once.
+if exists("*GetMakoIndent")
+ finish
+endif
+
+if exists('g:html_indent_tags')
+ unlet g:html_indent_tags
+endif
+
+function IsInsidePythonBlock(startline)
+ " Loop until we get a line that's either <% or %>
+ let lnum = a:startline
+ while getline(lnum) !~ '\(%>\|<%\)$' && lnum > 0
+ let lnum = lnum - 1
+ endwhile
+
+ " lnum points to the last control. If it's a <% then we're inside an
+ " embedded python block, otherwise we're not.
+ return getline(lnum) =~ '<%$'
+endfunction
+
+function GetMakoIndent()
+ " Find a non-empty line above the current line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let line = getline(lnum) " last line
+ let cline = getline(v:lnum) " current line
+ let pline = getline(lnum - 1) " previous to last line
+ let ind = indent(lnum)
+ if line =~ '^\s*##'
+ return indent(lnum)
+ end
+
+ let restore_ic=&ic
+ let &ic=1 " ignore case
+
+ let ind = <SID>HtmlIndentSum(lnum, -1)
+ let ind = <SID>HtmlIndentSum(lnum, -1)
+ let ind = ind + <SID>HtmlIndentSum(v:lnum, 0)
+
+ let &ic=restore_ic
+
+ let ind = indent(lnum) + (&sw * ind)
+
+ " Indent after %anything: or <%anything NOT ending in />
+ if line =~ '^\s*%.*:\s*$'
+ let ind = ind + &sw
+ endif
+
+ " Unindent before %end* or </%anything
+ if cline =~ '^\s*%\s*end'
+ let ind = ind - &sw
+ endif
+ "
+ " Unindent before %else, %except, and %elif
+ if cline =~ '^\s*%\s*else' || cline =~ '^\s*%\s*except' || cline =~ '^\s*%\s*elif'
+ let ind = ind - &sw
+ endif
+
+ " Indent at the beginning of a python control block
+ if line =~ '<%$'
+ let ind = ind + &sw
+ endif
+ "
+ " Unindent at the end of the python block.
+ if cline =~ '^\s*%>$'
+ let scanlnum = lnum
+ " Scan backwards until we find the beginning of this python block.
+ while getline(scanlnum) !~ '<%$' && scanlnum > 0
+ let scanlnum = scanlnum - 1
+ endwhile
+ let ind = indent(scanlnum)
+ endif
+
+ " If we're inside a python block and the previous line ends in a colon,
+ " indent.
+ if IsInsidePythonBlock(lnum - 1)
+ " Indent after :
+ if line =~ '\:$'
+ let ind = ind + &sw
+ endif
+ endif
+
+ return ind
+endfunction
+
+
+" [-- helper function to assemble tag list --]
+fun! <SID>HtmlIndentPush(tag)
+ if exists('g:html_indent_tags')
+ let g:html_indent_tags = g:html_indent_tags.'\|'.a:tag
+ else
+ let g:html_indent_tags = a:tag
+ endif
+endfun
+
+fun! <SID>MakoIndentPush(tag)
+ if exists('g:mako_indent_tags')
+ let g:mako_indent_tags = g:mako_indent_tags.'\|'.a:tag
+ else
+ let g:mako_indent_tags = a:tag
+ endif
+endfun
+
+" [-- <ELEMENT ? - - ...> --]
+call <SID>HtmlIndentPush('a')
+call <SID>HtmlIndentPush('abbr')
+call <SID>HtmlIndentPush('acronym')
+call <SID>HtmlIndentPush('address')
+call <SID>HtmlIndentPush('b')
+call <SID>HtmlIndentPush('bdo')
+call <SID>HtmlIndentPush('big')
+call <SID>HtmlIndentPush('blockquote')
+call <SID>HtmlIndentPush('button')
+call <SID>HtmlIndentPush('caption')
+call <SID>HtmlIndentPush('center')
+call <SID>HtmlIndentPush('cite')
+call <SID>HtmlIndentPush('code')
+call <SID>HtmlIndentPush('colgroup')
+call <SID>HtmlIndentPush('del')
+call <SID>HtmlIndentPush('dfn')
+call <SID>HtmlIndentPush('dir')
+call <SID>HtmlIndentPush('div')
+call <SID>HtmlIndentPush('dl')
+call <SID>HtmlIndentPush('em')
+call <SID>HtmlIndentPush('fieldset')
+call <SID>HtmlIndentPush('font')
+call <SID>HtmlIndentPush('form')
+call <SID>HtmlIndentPush('frameset')
+call <SID>HtmlIndentPush('h1')
+call <SID>HtmlIndentPush('h2')
+call <SID>HtmlIndentPush('h3')
+call <SID>HtmlIndentPush('h4')
+call <SID>HtmlIndentPush('h5')
+call <SID>HtmlIndentPush('h6')
+call <SID>HtmlIndentPush('i')
+call <SID>HtmlIndentPush('iframe')
+call <SID>HtmlIndentPush('ins')
+call <SID>HtmlIndentPush('kbd')
+call <SID>HtmlIndentPush('label')
+call <SID>HtmlIndentPush('legend')
+call <SID>HtmlIndentPush('map')
+call <SID>HtmlIndentPush('menu')
+call <SID>HtmlIndentPush('noframes')
+call <SID>HtmlIndentPush('noscript')
+call <SID>HtmlIndentPush('object')
+call <SID>HtmlIndentPush('ol')
+call <SID>HtmlIndentPush('optgroup')
+call <SID>HtmlIndentPush('pre')
+call <SID>HtmlIndentPush('q')
+call <SID>HtmlIndentPush('s')
+call <SID>HtmlIndentPush('samp')
+call <SID>HtmlIndentPush('script')
+call <SID>HtmlIndentPush('select')
+call <SID>HtmlIndentPush('small')
+call <SID>HtmlIndentPush('span')
+call <SID>HtmlIndentPush('strong')
+call <SID>HtmlIndentPush('style')
+call <SID>HtmlIndentPush('sub')
+call <SID>HtmlIndentPush('sup')
+call <SID>HtmlIndentPush('table')
+call <SID>HtmlIndentPush('textarea')
+call <SID>HtmlIndentPush('title')
+call <SID>HtmlIndentPush('tt')
+call <SID>HtmlIndentPush('u')
+call <SID>HtmlIndentPush('ul')
+call <SID>HtmlIndentPush('var')
+
+" For some reason the default HTML indentation script doesn't consider these
+" elements to be worthy of indentation.
+call <SID>HtmlIndentPush('p')
+call <SID>HtmlIndentPush('dt')
+call <SID>HtmlIndentPush('dd')
+
+
+" [-- <ELEMENT ? O O ...> --]
+if !exists('g:html_indent_strict')
+ call <SID>HtmlIndentPush('body')
+ call <SID>HtmlIndentPush('head')
+ call <SID>HtmlIndentPush('html')
+ call <SID>HtmlIndentPush('tbody')
+endif
+
+
+" [-- <ELEMENT ? O - ...> --]
+if !exists('g:html_indent_strict_table')
+ call <SID>HtmlIndentPush('th')
+ call <SID>HtmlIndentPush('td')
+ call <SID>HtmlIndentPush('tr')
+ call <SID>HtmlIndentPush('tfoot')
+ call <SID>HtmlIndentPush('thead')
+endif
+
+" [-- <Mako Elements> --]
+call <SID>MakoIndentPush('%def')
+call <SID>MakoIndentPush('%call')
+call <SID>MakoIndentPush('%doc')
+call <SID>MakoIndentPush('%text')
+call <SID>MakoIndentPush('%.\+:.\+')
+
+delfun <SID>HtmlIndentPush
+delfun <SID>MakoIndentPush
+
+set cpo-=C
+
+" [-- get number of regex matches in a string --]
+fun! <SID>MatchCount(expr, pat)
+ let mpos = 0
+ let mcount = 0
+ let expr = a:expr
+ while (mpos > -1)
+ let mend = matchend(expr, a:pat)
+ if mend > -1
+ let mcount = mcount + 1
+ endif
+ if mend == mpos
+ let mpos = mpos + 1
+ else
+ let mpos = mend
+ endif
+ let expr = strpart(expr, mpos)
+ endwhile
+ return mcount
+endfun
+
+" [-- count indent-increasing tags of line a:lnum --]
+fun! <SID>HtmlIndentOpen(lnum)
+ let s = substitute('x'.getline(a:lnum),
+ \ '.\{-}\(\(<\)\('.g:html_indent_tags.'\)\>\)', "\1", 'g')
+ let s = substitute(s, "[^\1].*$", '', '')
+ return strlen(s)
+endfun
+
+" [-- count indent-decreasing tags of line a:lnum --]
+fun! <SID>HtmlIndentClose(lnum)
+ let s = substitute('x'.getline(a:lnum),
+ \ '.\{-}\(\(<\)/\('.g:html_indent_tags.'\)\>>\)', "\1", 'g')
+ let s = substitute(s, "[^\1].*$", '', '')
+ return strlen(s)
+endfun
+
+" [-- count indent-increasing mako tags of line a:lnum --]
+fun! <SID>MakoIndentOpen(lnum)
+ let s = substitute('x'.getline(a:lnum),
+ \ '.\{-}\(\(<\)\('.g:mako_indent_tags.'\)\>\)', "\1", 'g')
+ let s = substitute(s, "[^\1].*$", '', '')
+ return strlen(s)
+endfun
+
+" [-- count indent-decreasing mako tags of line a:lnum --]
+fun! <SID>MakoIndentClose(lnum)
+ let mcount = <SID>MatchCount(getline(a:lnum), '</\('.g:mako_indent_tags.'\)>')
+ let mcount = mcount + <SID>MatchCount(getline(a:lnum), '<\('.g:mako_indent_tags.'\)[^>]*/>')
+ return mcount
+endfun
+
+" [-- count indent-increasing '{' of (java|css) line a:lnum --]
+fun! <SID>HtmlIndentOpenAlt(lnum)
+ return strlen(substitute(getline(a:lnum), '[^{]\+', '', 'g'))
+endfun
+
+" [-- count indent-decreasing '}' of (java|css) line a:lnum --]
+fun! <SID>HtmlIndentCloseAlt(lnum)
+ return strlen(substitute(getline(a:lnum), '[^}]\+', '', 'g'))
+endfun
+
+" [-- return the sum of indents respecting the syntax of a:lnum --]
+fun! <SID>HtmlIndentSum(lnum, style)
+ let open = <SID>HtmlIndentOpen(a:lnum) + <SID>MakoIndentOpen(a:lnum)
+ let close = <SID>HtmlIndentClose(a:lnum) + <SID>MakoIndentClose(a:lnum)
+ if a:style == match(getline(a:lnum), '^\s*</')
+ if a:style == match(getline(a:lnum), '^\s*</\('.g:html_indent_tags.'\|'.g:mako_indent_tags.'\)')
+ if 0 != open || 0 != close
+ return open - close
+ endif
+ endif
+ endif
+ if '' != &syntax &&
+ \ synIDattr(synID(a:lnum, 1, 1), 'name') =~ '\(css\|java\).*' &&
+ \ synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name')
+ \ =~ '\(css\|java\).*'
+ if a:style == match(getline(a:lnum), '^\s*}')
+ return <SID>HtmlIndentOpenAlt(a:lnum) - <SID>HtmlIndentCloseAlt(a:lnum)
+ endif
+ endif
+ return 0
+endfun
+
+" vim: set ts=4 sw=4: