File: gap_indent.vim

package info (click to toggle)
gap 4r7p5-2
  • links: PTS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 29,272 kB
  • ctags: 7,129
  • sloc: ansic: 107,802; xml: 46,868; sh: 3,548; perl: 2,329; makefile: 740; python: 94; asm: 62; awk: 6
file content (88 lines) | stat: -rw-r--r-- 2,910 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
" GAP indent file
" Language:	GAP  (http://www.gap-system.org)
" Maintainer:	Frank Lübeck (Frank.Luebeck@Math.RWTH-Aachen.De)
" Comments: 
" --  started from Matlab indent file in vim 6.0
" --  Many people like a 4 blank indentation, I prefer 2 blanks: this can
"     be adjusted by setting `GAPIndentShift' to 4, 2 (default) or whatever
"     you like
" TODO: nice handling of `continuation' lines 

" Only load this indent file when no other was loaded.
if exists("b:did_indent")
finish
endif
let b:did_indent = 1

" Some preliminary setting
setlocal nolisp		" Make sure lisp indenting doesn't supersede us

setlocal autoindent
setlocal indentexpr=GetGAPIndent(v:lnum)
setlocal indentkeys=o,O=end,=fi,=else,=elif,=od,=\)
let GAPIndentShift = 2

" Only define the function once.
if exists("*GetGAPIndent")
finish
endif

" this function computes for line lnum of the current buffer the number of
" blanks for the indentation
function! GetGAPIndent(lnum)
    " Give up if this line is explicitly joined.
    if getline(a:lnum - 1) =~ '\\$'
      return -1
    endif

    " Search backwards for the first non-empty line.
    let plnum = a:lnum - 1
    while plnum > 0 && getline(plnum) =~ '^\s*$'
      let plnum = plnum - 1
    endwhile

    if plnum == 0
      " This is the first non-empty line, use zero indent.
      return 0
    endif

    let curind = indent(plnum)

    " If the current line is a stop-block statement...
    if getline(v:lnum) =~ '^\s*\(end\|else\|elif\|fi\|od\|until\)\>'
      " See if this line does not follow the line right after an openblock
      if getline(plnum) =~ '^\s*\(for\|if\|then\|else\|elif\|while\|repeat\)\>'
      " See if the user has already dedented
      elseif indent(v:lnum) > curind - g:GAPIndentShift
        " If not, recommend one dedent
          let curind = curind - g:GAPIndentShift
      else
        " Otherwise, trust the user
        return -1
      endif

    " If the previous line opened a block
    elseif (getline(plnum) =~ '^\s*\(for\|if\|then\|else\|elif\|while\|repeat\)\>' || getline(plnum) =~ '\<function\> *(')
      " See if the user has already indented, or if block is also finished
      " im plnum
      if (indent(v:lnum) < curind + g:GAPIndentShift && getline(plnum) !~ '\<\(end\|fi\|od\)\>')
        "If not, recommend indent
        let curind = curind + g:GAPIndentShift
      else
        " Otherwise, trust the user
        return -1
      endif
    " Handle assignments over several lines
    elseif (getline(plnum) =~ '^\s*[a-zA-Z0-9]*\s*:=[^;]*$')
      let curind = match(getline(plnum), ':=') + 3
    " Handle continuing function calls over several lines
    elseif (getline(plnum) =~ '^\s*[a-zA-Z0-9]*\s*([^;]*$')
      let curind = indent(plnum) + 2*GAPIndentShift;
    endif

    " If we got to here, it means that the user takes the standard version, 
    " so we return it
    return curind
endfunction

" vim:sw=2