objc.vim (1688B)
1 " Vim indent file 2 " Language: Objective-C 3 " Maintainer: Kazunobu Kuriyama <kazunobu.kuriyama@nifty.com> 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 setlocal cindent 12 13 " Set the function to do the work. 14 setlocal indentexpr=GetObjCIndent() 15 16 " To make a colon (:) suggest an indentation other than a goto/switch label, 17 setlocal indentkeys-=: 18 setlocal indentkeys+=<:> 19 20 let b:undo_indent = "setl cin< inde< indk<" 21 22 " Only define the function once. 23 if exists("*GetObjCIndent") 24 finish 25 endif 26 27 function s:GetWidth(line, regexp) 28 let end = matchend(a:line, a:regexp) 29 let width = 0 30 let i = 0 31 while i < end 32 if a:line[i] != "\t" 33 let width = width + 1 34 else 35 let width = width + &ts - (width % &ts) 36 endif 37 let i = i + 1 38 endwhile 39 return width 40 endfunction 41 42 function s:LeadingWhiteSpace(line) 43 let end = strlen(a:line) 44 let width = 0 45 let i = 0 46 while i < end 47 let char = a:line[i] 48 if char != " " && char != "\t" 49 break 50 endif 51 if char != "\t" 52 let width = width + 1 53 else 54 let width = width + &ts - (width % &ts) 55 endif 56 let i = i + 1 57 endwhile 58 return width 59 endfunction 60 61 62 function GetObjCIndent() 63 let theIndent = cindent(v:lnum) 64 65 let prev_line = getline(v:lnum - 1) 66 let cur_line = getline(v:lnum) 67 68 if prev_line !~# ":" || cur_line !~# ":" 69 return theIndent 70 endif 71 72 if prev_line !~# ";" 73 let prev_colon_pos = s:GetWidth(prev_line, ":") 74 let delta = s:GetWidth(cur_line, ":") - s:LeadingWhiteSpace(cur_line) 75 let theIndent = prev_colon_pos - delta 76 endif 77 78 return theIndent 79 endfunction