diff options
Diffstat (limited to 'indent')
-rw-r--r-- | indent/d.vim | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/indent/d.vim b/indent/d.vim new file mode 100644 index 00000000..13a6ddf8 --- /dev/null +++ b/indent/d.vim @@ -0,0 +1,81 @@ +if exists('g:polyglot_disabled') && index(g:polyglot_disabled, 'dlang') != -1 + finish +endif + +" Vim indent file for the D programming language (version 1.076 and 2.063). +" +" Language: D +" Maintainer: Jesse Phillips <Jesse.K.Phillips+D@gmail.com> +" Last Change: 2014 January 19 +" Version: 0.26 +" +" Please submit bugs/comments/suggestions to the github repo: +" https://github.com/JesseKPhillips/d.vim + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal cindent +setlocal indentkeys& indentkeys+=0=in indentkeys+=0=out indentkeys+=0=body +setlocal indentexpr=GetDIndent() + +if exists("*GetDIndent") + finish +endif + +function! SkipBlanksAndComments(startline) + let lnum = a:startline + while lnum > 1 + let lnum = prevnonblank(lnum) + if getline(lnum) =~ '[*+]/\s*$' + while getline(lnum) !~ '/[*+]' && lnum > 1 + let lnum = lnum - 1 + endwhile + if getline(lnum) =~ '^\s*/[*+]' + let lnum = lnum - 1 + else + break + endif + elseif getline(lnum) =~ '\s*//' + let lnum = lnum - 1 + else + break + endif + endwhile + return lnum +endfunction + +function GetDIndent() + let lnum = v:lnum + let line = getline(lnum) + let cind = cindent(lnum) + + " Align contract blocks with function signature. + if line =~ '^\s*\(body\|in\|out\)\>' + " Skip in/out parameters. + if getline(lnum - 1) =~ '[(,]\s*$' + return cind + endif + " Find the end of the last block or the function signature. + if line !~ '^\s*}' && getline(lnum - 1) !~ '(' + while lnum > 1 && getline(lnum - 1) !~ '[(}]' + let lnum = lnum - 1 + endwhile + endif + let lnum = SkipBlanksAndComments(lnum) + return cindent(lnum - 1) + endif + + " Align multiline array literals. e.g.: + " auto a = [ + " [ 1, 2, 3 ], + " [ 4, 5, 6 ], + if line =~ '^\s*\[' && getline(lnum - 1) =~ '^\s*\[' + return indent(lnum - 1) + endif + + return cind +endfunction |