| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | " Vim indent file | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  | " Language:            C# | 
					
						
							|  |  |  | " Maintainer:          Nick Jensen <nickspoon@gmail.com> | 
					
						
							|  |  |  | " Former Maintainers:  Aquila Deus | 
					
						
							|  |  |  | "                      Johannes Zellner <johannes@zellner.org> | 
					
						
							|  |  |  | " Last Change:         2018-11-21 | 
					
						
							|  |  |  | " Filenames:           *.cs | 
					
						
							|  |  |  | " License:             Vim (see :h license) | 
					
						
							|  |  |  | " Repository:          https://github.com/nickspoons/vim-cs | 
					
						
							|  |  |  | " | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | " Only load this indent file when no other was loaded. | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  | if exists('b:did_indent') | 
					
						
							|  |  |  |   finish | 
					
						
							| 
									
										
										
										
											2004-06-13 20:20:40 +00:00
										 |  |  | endif | 
					
						
							|  |  |  | let b:did_indent = 1 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  | let s:save_cpo = &cpoptions | 
					
						
							|  |  |  | set cpoptions&vim | 
					
						
							| 
									
										
										
										
											2005-03-28 20:58:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-12-09 20:43:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | setlocal indentexpr=GetCSIndent(v:lnum) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! s:IsCompilerDirective(line) | 
					
						
							|  |  |  |   return a:line =~? '^\s*#' | 
					
						
							|  |  |  | endf | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! s:IsAttributeLine(line) | 
					
						
							|  |  |  |   return a:line =~? '^\s*\[[A-Za-z]' && a:line =~? '\]$' | 
					
						
							|  |  |  | endf | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! s:FindPreviousNonCompilerDirectiveLine(start_lnum) | 
					
						
							|  |  |  |   for delta in range(0, a:start_lnum) | 
					
						
							|  |  |  |     let lnum = a:start_lnum - delta | 
					
						
							|  |  |  |     let line = getline(lnum) | 
					
						
							|  |  |  |     let is_directive = s:IsCompilerDirective(line) | 
					
						
							|  |  |  |     if !is_directive | 
					
						
							|  |  |  |       return lnum | 
					
						
							|  |  |  |     endif | 
					
						
							|  |  |  |   endfor | 
					
						
							|  |  |  |   return 0 | 
					
						
							|  |  |  | endf | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function! GetCSIndent(lnum) abort | 
					
						
							|  |  |  |   " Hit the start of the file, use zero indent. | 
					
						
							|  |  |  |   if a:lnum == 0 | 
					
						
							|  |  |  |     return 0 | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let this_line = getline(a:lnum) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   " Compiler directives use zero indent if so configured. | 
					
						
							|  |  |  |   let is_first_col_macro = s:IsCompilerDirective(this_line) && stridx(&l:cinkeys, '0#') >= 0 | 
					
						
							|  |  |  |   if is_first_col_macro | 
					
						
							|  |  |  |     return cindent(a:lnum) | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let lnum = s:FindPreviousNonCompilerDirectiveLine(a:lnum - 1) | 
					
						
							|  |  |  |   let previous_code_line = getline(lnum) | 
					
						
							|  |  |  |   if s:IsAttributeLine(previous_code_line) | 
					
						
							|  |  |  |     let ind = indent(lnum) | 
					
						
							|  |  |  |     return ind | 
					
						
							|  |  |  |   else | 
					
						
							|  |  |  |     return cindent(a:lnum) | 
					
						
							|  |  |  |   endif | 
					
						
							|  |  |  | endfunction | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let b:undo_indent = 'setlocal indentexpr<' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | let &cpoptions = s:save_cpo | 
					
						
							|  |  |  | unlet s:save_cpo | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | " vim:et:sw=2:sts=2 |