mirror of
				https://github.com/vim/vim.git
				synced 2025-10-30 09:47:20 -04:00 
			
		
		
		
	closes: #15234 Signed-off-by: Gregory Anders <greg@gpanders.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
		
			
				
	
	
		
			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
 |