blob: ae5c3fdedd764a215dfbd943f4ac302befd30041 [file] [log] [blame]
Bram Moolenaarc81e5e72007-05-05 18:24:42 +00001" Vim indent file
2" Language: Hamster Script
Bram Moolenaar22863042021-10-16 15:23:36 +01003" 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"
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000012
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
Bram Moolenaar22863042021-10-16 15:23:36 +010023let b:undo_indent = "setl indentkeys<"
24
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000025" Define the appropriate indent function but only once
26setlocal indentexpr=HamGetFreeIndent()
27if exists("*HamGetFreeIndent")
28 finish
29endif
30
Bram Moolenaar22863042021-10-16 15:23:36 +010031let s:keepcpo = &cpo
32set cpo&vim
33
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000034function 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\)\>'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020041 let ind = ind + shiftwidth()
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000042 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\)\)\>'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020047 let ind = ind - shiftwidth()
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000048 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
Bram Moolenaar22863042021-10-16 15:23:36 +010066" Restore:
67let &cpo = s:keepcpo
68unlet s:keepcpo
69
Bram Moolenaarc81e5e72007-05-05 18:24:42 +000070" vim:sw=2 tw=80