commit fa2569df3145ce0c75302622b0fd45f681ec79d3 Author: lepture Date: Thu Sep 13 16:20:42 2012 +0800 init diff --git a/README.md b/README.md new file mode 100644 index 0000000..c803863 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# vim plugins for Jinja diff --git a/ftdetect/jinja.vim b/ftdetect/jinja.vim new file mode 100644 index 0000000..8afc416 --- /dev/null +++ b/ftdetect/jinja.vim @@ -0,0 +1 @@ +au BufNewFile,BufRead *.html,*.htm,*.shtml,*.stm if &ft == 'htmldjango' | set ft=jinja | endif diff --git a/indent/jinja.vim b/indent/jinja.vim new file mode 100644 index 0000000..b2c7f2d --- /dev/null +++ b/indent/jinja.vim @@ -0,0 +1,75 @@ +" jinja indent file +" Language: Jinja HTML template +" Maintainer: Hsiaoming Yang +" Last Change: Sep 13, 2012 + +if exists("b:did_indent") + finish +endif + +runtime! indent/html.vim +unlet! b:did_indent + +if &l:indentexpr == '' + if &l:cindent + let &l:indentexpr = 'cindent(v:lnum)' + else + let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))' + endif +endif +let b:html_indentexpr = &l:indentexpr + +let b:did_indent = 1 + +setlocal indentexpr=GetJinjaIndent() +setlocal indentkeys=o,O,*,{,},o,O,!^F,<>> + +" Only define the function once. +if exists("*GetJinjaIndent") + finish +endif + +function! GetJinjaIndent(...) + if a:0 && a:1 == '.' + let v:lnum = line('.') + elseif a:0 && a:1 =~ '^\d' + let v:lnum = a:1 + endif + let vcol = col('.') + + call cursor(v:lnum,vcol) + + exe "let ind = ".b:html_indentexpr + + let lnum = prevnonblank(v:lnum-1) + let pnb = getline(lnum) + let cur = getline(v:lnum) + + let tagstart = '.*' . '{%\s*' + let tagend = '.*%}' . '.*' + + let blocktags = '\(block\|for\|if\|with\|autoescape\|comment\|filter\|spaceless\)' + let midtags = '\(empty\|else\)' + + let pnb_blockstart = pnb =~# tagstart . blocktags . tagend + let pnb_blockend = pnb =~# tagstart . 'end' . blocktags . tagend + let pnb_blockmid = pnb =~# tagstart . midtags . tagend + + let cur_blockstart = cur =~# tagstart . blocktags . tagend + let cur_blockend = cur =~# tagstart . 'end' . blocktags . tagend + let cur_blockmid = cur =~# tagstart . midtags . tagend + + if pnb_blockstart && !pnb_blockend + let ind = ind + &sw + elseif pnb_blockmid && !pnb_blockend + let ind = ind + &sw + endif + + if cur_blockend && !cur_blockstart + let ind = ind - &sw + elseif cur_blockmid + let ind = ind - &sw + endif + + return ind +endfunction diff --git a/syntax/jinja.vim b/syntax/jinja.vim new file mode 100644 index 0000000..96ee0b8 --- /dev/null +++ b/syntax/jinja.vim @@ -0,0 +1,95 @@ +" jinja syntax file +" Language: Jinja HTML template +" Maintainer: Hsiaoming Yang +" Last Change: Sep 13, 2012 + +" only support 6.x+ + +if exists("b:current_syntax") + finish +endif + +if !exists("main_syntax") + let main_syntax = 'html' +endif + +runtime! syntax/html.vim +unlet b:current_syntax + +syntax case match + +" Mark illegal characters +syn match jinjaError "%}\|}}\|#}" + +" jinja template built-in tags and parameters +" 'comment' doesn't appear here because it gets special treatment +syn keyword jinjaStatement contained autoescape csrf_token empty +" FIXME ==, !=, <, >, <=, and >= should be jinjaStatements: +" syn keyword jinjaStatement contained == != < > <= >= +syn keyword jinjaStatement contained and as block endblock by cycle debug else +syn keyword jinjaStatement contained extends filter endfilter firstof for +syn keyword jinjaStatement contained endfor if endif ifchanged endifchanged +syn keyword jinjaStatement contained ifequal endifequal ifnotequal +syn keyword jinjaStatement contained endifnotequal in include load not now or +syn keyword jinjaStatement contained parsed regroup reversed spaceless +syn keyword jinjaStatement contained endspaceless ssi templatetag openblock +syn keyword jinjaStatement contained closeblock openvariable closevariable +syn keyword jinjaStatement contained openbrace closebrace opencomment +syn keyword jinjaStatement contained closecomment widthratio url with endwith +syn keyword jinjaStatement contained get_current_language trans noop blocktrans +syn keyword jinjaStatement contained endblocktrans get_available_languages +syn keyword jinjaStatement contained get_current_language_bidi plural + +" jinja templete built-in filters +syn keyword jinjaFilter contained add addslashes capfirst center cut date +syn keyword jinjaFilter contained default default_if_none dictsort +syn keyword jinjaFilter contained dictsortreversed divisibleby escape escapejs +syn keyword jinjaFilter contained filesizeformat first fix_ampersands +syn keyword jinjaFilter contained floatformat get_digit join last length length_is +syn keyword jinjaFilter contained linebreaks linebreaksbr linenumbers ljust +syn keyword jinjaFilter contained lower make_list phone2numeric pluralize +syn keyword jinjaFilter contained pprint random removetags rjust slice slugify +syn keyword jinjaFilter contained safe safeseq stringformat striptags +syn keyword jinjaFilter contained time timesince timeuntil title +syn keyword jinjaFilter contained truncatewords truncatewords_html unordered_list upper urlencode +syn keyword jinjaFilter contained urlize urlizetrunc wordcount wordwrap yesno + +" Keywords to highlight within comments +syn keyword jinjaTodo contained TODO FIXME XXX + +" jinja template constants (always surrounded by double quotes) +syn region jinjaArgument contained start=/"/ skip=/\\"/ end=/"/ + +" Mark illegal characters within tag and variables blocks +syn match jinjaTagError contained "#}\|{{\|[^%]}}\|[&#]" +syn match jinjaVarError contained "#}\|{%\|%}\|[<>!&#%]" + +" jinja template tag and variable blocks +syn region jinjaTagBlock start="{%" end="%}" contains=jinjaStatement,jinjaFilter,jinjaArgument,jinjaTagError display +syn region jinjaVarBlock start="{{" end="}}" contains=jinjaFilter,jinjaArgument,jinjaVarError display + +" jinja template 'comment' tag and comment block +syn region jinjaComment start="{%\s*comment\s*%}" end="{%\s*endcomment\s*%}" contains=jinjaTodo +syn region jinjaComBlock start="{#" end="#}" contains=jinjaTodo + +syn cluster jinjaBlocks add=jinjaTagBlock,jinjaVarBlock,jinjaComment,jinjaComBlock + +syn region jinjaTagBlock start="{%" end="%}" contains=jinjaStatement,jinjaFilter,jinjaArgument,jinjaTagError display containedin=ALLBUT,@jinjaBlocks +syn region jinjaVarBlock start="{{" end="}}" contains=jinjaFilter,jinjaArgument,jinjaVarError display containedin=ALLBUT,@jinjaBlocks +syn region jinjaComment start="{%\s*comment\s*%}" end="{%\s*endcomment\s*%}" contains=jinjaTodo containedin=ALLBUT,@jinjaBlocks +syn region jinjaComBlock start="{#" end="#}" contains=jinjaTodo containedin=ALLBUT,@jinjaBlocks + + +hi def link jinjaTagBlock PreProc +hi def link jinjaVarBlock PreProc +hi def link jinjaStatement Statement +hi def link jinjaFilter Identifier +hi def link jinjaArgument Constant +hi def link jinjaTagError Error +hi def link jinjaVarError Error +hi def link jinjaError Error +hi def link jinjaComment Comment +hi def link jinjaComBlock Comment +hi def link jinjaTodo Todo + +let b:current_syntax = "jinja"