neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

go.vim (1767B)


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