diff options
Diffstat (limited to 'runtime/indent/krl.vim')
-rw-r--r-- | runtime/indent/krl.vim | 130 |
1 files changed, 130 insertions, 0 deletions
diff --git a/runtime/indent/krl.vim b/runtime/indent/krl.vim new file mode 100644 index 0000000..cc3cbd1 --- /dev/null +++ b/runtime/indent/krl.vim @@ -0,0 +1,130 @@ +" Vim indent file +" Language: Kuka Robot Language +" Maintainer: Patrick Meiser-Knosowski <knosowski@graeffrobotics.de> +" Version: 3.0.0 +" Last Change: 15. Apr 2022 +" Credits: Based on indent/vim.vim + +" Only load this indent file when no other was loaded. +if exists("b:did_indent") + finish +endif +let b:did_indent = 1 + +setlocal nolisp +setlocal nocindent +setlocal nosmartindent +setlocal autoindent +setlocal indentexpr=GetKrlIndent() +setlocal indentkeys=!^F,o,O,=~end,0=~else,0=~case,0=~default,0=~until,0=~continue,=~part +let b:undo_indent = "setlocal lisp< cindent< smartindent< autoindent< indentexpr< indentkeys<" + +if get(g:,'krlSpaceIndent',1) + " Use spaces, not tabs, for indention, 2 is enough. + " More or even tabs would waste valuable space on the teach pendant. + setlocal softtabstop=2 + setlocal shiftwidth=2 + setlocal expandtab + setlocal shiftround + let b:undo_indent = b:undo_indent." softtabstop< shiftwidth< expandtab< shiftround<" +endif + +" Only define the function once. +if exists("*GetKrlIndent") + finish +endif +let s:keepcpo = &cpo +set cpo&vim + +function GetKrlIndent() abort + + let currentLine = getline(v:lnum) + if currentLine =~? '\v^;(\s*(end)?fold>)@!' && !get(g:, 'krlCommentIndent', 0) + " If current line has a ; in column 1 and is no fold, keep zero indent. + " This may be usefull if code is commented out at the first column. + return 0 + endif + + " Find a non-blank line above the current line. + let preNoneBlankLineNum = s:KrlPreNoneBlank(v:lnum - 1) + if preNoneBlankLineNum == 0 + " At the start of the file use zero indent. + return 0 + endif + + let preNoneBlankLine = getline(preNoneBlankLineNum) + let ind = indent(preNoneBlankLineNum) + + " Define add 'shiftwidth' pattern + let addShiftwidthPattern = '\v^\s*(' + if get(g:, 'krlIndentBetweenDef', 1) + let addShiftwidthPattern ..= '(global\s+)?def(fct|dat)?\s+\$?\w' + let addShiftwidthPattern ..= '|' + endif + let addShiftwidthPattern ..= 'if>|while>|for>|loop>' + let addShiftwidthPattern ..= '|else>' + let addShiftwidthPattern ..= '|case>|default>' + let addShiftwidthPattern ..= '|repeat>' + let addShiftwidthPattern ..= '|skip>|(ptp_)?spline>' + let addShiftwidthPattern ..= '|time_block\s+(start|part)>' + let addShiftwidthPattern ..= '|const_vel\s+start>' + let addShiftwidthPattern ..= ')' + + " Define Subtract 'shiftwidth' pattern + let subtractShiftwidthPattern = '\v^\s*(' + if get(g:, 'krlIndentBetweenDef', 1) + let subtractShiftwidthPattern ..= 'end(fct|dat)?>' + let subtractShiftwidthPattern ..= '|' + endif + let subtractShiftwidthPattern ..= 'end(if|while|for|loop)>' + let subtractShiftwidthPattern ..= '|else>' + let subtractShiftwidthPattern ..= '|case>|default>|endswitch>' + let subtractShiftwidthPattern ..= '|until>' + let subtractShiftwidthPattern ..= '|end(skip|spline)>' + let subtractShiftwidthPattern ..= '|time_block\s+(part|end)>' + let subtractShiftwidthPattern ..= '|const_vel\s+end>' + let subtractShiftwidthPattern ..= ')' + + " Add shiftwidth + if preNoneBlankLine =~? addShiftwidthPattern + let ind += &sw + endif + + " Subtract shiftwidth + if currentLine =~? subtractShiftwidthPattern + let ind = ind - &sw + endif + + " First case after a switch gets the indent of the switch. + if currentLine =~? '\v^\s*case>' + \&& preNoneBlankLine =~? '\v^\s*switch>' + let ind = ind + &sw + endif + + " align continue with the following instruction + if currentLine =~? '\v^\s*continue>' + \&& getline(v:lnum + 1) =~? subtractShiftwidthPattern + let ind = ind - &sw + endif + + return ind +endfunction + +" This function works almost like prevnonblank() but handles &-headers, +" comments and continue instructions like blank lines +function s:KrlPreNoneBlank(lnum) abort + + let nPreNoneBlank = prevnonblank(a:lnum) + + while nPreNoneBlank > 0 && getline(nPreNoneBlank) =~? '\v^\s*(\&\w\+|;|continue>)' + " Previouse none blank line irrelevant. Look further aback. + let nPreNoneBlank = prevnonblank(nPreNoneBlank - 1) + endwhile + + return nPreNoneBlank +endfunction + +let &cpo = s:keepcpo +unlet s:keepcpo + +" vim:sw=2 sts=2 et |