123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 |
- " 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
|