patch 9.1.1188: runtime(tera): tera support can be improved
Problem: runtime(tera): tera support can be improved
Solution: update tera filetype plugin, include a tera syntax script
include tera syntax tests, update the filetype test,
update makemenu and synmenu vim scripts
(MuntasirSZN)
closes: #16830
Signed-off-by: MuntasirSZN <muntasir.joypurhat@gmail.com>
Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
committed by
Christian Brabandt
parent
9102ac11ab
commit
14da0fb2d8
96
runtime/syntax/tera.vim
Normal file
96
runtime/syntax/tera.vim
Normal file
@ -0,0 +1,96 @@
|
||||
" Vim syntax file
|
||||
" Language: Tera
|
||||
" Maintainer: Muntasir Mahmud <muntasir.joypurhat@gmail.com>
|
||||
" Last Change: 2025 Mar 09
|
||||
|
||||
if exists("b:current_syntax")
|
||||
finish
|
||||
endif
|
||||
|
||||
" Detect the underlying language based on filename pattern
|
||||
" For files like file.html.tera, we want to load html syntax
|
||||
let s:filename = expand("%:t")
|
||||
let s:dotpos = strridx(s:filename, '.', strridx(s:filename, '.tera') - 1)
|
||||
let s:underlying_filetype = ""
|
||||
|
||||
if s:dotpos != -1
|
||||
let s:underlying_ext = s:filename[s:dotpos+1:strridx(s:filename, '.tera')-1]
|
||||
if s:underlying_ext != "" && s:underlying_ext != "tera"
|
||||
let s:underlying_filetype = s:underlying_ext
|
||||
endif
|
||||
endif
|
||||
|
||||
" Load the underlying language syntax if detected
|
||||
if s:underlying_filetype != ""
|
||||
execute "runtime! syntax/" . s:underlying_filetype . ".vim"
|
||||
unlet! b:current_syntax
|
||||
else
|
||||
" Default to HTML if no specific language detected
|
||||
runtime! syntax/html.vim
|
||||
unlet! b:current_syntax
|
||||
endif
|
||||
|
||||
" Tera comment blocks: {# comment #}
|
||||
syn region teraCommentBlock start="{#" end="#}" contains=@Spell containedin=cssDefinition,cssStyle,htmlHead,htmlTitle
|
||||
|
||||
" Tera statements: {% if condition %}
|
||||
syn region teraStatement start="{%" end="%}" contains=teraKeyword,teraString,teraNumber,teraFunction,teraBoolean,teraFilter,teraOperator containedin=cssDefinition,cssStyle,htmlHead,htmlTitle
|
||||
|
||||
" Tera expressions: {{ variable }}
|
||||
syn region teraExpression start="{{" end="}}" contains=teraString,teraNumber,teraFunction,teraBoolean,teraFilter,teraOperator,teraIdentifier containedin=cssDefinition,cssStyle,htmlHead,htmlTitle
|
||||
|
||||
" Special handling for raw blocks - content inside shouldn't be processed
|
||||
syn region teraRawBlock start="{% raw %}" end="{% endraw %}" contains=TOP,teraCommentBlock,teraStatement,teraExpression
|
||||
|
||||
" Control structure keywords
|
||||
syn keyword teraKeyword contained if else elif endif for endfor in macro endmacro
|
||||
syn keyword teraKeyword contained block endblock extends include import set endset
|
||||
syn keyword teraKeyword contained break continue filter endfilter raw endraw with endwith
|
||||
|
||||
" Identifiers - define before operators for correct priority
|
||||
syn match teraIdentifier contained "\<\w\+\>"
|
||||
|
||||
" Operators used in expressions and statements
|
||||
syn match teraOperator contained "==\|!=\|>=\|<=\|>\|<\|+\|-\|*\|/"
|
||||
syn match teraOperator contained "{\@<!%}\@!" " Match % but not when part of {% or %}
|
||||
syn keyword teraOperator contained and or not is as
|
||||
|
||||
" Functions and filters
|
||||
syn match teraFunction contained "\<\w\+\ze("
|
||||
syn match teraFilter contained "|\_s*\w\+"
|
||||
|
||||
" String literals - both single and double quoted
|
||||
syn region teraString contained start=+"+ skip=+\\"+ end=+"+ contains=@Spell
|
||||
syn region teraString contained start=+'+ skip=+\\'+ end=+'+ contains=@Spell
|
||||
|
||||
" Numeric literals - both integer and float
|
||||
syn match teraNumber contained "\<\d\+\>"
|
||||
syn match teraNumber contained "\<\d\+\.\d\+\>"
|
||||
|
||||
" Boolean values
|
||||
syn keyword teraBoolean contained true false
|
||||
|
||||
" Highlighting links
|
||||
hi def link teraCommentBlock Comment
|
||||
hi def link teraKeyword Statement
|
||||
hi def link teraOperator Operator
|
||||
hi def link teraFunction Function
|
||||
hi def link teraIdentifier Identifier
|
||||
hi def link teraString String
|
||||
hi def link teraNumber Number
|
||||
hi def link teraBoolean Boolean
|
||||
hi def link teraFilter PreProc
|
||||
|
||||
" Special highlighting for blocks and expressions
|
||||
hi def link teraStatement PreProc
|
||||
hi def link teraExpression PreProc
|
||||
|
||||
" Clean up script-local variables
|
||||
unlet s:filename
|
||||
unlet s:dotpos
|
||||
if exists("s:underlying_ext")
|
||||
unlet s:underlying_ext
|
||||
endif
|
||||
unlet s:underlying_filetype
|
||||
|
||||
let b:current_syntax = "tera"
|
||||
Reference in New Issue
Block a user