forked from aniani/vim
		
	
		
			
	
	
		
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " Vim indent file | ||
|  | " Language:     Kotlin | ||
|  | " Maintainer:   Alexander Udalov | ||
|  | " URL:          https://github.com/udalov/kotlin-vim | ||
|  | " Last Change:  7 November 2021 | ||
|  | "               2023 Sep 17 by Vim Project (undo_indent) | ||
|  | 
 | ||
|  | if exists('b:did_indent') | ||
|  |     finish | ||
|  | endif | ||
|  | let b:did_indent = 1 | ||
|  | 
 | ||
|  | setlocal cinoptions& cinoptions+=j1,L0 | ||
|  | setlocal indentexpr=GetKotlinIndent() | ||
|  | setlocal indentkeys=0},0),!^F,o,O,e,<CR> | ||
|  | setlocal autoindent " TODO ? | ||
|  | 
 | ||
|  | let b:undo_indent = "setlocal autoindent< cinoptions< indentexpr< indentkeys<" | ||
|  | 
 | ||
|  | " TODO teach it to count bracket balance, etc. | ||
|  | function! GetKotlinIndent() | ||
|  |     if v:lnum == 0 | ||
|  |         return 0 | ||
|  |     endif | ||
|  | 
 | ||
|  |     let prev_num = prevnonblank(v:lnum - 1) | ||
|  |     let prev = getline(prev_num) | ||
|  |     let prev_indent = indent(prev_num) | ||
|  |     let cur = getline(v:lnum) | ||
|  | 
 | ||
|  |     if cur =~ '^\s*\*' | ||
|  |         return cindent(v:lnum) | ||
|  |     endif | ||
|  | 
 | ||
|  |     if prev =~ '^\s*\*/' | ||
|  |         let st = prev | ||
|  |         while st > 1 | ||
|  |             if getline(st) =~ '^\s*/\*' | ||
|  |                 break | ||
|  |             endif | ||
|  |             let st = st - 1 | ||
|  |         endwhile | ||
|  |         return indent(st) | ||
|  |     endif | ||
|  | 
 | ||
|  |     let prev_open_paren = prev =~ '^.*(\s*$' | ||
|  |     let cur_close_paren = cur =~ '^\s*).*$' | ||
|  |     let prev_open_brace = prev =~ '^.*\({\|->\)\s*$' | ||
|  |     let cur_close_brace = cur =~ '^\s*}.*$' | ||
|  | 
 | ||
|  |     if prev_open_paren && !cur_close_paren || prev_open_brace && !cur_close_brace | ||
|  |         return prev_indent + shiftwidth() | ||
|  |     endif | ||
|  | 
 | ||
|  |     if cur_close_paren && !prev_open_paren || cur_close_brace && !prev_open_brace | ||
|  |         return prev_indent - shiftwidth() | ||
|  |     endif | ||
|  | 
 | ||
|  |     return prev_indent | ||
|  | endfunction |