xref: /vim-8.2.3635/runtime/indent/hamster.vim (revision 2286304c)
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.
14if exists("b:did_indent")
15  finish
16endif
17let b:did_indent = 1
18
19setlocal indentkeys+==~if,=~else,=~endif,=~endfor,=~endwhile
20setlocal indentkeys+==~do,=~until,=~while,=~repeat,=~for,=~loop
21setlocal indentkeys+==~sub,=~endsub
22
23let b:undo_indent = "setl indentkeys<"
24
25" Define the appropriate indent function but only once
26setlocal indentexpr=HamGetFreeIndent()
27if exists("*HamGetFreeIndent")
28  finish
29endif
30
31let s:keepcpo = &cpo
32set cpo&vim
33
34function 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
51endfunction
52
53function 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
64endfunction
65
66" Restore:
67let &cpo = s:keepcpo
68unlet s:keepcpo
69
70" vim:sw=2 tw=80
71