hamster.vim (1692B)
1 " Vim indent file 2 " Language: Hamster Script 3 " Version: 2.0.6.1 4 " Last Change: 2021 Oct 11 5 " Maintainer: David Fishburn <dfishburn dot vim at gmail dot com> 6 " Download: https://www.vim.org/scripts/script.php?script_id=1099 7 " 8 " 2.0.6.1 (Oct 2021) 9 " Added b:undo_indent 10 " Added cpo check 11 " 12 13 " Only load this indent file when no other was loaded. 14 if exists("b:did_indent") 15 finish 16 endif 17 let b:did_indent = 1 18 19 setlocal indentkeys+==~if,=~else,=~endif,=~endfor,=~endwhile 20 setlocal indentkeys+==~do,=~until,=~while,=~repeat,=~for,=~loop 21 setlocal indentkeys+==~sub,=~endsub 22 23 let b:undo_indent = "setl indentkeys<" 24 25 " Define the appropriate indent function but only once 26 setlocal indentexpr=HamGetFreeIndent() 27 if exists("*HamGetFreeIndent") 28 finish 29 endif 30 31 let s:keepcpo = &cpo 32 set cpo&vim 33 34 function HamGetIndent(lnum) 35 let ind = indent(a:lnum) 36 let prevline=getline(a:lnum) 37 38 " Add a shiftwidth to statements following if, else, elseif, 39 " case, select, default, do, until, while, for, start 40 if prevline =~? '^\s*\<\(if\|else\%(if\)\?\|for\|repeat\|do\|while\|sub\)\>' 41 let ind = ind + shiftwidth() 42 endif 43 44 " Subtract a shiftwidth from else, elseif, end(if|while|for), until 45 let line = getline(v:lnum) 46 if line =~? '^\s*\(else\|elseif\|loop\|until\|end\%(if\|while\|for\|sub\)\)\>' 47 let ind = ind - shiftwidth() 48 endif 49 50 return ind 51 endfunction 52 53 function HamGetFreeIndent() 54 " Find the previous non-blank line 55 let lnum = prevnonblank(v:lnum - 1) 56 57 " Use zero indent at the top of the file 58 if lnum == 0 59 return 0 60 endif 61 62 let ind=HamGetIndent(lnum) 63 return ind 64 endfunction 65 66 " Restore: 67 let &cpo = s:keepcpo 68 unlet s:keepcpo 69 70 " vim:sw=2 tw=80