diff options
Diffstat (limited to '')
| -rw-r--r-- | README.md | 1 | ||||
| -rwxr-xr-x | build | 1 | ||||
| -rw-r--r-- | ftdetect/polyglot.vim | 4 | ||||
| -rw-r--r-- | ftplugin/mako.vim | 15 | ||||
| -rw-r--r-- | indent/mako.vim | 358 | ||||
| -rw-r--r-- | syntax/mako.vim | 96 | 
6 files changed, 475 insertions, 0 deletions
| @@ -65,6 +65,7 @@ Optionally download one of the [releases](https://github.com/sheerun/vim-polyglo  - [latex](https://github.com/LaTeX-Box-Team/LaTeX-Box) (syntax, indent, ftplugin)  - [less](https://github.com/groenewege/vim-less) (syntax, indent, ftplugin, ftdetect)  - [liquid](https://github.com/tpope/vim-liquid) (syntax, indent, ftplugin, ftdetect) +- [mako](https://github.com/sophacles/vim-bundle-mako) (syntax, indent, ftplugin, ftdetect)  - [markdown](https://github.com/tpope/vim-markdown) (syntax, ftplugin, ftdetect)  - [nginx](https://github.com/nginx/nginx) (syntax, indent, ftdetect)  - [nim](https://github.com/zah/nim.vim) (syntax, compiler, indent, ftdetect) @@ -136,6 +136,7 @@ PACKS="    latex:LaTeX-Box-Team/LaTeX-Box    less:groenewege/vim-less    liquid:tpope/vim-liquid +  mako:sophacles/vim-bundle-mako    markdown:tpope/vim-markdown    nginx:nginx/nginx::/contrib/vim/    nim:zah/nim.vim:_BASIC diff --git a/ftdetect/polyglot.vim b/ftdetect/polyglot.vim index 5f30e46e..160c164f 100644 --- a/ftdetect/polyglot.vim +++ b/ftdetect/polyglot.vim @@ -270,6 +270,10 @@ au BufNewFile,BufRead */templates/**.liquid,*/layout/**.liquid,*/snippets/**.liq        \ let b:liquid_subtype = 'html' |        \ set ft=liquid |  endif +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mako') == -1 +   +au BufRead,BufNewFile *.mako     set filetype=mako +endif  if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'markdown') == -1  autocmd BufNewFile,BufRead *.markdown,*.md,*.mdown,*.mkd,*.mkdn diff --git a/ftplugin/mako.vim b/ftplugin/mako.vim new file mode 100644 index 00000000..cd8cd534 --- /dev/null +++ b/ftplugin/mako.vim @@ -0,0 +1,15 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mako') == -1 +   +" Vim filetype plugin file +" Language:     Mako +" Maintainer:   Randy Stauner <randy@magnificent-tears.com> +" Last Change:  2014-02-07 +" Version:      0.1 + +if exists("b:did_ftplugin") | finish | endif +let b:did_ftplugin = 1 + +setlocal comments=:## +setlocal commentstring=##%s + +endif diff --git a/indent/mako.vim b/indent/mako.vim new file mode 100644 index 00000000..bd6120a5 --- /dev/null +++ b/indent/mako.vim @@ -0,0 +1,358 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mako') == -1 +   +" 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('%block') +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: + +endif diff --git a/syntax/mako.vim b/syntax/mako.vim new file mode 100644 index 00000000..7a9eb654 --- /dev/null +++ b/syntax/mako.vim @@ -0,0 +1,96 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'mako') == -1 +   +" Vim syntax file +" Language:     Mako +" Maintainer:   Armin Ronacher <armin.ronacher@active-4.com> +" URL:          http://lucumr.pocoo.org/ +" Last Change:  2013-05-01 +" 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 + +" tell html.vim what syntax groups should take precedence (see :help html.vim) +syn cluster htmlPreproc add=makoLine,makoVariable,makoTag,makoDocComment,makoDefEnd,makoText,makoDelim,makoEnd,makoComment,makoEscape + +"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\|block\|[a-zA-Z_][a-zA-Z0-9_]*:[a-zA-Z_][a-zA-Z0-9_]*\)\>" end="/\?>" +syn match makoDelim "</%\(def\|call\|namespace\|block\|[a-zA-Z_][a-zA-Z0-9_]*:[a-zA-Z_][a-zA-Z0-9_]*\)>" + +syn region  makoJavaScript matchgroup=makoDelim start=+<%block .*js.*>+ keepend end=+</%block>+ contains=@htmlJavaScript,htmlCssStyleComment,htmlScriptTag,@htmlPreproc,makoLine,makoBlock,makoVariable +syn region makoCssStyle matchgroup=makoDelim start=+<%block .*css.*>+ keepend end=+</%block>+ contains=@htmlCss,htmlTag,htmlEndTag,htmlCssStyleComment,@htmlPreproc,makoLine,makoBlock,makoVariable + +" 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 = "html" + +endif | 
