summaryrefslogtreecommitdiffstats
path: root/indent
diff options
context:
space:
mode:
Diffstat (limited to 'indent')
-rw-r--r--indent/d.vim81
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