From e32871fd4a8d0dca327011b81d214ab5321f853d Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Thu, 12 Sep 2013 17:26:31 +0200 Subject: [PATCH] Add twig syntax support --- build.sh | 1 + ftdetect/twig.vim | 5 +++ ftplugin/twig.vim | 18 ++++++++ syntax/twig.vim | 109 ++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 133 insertions(+) create mode 100644 ftdetect/twig.vim create mode 100644 ftplugin/twig.vim create mode 100644 syntax/twig.vim diff --git a/build.sh b/build.sh index eee47a8..487724c 100755 --- a/build.sh +++ b/build.sh @@ -61,6 +61,7 @@ syntax 'derekwyatt/vim-scala' & syntax 'derekwyatt/vim-sbt' & syntax 'travitch/hasksyn' & syntax 'vim-scripts/Puppet-Syntax-Highlighting' & +syntax 'beyondwords/vim-twig' & wait diff --git a/ftdetect/twig.vim b/ftdetect/twig.vim new file mode 100644 index 0000000..06b70e2 --- /dev/null +++ b/ftdetect/twig.vim @@ -0,0 +1,5 @@ +" Twig +autocmd BufNewFile,BufRead *.twig set filetype=twig + +" HTML Twig +autocmd BufNewFile,BufRead *.html.twig set filetype=html.twig diff --git a/ftplugin/twig.vim b/ftplugin/twig.vim new file mode 100644 index 0000000..506adbd --- /dev/null +++ b/ftplugin/twig.vim @@ -0,0 +1,18 @@ +" Vim filetype plugin +" Language: Twig +" Maintainer: F. Gabriel Gosselin + +if exists("b:did_ftplugin") + finish +endif + +runtime! ftplugin/html.vim ftplugin/html*.vim ftplugin/html/*.vim +unlet! b:did_ftplugin + +setlocal comments=s:{#,ex:#} +setlocal formatoptions+=tcqln +" setlocal formatlistpat=^\\s*\\d\\+\\.\\s\\+\\\|^[-*+]\\s\\+ + +let b:undo_ftplugin .= "|setl cms< com< fo<" + +" vim:set sw=2: diff --git a/syntax/twig.vim b/syntax/twig.vim new file mode 100644 index 0000000..af3c265 --- /dev/null +++ b/syntax/twig.vim @@ -0,0 +1,109 @@ +" Vim syntax file +" Language: Twig template +" Maintainer: Gabriel Gosselin +" Last Change: 2011 July 27 +" Version: 1.0 +" +" Based Jinja syntax by: Armin Ronacher +" +" Known Bugs: +" because of odd limitations dicts and the modulo operator +" appear wrong in the template. +" +" Changes: +" +" 2008 May 9: Added support for Jinja2 changes (new keyword rules) +" 2011 July 27: Changed all references of jinja tp twig + +syntax case match + +" Jinja template built-in tags and parameters (without filter, macro, is and raw, they +" have special threatment) +syn keyword twigStatement containedin=twigVarBlock,twigTagBlock,twigNested contained and if else in not or recursive as import + +syn keyword twigStatement containedin=twigVarBlock,twigTagBlock,twigNested contained is filter skipwhite nextgroup=twigFilter +syn keyword twigStatement containedin=twigTagBlock contained macro skipwhite nextgroup=twigFunction +syn keyword twigStatement containedin=twigTagBlock contained block skipwhite nextgroup=twigBlockName + +" Variable Names +syn match twigVariable containedin=twigVarBlock,twigTagBlock,twigNested contained skipwhite /[a-zA-Z_][a-zA-Z0-9_]*/ +syn keyword twigSpecial containedin=twigVarBlock,twigTagBlock,twigNested contained false true none loop super caller varargs kwargs + +" Filters +syn match twigOperator "|" containedin=twigVarBlock,twigTagBlock,twigNested contained nextgroup=twigFilter +syn match twigFilter contained skipwhite /[a-zA-Z_][a-zA-Z0-9_]*/ +syn match twigFunction contained skipwhite /[a-zA-Z_][a-zA-Z0-9_]*/ +syn match twigBlockName contained skipwhite /[a-zA-Z_][a-zA-Z0-9_]*/ + +" Jinja template constants +syn region twigString containedin=twigVarBlock,twigTagBlock,twigNested contained start=/"/ skip=/\\"/ end=/"/ +syn region twigString containedin=twigVarBlock,twigTagBlock,twigNested contained start=/'/ skip=/\\'/ end=/'/ +syn match twigNumber containedin=twigVarBlock,twigTagBlock,twigNested contained /[0-9]\+\(\.[0-9]\+\)\?/ + +" Operators +syn match twigOperator containedin=twigVarBlock,twigTagBlock,twigNested contained /[+\-*\/<>=!,:]/ +syn match twigPunctuation containedin=twigVarBlock,twigTagBlock,twigNested contained /[()\[\]]/ +syn match twigOperator containedin=twigVarBlock,twigTagBlock,twigNested contained /\./ nextgroup=twigAttribute +syn match twigAttribute contained /[a-zA-Z_][a-zA-Z0-9_]*/ + +" Jinja template tag and variable blocks +syn region twigNested matchgroup=twigOperator start="(" end=")" transparent display containedin=twigVarBlock,twigTagBlock,twigNested contained +syn region twigNested matchgroup=twigOperator start="\[" end="\]" transparent display containedin=twigVarBlock,twigTagBlock,twigNested contained +syn region twigNested matchgroup=twigOperator start="{" end="}" transparent display containedin=twigVarBlock,twigTagBlock,twigNested contained +syn region twigTagBlock matchgroup=twigTagDelim start=/{%-\?/ end=/-\?%}/ skipwhite containedin=ALLBUT,twigTagBlock,twigVarBlock,twigRaw,twigString,twigNested,twigComment + +syn region twigVarBlock matchgroup=twigVarDelim start=/{{-\?/ end=/-\?}}/ containedin=ALLBUT,twigTagBlock,twigVarBlock,twigRaw,twigString,twigNested,twigComment + +" Jinja template 'raw' tag +syn region twigRaw matchgroup=twigRawDelim start="{%\s*raw\s*%}" end="{%\s*endraw\s*%}" containedin=ALLBUT,twigTagBlock,twigVarBlock,twigString,twigComment + +" Jinja comments +syn region twigComment matchgroup=twigCommentDelim start="{#" end="#}" containedin=ALLBUT,twigTagBlock,twigVarBlock,twigString + +" Block start keywords. A bit tricker. We only highlight at the start of a +" tag block and only if the name is not followed by a comma or equals sign +" which usually means that we have to deal with an assignment. +syn match twigStatement containedin=twigTagBlock contained skipwhite /\({%-\?\s*\)\@<=\<[a-zA-Z_][a-zA-Z0-9_]*\>\(\s*[,=]\)\@!/ + +" and context modifiers +syn match twigStatement containedin=twigTagBlock contained /\/ skipwhite + + +" Define the default highlighting. +" For version 5.7 and earlier: only when not done already +" For version 5.8 and later: only when an item doesn't have highlighting yet +if version >= 508 || !exists("did_twig_syn_inits") + if version < 508 + let did_twig_syn_inits = 1 + command -nargs=+ HiLink hi link + else + command -nargs=+ HiLink hi def link + endif + + HiLink twigPunctuation twigOperator + HiLink twigAttribute twigVariable + HiLink twigFunction twigFilter + + HiLink twigTagDelim twigTagBlock + HiLink twigVarDelim twigVarBlock + HiLink twigCommentDelim twigComment + HiLink twigRawDelim twig + + HiLink twigSpecial Special + HiLink twigOperator Normal + HiLink twigRaw Normal + HiLink twigTagBlock PreProc + HiLink twigVarBlock PreProc + HiLink twigStatement Statement + HiLink twigFilter Function + HiLink twigBlockName Function + HiLink twigVariable Identifier + HiLink twigString Constant + HiLink twigNumber Constant + HiLink twigComment Comment + + delcommand HiLink +endif + +let b:current_syntax = "twig" +