Home | History | Annotate | Download | only in indent
      1 " Vim indent file
      2 " Language:   llvm
      3 " Maintainer: The LLVM team, http://llvm.org/
      4 " What this indent plugin currently does:
      5 "  - If no other rule matches copy indent from previous non-empty,
      6 "    non-commented line
      7 "  - On '}' align the same as the line containing the matching '{'
      8 "  - If previous line ends with ':' increase indentation
      9 "  - If the current line ends with ':' indent at the same level as the
     10 "    enclosing '{'/'}' block
     11 " Stuff that would be nice to add:
     12 "  - Continue comments on next line
     13 "  - If there is an opening+unclosed parenthesis on previous line indent to that
     14 if exists("b:did_indent")
     15   finish
     16 endif
     17 let b:did_indent = 1
     18 
     19 setlocal shiftwidth=2 expandtab
     20 
     21 setlocal indentkeys=0{,0},<:>,!^F,o,O,e
     22 setlocal indentexpr=GetLLVMIndent()
     23 
     24 if exists("*GetLLVMIndent")
     25   finish
     26 endif
     27 
     28 function! FindOpenBrace(lnum)
     29   call cursor(a:lnum, 1)
     30   return searchpair('{', '', '}', 'bW')
     31 endfun
     32 
     33 function! GetLLVMIndent()
     34   " On '}' align the same as the line containing the matching '{'
     35   let thisline = getline(v:lnum)
     36   if thisline =~ '^\s*}'
     37     call cursor(v:lnum, 1)
     38     silent normal %
     39     let opening_lnum = line('.')
     40     if opening_lnum != v:lnum
     41       return indent(opening_lnum)
     42     endif
     43   endif
     44 
     45   " Indent labels the same as the current opening block
     46   if thisline =~ ':\s*$'
     47     let blockbegin = FindOpenBrace(v:lnum)
     48     if blockbegin > 0
     49       return indent(blockbegin)
     50     endif
     51   endif
     52 
     53   " Find a non-blank not-completely commented line above the current line.
     54   let prev_lnum = prevnonblank(v:lnum - 1)
     55   while prev_lnum > 0 && synIDattr(synID(prev_lnum, indent(prev_lnum)+1, 0), "name") =? "string\|comment"
     56     let prev_lnum = prevnonblank(prev_lnum-1)
     57   endwhile
     58   " Hit the start of the file, use zero indent.
     59   if prev_lnum == 0
     60     return 0
     61   endif
     62 
     63   let ind = indent(prev_lnum)
     64   let prevline = getline(prev_lnum)
     65 
     66   " Add a 'shiftwidth' after lines that start a block or labels
     67   if prevline =~ '{\s*$' || prevline =~ ':\s*$'
     68     let ind = ind + &shiftwidth
     69   endif
     70 
     71   return ind
     72 endfunction
     73