Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

added the actual vim scripts

  • Loading branch information...
commit 81471f2741c4e9a1cf6a4223578767fbc0d451f3 1 parent 698bbea
Erich Heine authored
Showing with 439 additions and 0 deletions.
  1. +353 −0 indent/mako.vim
  2. +86 −0 syntax/mako.vim
View
353 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:
View
86 syntax/mako.vim
@@ -0,0 +1,86 @@
+" Vim syntax file
+" Language: Mako
+" Maintainer: Armin Ronacher <armin.ronacher@active-4.com>
+" URL: http://lucumr.pocoo.org/
+" Last Change: 2008 September 12
+" Version: 0.6.1
+"
+" Thanks to Brine Rue <brian@lolapps.com> who noticed a bug in the
+" delimiter handling.
+"
+" Known Limitations
+" the <%text> block does not have correct attributes
+
+" For version 5.x: Clear all syntax items
+" For version 6.x: Quit when a syntax file was already loaded
+if version < 600
+ syntax clear
+elseif exists("b:current_syntax")
+ finish
+endif
+
+if !exists("main_syntax")
+ let main_syntax = "html"
+endif
+
+"Source the html syntax file
+ru! syntax/html.vim
+unlet b:current_syntax
+
+"Put the python syntax file in @pythonTop
+syn include @pythonTop syntax/python.vim
+
+" End keywords
+syn keyword makoEnd contained endfor endwhile endif endtry enddef
+
+" Block rules
+syn region makoLine matchgroup=makoDelim start=#^\s*%# end=#$# keepend contains=@pythonTop,makoEnd
+syn region makoBlock matchgroup=makoDelim start=#<%!\?# end=#%># keepend contains=@pythonTop,makoEnd
+
+" Variables
+syn region makoNested start="{" end="}" transparent display contained contains=makoNested,@pythonTop
+syn region makoVariable matchgroup=makoDelim start=#\${# end=#}# contains=makoNested,@pythonTop
+
+" Comments
+syn region makoComment start="^\s*##" end="$"
+syn region makoDocComment matchgroup=makoDelim start="<%doc>" end="</%doc>" keepend
+
+" Literal Blocks
+syn region makoText matchgroup=makoDelim start="<%text[^>]*>" end="</%text>"
+
+" Attribute Sublexing
+syn match makoAttributeKey containedin=makoTag contained "[a-zA-Z_][a-zA-Z0-9_]*="
+syn region makoAttributeValue containedin=makoTag contained start=/"/ skip=/\\"/ end=/"/
+syn region makoAttributeValue containedin=MakoTag contained start=/'/ skip=/\\'/ end=/'/
+
+" Tags
+syn region makoTag matchgroup=makoDelim start="<%\(def\|call\|page\|include\|namespace\|inherit\)\>" end="/\?>"
+syn match makoDelim "</%\(def\|call\|namespace\)>"
+
+" Newline Escapes
+syn match makoEscape /\\$/
+
+" Default highlighting links
+if version >= 508 || !exists("did_mako_syn_inits")
+ if version < 508
+ let did_mako_syn_inits = 1
+ com -nargs=+ HiLink hi link <args>
+ else
+ com -nargs=+ HiLink hi def link <args>
+ endif
+
+ HiLink makoDocComment makoComment
+ HiLink makoDefEnd makoDelim
+
+ HiLink makoAttributeKey Type
+ HiLink makoAttributeValue String
+ HiLink makoText Normal
+ HiLink makoDelim Preproc
+ HiLink makoEnd Keyword
+ HiLink makoComment Comment
+ HiLink makoEscape Special
+
+ delc HiLink
+endif
+
+let b:current_syntax = "eruby"
Please sign in to comment.
Something went wrong with that request. Please try again.