blob: a72a3a954816f07a3e84120c421d2ea891967daf [file] [log] [blame]
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00001" Vim indent file
Bram Moolenaar214641f2017-03-05 17:04:09 +01002" Language: ld(1) script
3" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
4" Latest Revision: 2006-12-20
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00005
6if exists("b:did_indent")
7 finish
8endif
9let b:did_indent = 1
10
11setlocal indentexpr=GetLDIndent()
12setlocal indentkeys=0{,0},!^F,o,O
Bram Moolenaarcf0dfa22007-05-10 18:52:16 +000013setlocal nosmartindent
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000014
15if exists("*GetLDIndent")
16 finish
17endif
18
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000019function s:prevnonblanknoncomment(lnum)
20 let lnum = a:lnum
21 while lnum > 1
22 let lnum = prevnonblank(lnum)
23 let line = getline(lnum)
24 if line =~ '\*/'
25 while lnum > 1 && line !~ '/\*'
26 let lnum -= 1
27 endwhile
28 if line =~ '^\s*/\*'
29 let lnum -= 1
30 else
31 break
32 endif
33 else
34 break
35 endif
36 endwhile
37 return lnum
38endfunction
39
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000040function s:count_braces(lnum, count_open)
41 let n_open = 0
42 let n_close = 0
43 let line = getline(a:lnum)
44 let pattern = '[{}]'
45 let i = match(line, pattern)
46 while i != -1
47 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)'
48 if line[i] == '{'
49 let n_open += 1
50 elseif line[i] == '}'
51 if n_open > 0
52 let n_open -= 1
53 else
54 let n_close += 1
55 endif
56 endif
57 endif
58 let i = match(line, pattern, i + 1)
59 endwhile
60 return a:count_open ? n_open : n_close
61endfunction
62
63function GetLDIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000064 let line = getline(v:lnum)
65 if line =~ '^\s*\*'
66 return cindent(v:lnum)
67 elseif line =~ '^\s*}'
Bram Moolenaar036986f2017-03-16 17:41:02 +010068 return indent(v:lnum) - shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000069 endif
70
71 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000072 if pnum == 0
73 return 0
74 endif
75
Bram Moolenaar036986f2017-03-16 17:41:02 +010076 let ind = indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000077
78 let pline = getline(pnum)
79 if pline =~ '}\s*$'
Bram Moolenaar036986f2017-03-16 17:41:02 +010080 let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000081 endif
82
83 return ind
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000084endfunction