summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdam Stankiewicz <sheerun@sher.pl>2016-05-13 15:56:51 +0200
committerAdam Stankiewicz <sheerun@sher.pl>2016-05-13 16:10:17 +0200
commitb9dae8fbab5c49d5cb7d117de9a782217e6b0f60 (patch)
tree678c559c854a064e9ad5da2db1a76c8bea354055
parent84593f2d7f25ba215a7bab954d639a2718f88c24 (diff)
downloadvim-polyglot-b9dae8fbab5c49d5cb7d117de9a782217e6b0f60.tar.gz
vim-polyglot-b9dae8fbab5c49d5cb7d117de9a782217e6b0f60.zip
Add mako support, closes #126
-rw-r--r--README.md1
-rwxr-xr-xbuild1
-rw-r--r--ftdetect/polyglot.vim4
-rw-r--r--ftplugin/mako.vim15
-rw-r--r--indent/mako.vim358
-rw-r--r--syntax/mako.vim96
6 files changed, 475 insertions, 0 deletions
diff --git a/README.md b/README.md
index f495d65e..35d4912b 100644
--- a/README.md
+++ b/README.md
@@ -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)
diff --git a/build b/build
index 8e9b00c5..bf3627b4 100755
--- a/build
+++ b/build
@@ -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