xref: /vim-8.2.3635/runtime/indent/cs.vim (revision d47d5223)
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