diff runtime/indent/cs.vim @ 15131:bc1a8d21c811

Update runtime files. commit https://github.com/vim/vim/commit/d47d52232bf21036c5c89081458be7eaf2630d24 Author: Bram Moolenaar <Bram@vim.org> Date: Sun Dec 9 20:43:55 2018 +0100 Update runtime files.
author Bram Moolenaar <Bram@vim.org>
date Sun, 09 Dec 2018 20:45:05 +0100
parents fca8a9b65afa
children c58baa6d6dda
line wrap: on
line diff
--- a/runtime/indent/cs.vim
+++ b/runtime/indent/cs.vim
@@ -1,15 +1,73 @@
 " Vim indent file
-" Language:	C#
-" Maintainer:	Johannes Zellner <johannes@zellner.org>
-" Last Change:	Fri, 15 Mar 2002 07:53:54 CET
+" 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
+"
 
 " Only load this indent file when no other was loaded.
-if exists("b:did_indent")
-   finish
+if exists('b:did_indent')
+  finish
 endif
 let b:did_indent = 1
 
-" C# is like indenting C
-setlocal cindent
+let s:save_cpo = &cpoptions
+set cpoptions&vim
+
+
+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
 
-let b:undo_indent = "setl cin<"
+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