forked from aniani/vim
		
	
		
			
	
	
		
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
		
		
			
		
	
	
			81 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			VimL
		
	
	
	
	
	
|   | " Vim filetype indent file | ||
|  | " Language: Zig | ||
|  | " Upstream: https://github.com/ziglang/zig.vim | ||
|  | 
 | ||
|  | " Only load this indent file when no other was loaded. | ||
|  | if exists("b:did_indent") | ||
|  |     finish | ||
|  | endif | ||
|  | let b:did_indent = 1 | ||
|  | 
 | ||
|  | if (!has("cindent") || !has("eval")) | ||
|  |     finish | ||
|  | endif | ||
|  | 
 | ||
|  | setlocal cindent | ||
|  | 
 | ||
|  | " L0 -> 0 indent for jump labels (i.e. case statement in c). | ||
|  | " j1 -> indenting for "javascript object declarations" | ||
|  | " J1 -> see j1 | ||
|  | " w1 -> starting a new line with `(` at the same indent as `(` | ||
|  | " m1 -> if `)` starts a line, match its indent with the first char of its | ||
|  | "       matching `(` line | ||
|  | " (s -> use one indent, when starting a new line after a trailing `(` | ||
|  | setlocal cinoptions=L0,m1,(s,j1,J1,l1 | ||
|  | 
 | ||
|  | " cinkeys: controls what keys trigger indent formatting | ||
|  | " 0{ -> { | ||
|  | " 0} -> } | ||
|  | " 0) -> ) | ||
|  | " 0] -> ] | ||
|  | " !^F -> make CTRL-F (^F) reindent the current line when typed | ||
|  | " o -> when <CR> or `o` is used | ||
|  | " O -> when the `O` command is used | ||
|  | setlocal cinkeys=0{,0},0),0],!^F,o,O | ||
|  | 
 | ||
|  | setlocal indentexpr=GetZigIndent(v:lnum) | ||
|  | 
 | ||
|  | let b:undo_indent = "setlocal cindent< cinkeys< cinoptions< indentexpr<" | ||
|  | 
 | ||
|  | function! GetZigIndent(lnum) | ||
|  |     let curretLineNum = a:lnum | ||
|  |     let currentLine = getline(a:lnum) | ||
|  | 
 | ||
|  |     " cindent doesn't handle multi-line strings properly, so force no indent | ||
|  |     if currentLine =~ '^\s*\\\\.*' | ||
|  |         return -1 | ||
|  |     endif | ||
|  | 
 | ||
|  |     let prevLineNum = prevnonblank(a:lnum-1) | ||
|  |     let prevLine = getline(prevLineNum) | ||
|  | 
 | ||
|  |     " for lines that look like | ||
|  |     "   }, | ||
|  |     "   }; | ||
|  |     " try treating them the same as a } | ||
|  |     if prevLine =~ '\v^\s*},$' | ||
|  |         if currentLine =~ '\v^\s*};$' || currentLine =~ '\v^\s*}$' | ||
|  |             return indent(prevLineNum) - 4 | ||
|  |         endif | ||
|  |         return indent(prevLineNum-1) - 4 | ||
|  |     endif | ||
|  |     if currentLine =~ '\v^\s*},$' | ||
|  |         return indent(prevLineNum) - 4 | ||
|  |     endif | ||
|  |     if currentLine =~ '\v^\s*};$' | ||
|  |         return indent(prevLineNum) - 4 | ||
|  |     endif | ||
|  | 
 | ||
|  | 
 | ||
|  |     " cindent doesn't handle this case correctly: | ||
|  |     " switch (1): { | ||
|  |     "   1 => true, | ||
|  |     "       ~ | ||
|  |     "       ^---- indents to here | ||
|  |     if prevLine =~ '.*=>.*,$' && currentLine !~ '.*}$' | ||
|  |        return indent(prevLineNum) | ||
|  |     endif | ||
|  | 
 | ||
|  |     return cindent(a:lnum) | ||
|  | endfunction |