blob: ddf003e2de40d1c0dfc9c6cf5b8d67d8db8cf593 [file] [log] [blame]
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00001" Vim indent file
Bram Moolenaar6e649222021-10-04 21:32:54 +01002" Language: ld(1) script
3" Maintainer: Doug Kearns <dougkearns@gmail.com>
4" Previous Maintainer: Nikolai Weibull <now@bitwi.se>
5" Last Change: 24 Sep 2021
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +00006
7if exists("b:did_indent")
8 finish
9endif
10let b:did_indent = 1
11
12setlocal indentexpr=GetLDIndent()
13setlocal indentkeys=0{,0},!^F,o,O
Bram Moolenaarcf0dfa22007-05-10 18:52:16 +000014setlocal nosmartindent
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000015
Bram Moolenaar6e649222021-10-04 21:32:54 +010016let b:undo_indent = "setl inde< indk< si<"
17
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000018if exists("*GetLDIndent")
19 finish
20endif
21
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000022function s:prevnonblanknoncomment(lnum)
23 let lnum = a:lnum
24 while lnum > 1
25 let lnum = prevnonblank(lnum)
26 let line = getline(lnum)
27 if line =~ '\*/'
28 while lnum > 1 && line !~ '/\*'
29 let lnum -= 1
30 endwhile
31 if line =~ '^\s*/\*'
32 let lnum -= 1
33 else
34 break
35 endif
36 else
37 break
38 endif
39 endwhile
40 return lnum
41endfunction
42
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000043function s:count_braces(lnum, count_open)
44 let n_open = 0
45 let n_close = 0
46 let line = getline(a:lnum)
47 let pattern = '[{}]'
48 let i = match(line, pattern)
49 while i != -1
50 if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)'
51 if line[i] == '{'
52 let n_open += 1
53 elseif line[i] == '}'
54 if n_open > 0
55 let n_open -= 1
56 else
57 let n_close += 1
58 endif
59 endif
60 endif
61 let i = match(line, pattern, i + 1)
62 endwhile
63 return a:count_open ? n_open : n_close
64endfunction
65
66function GetLDIndent()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000067 let line = getline(v:lnum)
68 if line =~ '^\s*\*'
69 return cindent(v:lnum)
70 elseif line =~ '^\s*}'
Bram Moolenaar036986f2017-03-16 17:41:02 +010071 return indent(v:lnum) - shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000072 endif
73
74 let pnum = s:prevnonblanknoncomment(v:lnum - 1)
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000075 if pnum == 0
76 return 0
77 endif
78
Bram Moolenaar036986f2017-03-16 17:41:02 +010079 let ind = indent(pnum) + s:count_braces(pnum, 1) * shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000080
81 let pline = getline(pnum)
82 if pline =~ '}\s*$'
Bram Moolenaar036986f2017-03-16 17:41:02 +010083 let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * shiftwidth()
Bram Moolenaar0dc065e2005-07-04 22:49:24 +000084 endif
85
86 return ind
Bram Moolenaar24bbcfe2005-06-28 23:32:02 +000087endfunction