blob: 89f45356bafc3b991d47b93a57de2cb7f4429251 [file] [log] [blame]
Bram Moolenaar75ab5902022-04-18 15:36:40 +01001" Vim indent file
2" Language: Kuka Robot Language
3" Maintainer: Patrick Meiser-Knosowski <knosowski@graeffrobotics.de>
4" Version: 3.0.0
5" Last Change: 15. Apr 2022
6" Credits: Based on indent/vim.vim
7
8" Only load this indent file when no other was loaded.
9if exists("b:did_indent")
10 finish
11endif
12let b:did_indent = 1
13
14setlocal nolisp
15setlocal nocindent
16setlocal nosmartindent
17setlocal autoindent
18setlocal indentexpr=GetKrlIndent()
19setlocal indentkeys=!^F,o,O,=~end,0=~else,0=~case,0=~default,0=~until,0=~continue,=~part
20let b:undo_indent = "setlocal lisp< cindent< smartindent< autoindent< indentexpr< indentkeys<"
21
22if get(g:,'krlSpaceIndent',1)
23 " Use spaces, not tabs, for indention, 2 is enough.
24 " More or even tabs would waste valuable space on the teach pendant.
25 setlocal softtabstop=2
26 setlocal shiftwidth=2
27 setlocal expandtab
28 setlocal shiftround
29 let b:undo_indent = b:undo_indent." softtabstop< shiftwidth< expandtab< shiftround<"
30endif
31
32" Only define the function once.
33if exists("*GetKrlIndent")
34 finish
35endif
36let s:keepcpo = &cpo
37set cpo&vim
38
39function GetKrlIndent() abort
40
41 let currentLine = getline(v:lnum)
42 if currentLine =~? '\v^;(\s*(end)?fold>)@!' && !get(g:, 'krlCommentIndent', 0)
43 " If current line has a ; in column 1 and is no fold, keep zero indent.
Viktor Szépedbf749b2023-10-16 09:53:37 +020044 " This may be useful if code is commented out at the first column.
Bram Moolenaar75ab5902022-04-18 15:36:40 +010045 return 0
46 endif
47
48 " Find a non-blank line above the current line.
49 let preNoneBlankLineNum = s:KrlPreNoneBlank(v:lnum - 1)
50 if preNoneBlankLineNum == 0
51 " At the start of the file use zero indent.
52 return 0
53 endif
54
55 let preNoneBlankLine = getline(preNoneBlankLineNum)
56 let ind = indent(preNoneBlankLineNum)
57
58 " Define add 'shiftwidth' pattern
59 let addShiftwidthPattern = '\v^\s*('
60 if get(g:, 'krlIndentBetweenDef', 1)
61 let addShiftwidthPattern ..= '(global\s+)?def(fct|dat)?\s+\$?\w'
62 let addShiftwidthPattern ..= '|'
63 endif
64 let addShiftwidthPattern ..= 'if>|while>|for>|loop>'
65 let addShiftwidthPattern ..= '|else>'
66 let addShiftwidthPattern ..= '|case>|default>'
67 let addShiftwidthPattern ..= '|repeat>'
68 let addShiftwidthPattern ..= '|skip>|(ptp_)?spline>'
69 let addShiftwidthPattern ..= '|time_block\s+(start|part)>'
70 let addShiftwidthPattern ..= '|const_vel\s+start>'
71 let addShiftwidthPattern ..= ')'
72
73 " Define Subtract 'shiftwidth' pattern
74 let subtractShiftwidthPattern = '\v^\s*('
75 if get(g:, 'krlIndentBetweenDef', 1)
76 let subtractShiftwidthPattern ..= 'end(fct|dat)?>'
77 let subtractShiftwidthPattern ..= '|'
78 endif
79 let subtractShiftwidthPattern ..= 'end(if|while|for|loop)>'
80 let subtractShiftwidthPattern ..= '|else>'
81 let subtractShiftwidthPattern ..= '|case>|default>|endswitch>'
82 let subtractShiftwidthPattern ..= '|until>'
83 let subtractShiftwidthPattern ..= '|end(skip|spline)>'
84 let subtractShiftwidthPattern ..= '|time_block\s+(part|end)>'
85 let subtractShiftwidthPattern ..= '|const_vel\s+end>'
86 let subtractShiftwidthPattern ..= ')'
87
88 " Add shiftwidth
89 if preNoneBlankLine =~? addShiftwidthPattern
90 let ind += &sw
91 endif
92
93 " Subtract shiftwidth
94 if currentLine =~? subtractShiftwidthPattern
95 let ind = ind - &sw
96 endif
97
98 " First case after a switch gets the indent of the switch.
99 if currentLine =~? '\v^\s*case>'
100 \&& preNoneBlankLine =~? '\v^\s*switch>'
101 let ind = ind + &sw
102 endif
103
104 " align continue with the following instruction
105 if currentLine =~? '\v^\s*continue>'
106 \&& getline(v:lnum + 1) =~? subtractShiftwidthPattern
107 let ind = ind - &sw
108 endif
109
110 return ind
111endfunction
112
113" This function works almost like prevnonblank() but handles &-headers,
114" comments and continue instructions like blank lines
115function s:KrlPreNoneBlank(lnum) abort
116
117 let nPreNoneBlank = prevnonblank(a:lnum)
118
119 while nPreNoneBlank > 0 && getline(nPreNoneBlank) =~? '\v^\s*(\&\w\+|;|continue>)'
Viktor Szépedbf749b2023-10-16 09:53:37 +0200120 " Previous none blank line irrelevant. Look further aback.
Bram Moolenaar75ab5902022-04-18 15:36:40 +0100121 let nPreNoneBlank = prevnonblank(nPreNoneBlank - 1)
122 endwhile
123
124 return nPreNoneBlank
125endfunction
126
127let &cpo = s:keepcpo
128unlet s:keepcpo
129
130" vim:sw=2 sts=2 et