dts.vim (1735B)
1 " Vim indent file 2 " Language: Device Tree 3 " Maintainer: Roland Hieber, Pengutronix <rhi@pengutronix.de> 4 " 5 if exists("b:did_indent") 6 finish 7 endif 8 let b:did_indent = 1 9 10 setlocal autoindent 11 setlocal nosmartindent 12 setlocal indentkeys=o,O,0},0<>>,!<Ctrl-F> 13 setlocal indentexpr=GetDTSIndent() 14 setlocal nolisp 15 16 let b:undo_indent = 'setl autoindent< smartindent< indentkeys< indentexpr< lisp<' 17 18 function GetDTSIndent() 19 let sw = shiftwidth() 20 let lnum = v:lnum 21 let line = getline(lnum) 22 let prevline = getline(prevnonblank(lnum-1)) 23 let prevind = indent(prevnonblank(lnum-1)) 24 25 if prevnonblank(lnum-1) < 1 26 return 0 27 endif 28 29 " Don't indent header and preprocessor directives 30 if line =~ '^\s*\(/dts-\|#\(include\|define\|undef\|warn\(ing\)\?\|error\|if\(n\?def\)\?\|else\|elif\|endif\)\)' 31 return 0 32 33 " Don't indent /node and &label blocks 34 elseif line =~ '^\s*[/&].\+{\s*$' 35 return 0 36 37 " Indent to matching bracket or remove one shiftwidth if line begins with } or > 38 elseif line =~ '^\s*[}>]' 39 " set cursor to closing bracket on current line 40 let col = matchend(line, '^\s*[>}]') 41 call cursor(lnum, col) 42 43 " determine bracket type, {} or <> 44 let pair = strpart('{}<>', stridx('}>', line[col-1]) * 2, 2) 45 46 " find matching bracket pair 47 let pairline = searchpair(pair[0], '', pair[1], 'bW') 48 49 if pairline > 0 50 return indent(pairline) 51 else 52 return prevind - sw 53 endif 54 55 " else, add one level of indent if line ends in { or < or = or , 56 elseif prevline =~ '[{<=,]$' 57 return prevind + sw 58 59 else 60 return prevind 61 endif 62 63 endfunction