1071d4279SBram Moolenaar" Vim indent file 2071d4279SBram Moolenaar" Language: C# 3*d47d5223SBram Moolenaar" Maintainer: Nick Jensen <[email protected]> 4*d47d5223SBram Moolenaar" Former Maintainers: Aquila Deus 5*d47d5223SBram Moolenaar" Johannes Zellner <[email protected]> 6*d47d5223SBram Moolenaar" Last Change: 2018-11-21 7*d47d5223SBram Moolenaar" Filenames: *.cs 8*d47d5223SBram Moolenaar" License: Vim (see :h license) 9*d47d5223SBram Moolenaar" Repository: https://github.com/nickspoons/vim-cs 10*d47d5223SBram Moolenaar" 11071d4279SBram Moolenaar 12071d4279SBram Moolenaar" Only load this indent file when no other was loaded. 13*d47d5223SBram Moolenaarif exists('b:did_indent') 14071d4279SBram Moolenaar finish 15071d4279SBram Moolenaarendif 16071d4279SBram Moolenaarlet b:did_indent = 1 17071d4279SBram Moolenaar 18*d47d5223SBram Moolenaarlet s:save_cpo = &cpoptions 19*d47d5223SBram Moolenaarset cpoptions&vim 20582fd85bSBram Moolenaar 21*d47d5223SBram Moolenaar 22*d47d5223SBram Moolenaarsetlocal indentexpr=GetCSIndent(v:lnum) 23*d47d5223SBram Moolenaar 24*d47d5223SBram Moolenaarfunction! s:IsCompilerDirective(line) 25*d47d5223SBram Moolenaar return a:line =~? '^\s*#' 26*d47d5223SBram Moolenaarendf 27*d47d5223SBram Moolenaar 28*d47d5223SBram Moolenaarfunction! s:IsAttributeLine(line) 29*d47d5223SBram Moolenaar return a:line =~? '^\s*\[[A-Za-z]' && a:line =~? '\]$' 30*d47d5223SBram Moolenaarendf 31*d47d5223SBram Moolenaar 32*d47d5223SBram Moolenaarfunction! s:FindPreviousNonCompilerDirectiveLine(start_lnum) 33*d47d5223SBram Moolenaar for delta in range(0, a:start_lnum) 34*d47d5223SBram Moolenaar let lnum = a:start_lnum - delta 35*d47d5223SBram Moolenaar let line = getline(lnum) 36*d47d5223SBram Moolenaar let is_directive = s:IsCompilerDirective(line) 37*d47d5223SBram Moolenaar if !is_directive 38*d47d5223SBram Moolenaar return lnum 39*d47d5223SBram Moolenaar endif 40*d47d5223SBram Moolenaar endfor 41*d47d5223SBram Moolenaar return 0 42*d47d5223SBram Moolenaarendf 43*d47d5223SBram Moolenaar 44*d47d5223SBram Moolenaarfunction! GetCSIndent(lnum) abort 45*d47d5223SBram Moolenaar " Hit the start of the file, use zero indent. 46*d47d5223SBram Moolenaar if a:lnum == 0 47*d47d5223SBram Moolenaar return 0 48*d47d5223SBram Moolenaar endif 49*d47d5223SBram Moolenaar 50*d47d5223SBram Moolenaar let this_line = getline(a:lnum) 51*d47d5223SBram Moolenaar 52*d47d5223SBram Moolenaar " Compiler directives use zero indent if so configured. 53*d47d5223SBram Moolenaar let is_first_col_macro = s:IsCompilerDirective(this_line) && stridx(&l:cinkeys, '0#') >= 0 54*d47d5223SBram Moolenaar if is_first_col_macro 55*d47d5223SBram Moolenaar return cindent(a:lnum) 56*d47d5223SBram Moolenaar endif 57*d47d5223SBram Moolenaar 58*d47d5223SBram Moolenaar let lnum = s:FindPreviousNonCompilerDirectiveLine(a:lnum - 1) 59*d47d5223SBram Moolenaar let previous_code_line = getline(lnum) 60*d47d5223SBram Moolenaar if s:IsAttributeLine(previous_code_line) 61*d47d5223SBram Moolenaar let ind = indent(lnum) 62*d47d5223SBram Moolenaar return ind 63*d47d5223SBram Moolenaar else 64*d47d5223SBram Moolenaar return cindent(a:lnum) 65*d47d5223SBram Moolenaar endif 66*d47d5223SBram Moolenaarendfunction 67*d47d5223SBram Moolenaar 68*d47d5223SBram Moolenaarlet b:undo_indent = 'setlocal indentexpr<' 69*d47d5223SBram Moolenaar 70*d47d5223SBram Moolenaarlet &cpoptions = s:save_cpo 71*d47d5223SBram Moolenaarunlet s:save_cpo 72*d47d5223SBram Moolenaar 73*d47d5223SBram Moolenaar" vim:et:sw=2:sts=2 74