diff options
| author | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-12 16:26:29 +0200 | 
|---|---|---|
| committer | Adam Stankiewicz <sheerun@sher.pl> | 2013-09-12 16:26:29 +0200 | 
| commit | 591d4d2517b86f6c4b88bf165fb9c01dcb861727 (patch) | |
| tree | 39f8cd5e5aa3bae95ceb78f153520f41a201fefb /indent | |
| parent | 9fa15ece8b6a08fe035669708db50ba76c93b2aa (diff) | |
| download | vim-polyglot-591d4d2517b86f6c4b88bf165fb9c01dcb861727.tar.gz vim-polyglot-591d4d2517b86f6c4b88bf165fb9c01dcb861727.zip | |
Add go language support
Diffstat (limited to 'indent')
| -rw-r--r-- | indent/go.vim | 65 | 
1 files changed, 65 insertions, 0 deletions
| diff --git a/indent/go.vim b/indent/go.vim new file mode 100644 index 00000000..faf4d79e --- /dev/null +++ b/indent/go.vim @@ -0,0 +1,65 @@ +" Copyright 2011 The Go Authors. All rights reserved. +" Use of this source code is governed by a BSD-style +" license that can be found in the LICENSE file. +" +" indent/go.vim: Vim indent file for Go. +" +" TODO: +" - function invocations split across lines +" - general line splits (line ends in an operator) + +if exists("b:did_indent") +    finish +endif +let b:did_indent = 1 + +" C indentation is too far off useful, mainly due to Go's := operator. +" Let's just define our own. +setlocal nolisp +setlocal autoindent +setlocal indentexpr=GoIndent(v:lnum) +setlocal indentkeys+=<:>,0=},0=) + +if exists("*GoIndent") +  finish +endif + +function! GoIndent(lnum) +  let prevlnum = prevnonblank(a:lnum-1) +  if prevlnum == 0 +    " top of file +    return 0 +  endif + +  " grab the previous and current line, stripping comments. +  let prevl = substitute(getline(prevlnum), '//.*$', '', '') +  let thisl = substitute(getline(a:lnum), '//.*$', '', '') +  let previ = indent(prevlnum) + +  let ind = previ + +  if prevl =~ '[({]\s*$' +    " previous line opened a block +    let ind += &sw +  endif +  if prevl =~# '^\s*\(case .*\|default\):$' +    " previous line is part of a switch statement +    let ind += &sw +  endif +  " TODO: handle if the previous line is a label. + +  if thisl =~ '^\s*[)}]' +    " this line closed a block +    let ind -= &sw +  endif + +  " Colons are tricky. +  " We want to outdent if it's part of a switch ("case foo:" or "default:"). +  " We ignore trying to deal with jump labels because (a) they're rare, and +  " (b) they're hard to disambiguate from a composite literal key. +  if thisl =~# '^\s*\(case .*\|default\):$' +    let ind -= &sw +  endif + +  return ind +endfunction | 
