1" Vim indent file 2" Language: hog (Snort.conf) 3" Maintainer: Victor Roemer, <[email protected]> 4" Last Change: Mar 7, 2013 5 6" Only load this indent file when no other was loaded. 7if exists("b:did_indent") 8 finish 9endif 10let b:did_indent = 1 11let b:undo_indent = 'setlocal smartindent< indentexpr< indentkeys<' 12 13setlocal nosmartindent 14setlocal indentexpr=GetHogIndent() 15setlocal indentkeys+=!^F,o,O,0# 16 17" Only define the function once. 18if exists("*GetHogIndent") 19 finish 20endif 21 22let s:cpo_save = &cpo 23set cpo&vim 24 25let s:syn_blocks = '\<SnortRuleTypeBody\>' 26 27function s:IsInBlock(lnum) 28 return synIDattr(synID(a:lnum, 1, 1), 'name') =~ s:syn_blocks 29endfunction 30 31function GetHogIndent() 32 let prevlnum = prevnonblank(v:lnum-1) 33 34 " Comment blocks have identical indent 35 if getline(v:lnum) =~ '^\s*#' && getline(prevlnum) =~ '^\s*#' 36 return indent(prevlnum) 37 endif 38 39 " Ignore comment lines when calculating indent 40 while getline(prevlnum) =~ '^\s*#' 41 let prevlnum = prevnonblank(prevlnum-1) 42 if !prevlnum 43 return previndent 44 endif 45 endwhile 46 47 " Continuation of a line that wasn't indented 48 let prevline = getline(prevlnum) 49 if prevline =~ '^\k\+.*\\\s*$' 50 return shiftwidth() 51 endif 52 53 " Continuation of a line that was indented 54 if prevline =~ '\k\+.*\\\s*$' 55 return indent(prevlnum) 56 endif 57 58 " Indent the next line if previous line contained a start of a block 59 " definition ('{' or '('). 60 if prevline =~ '^\k\+[^#]*{}\@!\s*$' " TODO || prevline =~ '^\k\+[^#]*()\@!\s*$' 61 return shiftwidth() 62 endif 63 64 " Match inside of a block 65 if s:IsInBlock(v:lnum) 66 if prevline =~ "^\k\+.*$" 67 return shiftwidth() 68 else 69 return indent(prevlnum) 70 endif 71 endif 72 73 return 0 74endfunction 75 76let &cpo = s:cpo_save 77unlet s:cpo_save 78