blob: 8430ccf8b8fb4dec35c378e82df8cae39ec45242 [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" PostScript indent file
Bram Moolenaar6e649222021-10-04 21:32:54 +01002" Language: PostScript
Bram Moolenaar2d8ed022022-05-21 13:08:16 +01003" Maintainer: Mike Williams <mrw@eandem.co.uk>
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +01004" Last Change: 2022 Apr 06
5
Bram Moolenaar071d4272004-06-13 20:20:40 +00006" Only load this indent file when no other was loaded.
7if exists("b:did_indent")
8 finish
9endif
10let b:did_indent = 1
11
12setlocal indentexpr=PostscrIndentGet(v:lnum)
13setlocal indentkeys+=0],0=>>,0=%%,0=end,0=restore,0=grestore indentkeys-=:,0#,e
14
Bram Moolenaarcbaff5e2022-04-08 17:45:08 +010015let b:undo_indent = "setl inde< indk<"
16
Bram Moolenaar071d4272004-06-13 20:20:40 +000017" Catch multiple instantiations
18if exists("*PostscrIndentGet")
19 finish
20endif
21
22function! PostscrIndentGet(lnum)
23 " Find a non-empty non-comment line above the current line.
24 " Note: ignores DSC comments as well!
25 let lnum = a:lnum - 1
26 while lnum != 0
27 let lnum = prevnonblank(lnum)
28 if getline(lnum) !~ '^\s*%.*$'
29 break
30 endif
31 let lnum = lnum - 1
32 endwhile
33
34 " Hit the start of the file, use user indent.
35 if lnum == 0
36 return -1
37 endif
38
39 " Start with the indent of the previous line
40 let ind = indent(lnum)
41 let pline = getline(lnum)
42
43 " Indent for dicts, arrays, and saves with possible trailing comment
44 if pline =~ '\(begin\|<<\|g\=save\|{\|[\)\s*\(%.*\)\=$'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020045 let ind = ind + shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000046 endif
47
48 " Remove indent for popped dicts, and restores.
49 if pline =~ '\(end\|g\=restore\)\s*$'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020050 let ind = ind - shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000051
52 " Else handle immediate dedents of dicts, restores, and arrays.
53 elseif getline(a:lnum) =~ '\(end\|>>\|g\=restore\|}\|]\)'
Bram Moolenaar3ec574f2017-06-13 18:12:01 +020054 let ind = ind - shiftwidth()
Bram Moolenaar071d4272004-06-13 20:20:40 +000055
56 " Else handle DSC comments - always start of line.
57 elseif getline(a:lnum) =~ '^\s*%%'
58 let ind = 0
59 endif
60
61 " For now catch excessive left indents if they occur.
62 if ind < 0
63 let ind = -1
64 endif
65
66 return ind
67endfunction
68
69" vim:sw=2