postscr.vim (1679B)
1 " PostScript indent file 2 " Language: PostScript 3 " Maintainer: Mike Williams <mrw@eandem.co.uk> 4 " Last Change: 2022 Apr 06 5 6 " Only load this indent file when no other was loaded. 7 if exists("b:did_indent") 8 finish 9 endif 10 let b:did_indent = 1 11 12 setlocal indentexpr=PostscrIndentGet(v:lnum) 13 setlocal indentkeys+=0],0=>>,0=%%,0=end,0=restore,0=grestore indentkeys-=:,0#,e 14 15 let b:undo_indent = "setl inde< indk<" 16 17 " Catch multiple instantiations 18 if exists("*PostscrIndentGet") 19 finish 20 endif 21 22 function! 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*\(%.*\)\=$' 45 let ind = ind + shiftwidth() 46 endif 47 48 " Remove indent for popped dicts, and restores. 49 if pline =~ '\(end\|g\=restore\)\s*$' 50 let ind = ind - shiftwidth() 51 52 " Else handle immediate dedents of dicts, restores, and arrays. 53 elseif getline(a:lnum) =~ '\(end\|>>\|g\=restore\|}\|]\)' 54 let ind = ind - shiftwidth() 55 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 67 endfunction 68 69 " vim:sw=2