mirror of
				https://github.com/neovim/neovim.git
				synced 2025-10-26 12:27:24 +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"
 | 
