blob: 0691cd237c8cc69be0c630387f11716d3c553eea [file] [log] [blame]
Bram Moolenaar071d4272004-06-13 20:20:40 +00001" PostScript indent file
Bram Moolenaar6e649222021-10-04 21:32:54 +01002" Language: PostScript
3" Maintainer: Mike Williams <mrw@netcomuk.co.uk> (Invalid email address)
4" Doug Kearns <dougkearns@gmail.com>
5" Last Change: 2nd July 2001
Bram Moolenaar071d4272004-06-13 20:20:40 +00006"
7
8" Only load this indent file when no other was loaded.
9if exists("b:did_indent")
10 finish
11endif
12let b:did_indent = 1
13
14setlocal indentexpr=PostscrIndentGet(v:lnum)
15setlocal indentkeys+=0],0=>>,0=%%,0=end,0=restore,0=grestore indentkeys-=:,0#,e
16
17" 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