12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- " Vim indent file
- " Language: C#
- " Maintainer: Nick Jensen <nickspoon@gmail.com>
- " Former Maintainers: Aquila Deus
- " Johannes Zellner <johannes@zellner.org>
- " Last Change: 2020-03-26
- " License: Vim (see :h license)
- " Repository: https://github.com/nickspoons/vim-cs
- if exists('b:did_indent')
- finish
- endif
- let b:did_indent = 1
- let s:save_cpo = &cpoptions
- set cpoptions&vim
- setlocal indentexpr=GetCSIndent(v:lnum)
- function! s:IsCompilerDirective(line)
- " Exclude #region and #endregion - these should be indented normally
- return a:line =~# '^\s*#' && !s:IsRegionDirective(a:line)
- endf
- function! s:IsRegionDirective(line)
- return a:line =~# '^\s*#\s*region' || a:line =~# '^\s*#\s*endregion'
- 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)
- if !s:IsCompilerDirective(line) && !s:IsRegionDirective(line)
- 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)
- return indent(lnum)
- elseif s:IsRegionDirective(this_line)
- return cindent(lnum)
- 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
|