blob: bf9ff75e6c6ca6eb7efd6016390a13db298f6b9e [file] [log] [blame]
Bram Moolenaarfb539272014-08-22 19:21:47 +02001" Vim indent file
2" Language: Go
3" Maintainer: David Barnett (https://github.com/google/vim-ft-go)
Bram Moolenaar3ec574f2017-06-13 18:12:01 +02004" Last Change: 2017 Jun 13
Bram Moolenaarfb539272014-08-22 19:21:47 +02005"
6" TODO:
7" - function invocations split across lines
8" - general line splits (line ends in an operator)
9
10if exists('b:did_indent')
11 finish
12endif
13let b:did_indent = 1
14
15" C indentation is too far off useful, mainly due to Go's := operator.
16" Let's just define our own.
17setlocal nolisp
18setlocal autoindent
19setlocal indentexpr=GoIndent(v:lnum)
20setlocal indentkeys+=<:>,0=},0=)
21
22if exists('*GoIndent')
23 finish
24endif
25
Bram Moolenaarfb539272014-08-22 19:21:47 +020026function! GoIndent(lnum)
27 let l:prevlnum = prevnonblank(a:lnum-1)
28 if l:prevlnum == 0
29 " top of file
30 return 0
31 endif
32
33 " grab the previous and current line, stripping comments.
34 let l:prevl = substitute(getline(l:prevlnum), '//.*$', '', '')
35 let l:thisl = substitute(getline(a:lnum), '//.*$', '', '')
36 let l:previ = indent(l:prevlnum)
37
38 let l:ind = l:previ
39
40 if l:prevl =~ '[({]\s*$'
41 " previous line opened a block
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020042 let l:ind += shiftwidth()
Bram Moolenaarfb539272014-08-22 19:21:47 +020043 endif
44 if l:prevl =~# '^\s*\(case .*\|default\):$'
45 " previous line is part of a switch statement
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020046 let l:ind += shiftwidth()
Bram Moolenaarfb539272014-08-22 19:21:47 +020047 endif
48 " TODO: handle if the previous line is a label.
49
50 if l:thisl =~ '^\s*[)}]'
51 " this line closed a block
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020052 let l:ind -= shiftwidth()
Bram Moolenaarfb539272014-08-22 19:21:47 +020053 endif
54
55 " Colons are tricky.
56 " We want to outdent if it's part of a switch ("case foo:" or "default:").
57 " We ignore trying to deal with jump labels because (a) they're rare, and
58 " (b) they're hard to disambiguate from a composite literal key.
59 if l:thisl =~# '^\s*\(case .*\|default\):$'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020060 let l:ind -= shiftwidth()
Bram Moolenaarfb539272014-08-22 19:21:47 +020061 endif
62
63 return l:ind
64endfunction
65
66" vim: sw=2 sts=2 et