mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	
		
			
	
	
		
			51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " Language:    Typst | ||
|  | " Maintainer:  Gregory Anders | ||
|  | " Last Change: 2024-07-14 | ||
|  | " Based on:    https://github.com/kaarmu/typst.vim | ||
|  | 
 | ||
|  | function! typst#indentexpr() abort | ||
|  |     let l:lnum = v:lnum | ||
|  |     let s:sw = shiftwidth() | ||
|  | 
 | ||
|  |     let [l:plnum, l:pline] = s:get_prev_nonblank(l:lnum - 1) | ||
|  |     if l:plnum == 0 | return 0 | endif | ||
|  | 
 | ||
|  |     let l:line = getline(l:lnum) | ||
|  |     let l:ind = indent(l:plnum) | ||
|  | 
 | ||
|  |     let l:synname = synIDattr(synID(l:lnum, 1, 1), 'name') | ||
|  | 
 | ||
|  |     " Use last indent for block comments | ||
|  |     if l:synname == 'typstCommentBlock' | ||
|  |         return l:ind | ||
|  |     endif | ||
|  | 
 | ||
|  |     if l:pline =~ '\v[{[(]\s*$' | ||
|  |         let l:ind += s:sw | ||
|  |     endif | ||
|  | 
 | ||
|  |     if l:line =~ '\v^\s*[}\])]' | ||
|  |         let l:ind -= s:sw | ||
|  |     endif | ||
|  | 
 | ||
|  |     return l:ind | ||
|  | endfunction | ||
|  | 
 | ||
|  | " Gets the previous non-blank line that is not a comment. | ||
|  | function! s:get_prev_nonblank(lnum) abort | ||
|  |     let l:lnum = prevnonblank(a:lnum) | ||
|  |     let l:line = getline(l:lnum) | ||
|  | 
 | ||
|  |     while l:lnum > 0 && l:line =~ '^\s*//' | ||
|  |         let l:lnum = prevnonblank(l:lnum - 1) | ||
|  |         let l:line = getline(l:lnum) | ||
|  |     endwhile | ||
|  | 
 | ||
|  |     return [l:lnum, s:remove_comments(l:line)] | ||
|  | endfunction | ||
|  | 
 | ||
|  | " Removes comments from the given line. | ||
|  | function! s:remove_comments(line) abort | ||
|  |     return substitute(a:line, '\s*//.*', '', '') | ||
|  | endfunction |