From acd7ce59503b22ac7663fc25776efe25e266f1d4 Mon Sep 17 00:00:00 2001 From: Adam Stankiewicz Date: Tue, 10 Mar 2015 21:56:33 -0700 Subject: Update --- indent/typescript.vim | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 indent/typescript.vim (limited to 'indent/typescript.vim') diff --git a/indent/typescript.vim b/indent/typescript.vim new file mode 100644 index 00000000..f498298b --- /dev/null +++ b/indent/typescript.vim @@ -0,0 +1,79 @@ +" Vim indent file, taken from indent/java.vim +" Language: Typescript +" Maintainer: None! Wanna improve this? +" Last Change: 2015 Mar 07 + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +" Use javascript cindent options +setlocal cindent cinoptions& cinoptions+=j1,J1 +setlocal indentkeys& + +" Load typescript indent function +setlocal indentexpr=GetTypescriptIndent() + +let b:undo_indent = "setl cin< cino< indentkeys< indentexpr<" + +" Only define the function once +if exists("*GetTypescriptIndent") + finish +endif + +" Make sure we have vim capabilities +let s:keepcpo = &cpo +set cpo&vim + +function! TypescriptPrevNonBlankOrComment(lnum) + let pnum = prevnonblank(a:lnum) + " skip any comments (either `//`, `/*` or `*`) + while getline(pnum) =~ '^\s*\(\/\/\|\/\*\|\*\)' + let pnum = prevnonblank(pnum-1) + endwhile + return pnum +endfunction + +function GetTypescriptIndent() + + " default value: trust cindent + let ind = cindent(v:lnum) + + if getline(v:lnum) =~ '^\s*[{}\*]' + return ind + endif + + " The last non-empty line + let prev = TypescriptPrevNonBlankOrComment(v:lnum-1) + + " Check if the previous line consists of a single ` : ;` + " declaration (e.g. in interface definitions) + if getline(prev) =~ '^\s*\w\+\s*:[^{]\+;\s*$' + return indent(prev) + endif + + " Try to find out whether the last `}` ended a ` : {` block + if getline(prev) =~ '};\s*$' + " jump to matching `{` bracket + call cursor(prev, 1) + silent normal % + + " See if current line is type annotation without closing ';' but open + " `{` bracket + let lnum = line('.') + if getline(lnum) =~ '^\s*\w\+\s*:[^;]\+{' + let ind = indent(lnum) + endif + endif + + return ind + +endfunction + +" Restore compatibility mode +let &cpo = s:keepcpo +unlet s:keepcpo + +" vim: et -- cgit v1.2.3