mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
" Vim syntax file
 | 
						|
" Language:	Tera
 | 
						|
" Maintainer:	Muntasir Mahmud <muntasir.joypurhat@gmail.com>
 | 
						|
" Last Change:	2025 Mar 11
 | 
						|
 | 
						|
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
 | 
						|
 | 
						|
" Tera statements: {% if condition %}
 | 
						|
syn region teraStatement start="{%" end="%}" contains=teraKeyword,teraString,teraNumber,teraFunction,teraBoolean,teraFilter,teraOperator
 | 
						|
 | 
						|
" Tera expressions: {{ variable }}
 | 
						|
syn region teraExpression start="{{" end="}}" contains=teraString,teraNumber,teraFunction,teraBoolean,teraFilter,teraOperator,teraIdentifier
 | 
						|
 | 
						|
" 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
 | 
						|
 | 
						|
" 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 Function
 | 
						|
hi def link teraStatement Statement
 | 
						|
hi def link teraExpression Statement
 | 
						|
 | 
						|
" 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"
 |