1071d4279SBram Moolenaar" Vim indent file 2071d4279SBram Moolenaar" Language: Objective-C 3071d4279SBram Moolenaar" Maintainer: Kazunobu Kuriyama <[email protected]> 4071d4279SBram Moolenaar" Last Change: 2004 May 16 5071d4279SBram Moolenaar" 6071d4279SBram Moolenaar 7071d4279SBram Moolenaar 8071d4279SBram Moolenaar" Only load this indent file when no other was loaded. 9071d4279SBram Moolenaarif exists("b:did_indent") 10071d4279SBram Moolenaar finish 11071d4279SBram Moolenaarendif 12071d4279SBram Moolenaarlet b:did_indent = 1 13071d4279SBram Moolenaarsetlocal cindent 14071d4279SBram Moolenaar 15071d4279SBram Moolenaar" Set the function to do the work. 16071d4279SBram Moolenaarsetlocal indentexpr=GetObjCIndent() 17071d4279SBram Moolenaar 18*6c391a74SBram Moolenaar" To make a colon (:) suggest an indentation other than a goto/switch label, 19071d4279SBram Moolenaarsetlocal indentkeys-=: 20071d4279SBram Moolenaarsetlocal indentkeys+=<:> 21071d4279SBram Moolenaar 22071d4279SBram Moolenaar" Only define the function once. 23071d4279SBram Moolenaarif exists("*GetObjCIndent") 24071d4279SBram Moolenaar finish 25071d4279SBram Moolenaarendif 26071d4279SBram Moolenaar 27071d4279SBram Moolenaarfunction s:GetWidth(line, regexp) 28071d4279SBram Moolenaar let end = matchend(a:line, a:regexp) 29071d4279SBram Moolenaar let width = 0 30071d4279SBram Moolenaar let i = 0 31071d4279SBram Moolenaar while i < end 32071d4279SBram Moolenaar if a:line[i] != "\t" 33071d4279SBram Moolenaar let width = width + 1 34071d4279SBram Moolenaar else 35071d4279SBram Moolenaar let width = width + &ts - (width % &ts) 36071d4279SBram Moolenaar endif 37071d4279SBram Moolenaar let i = i + 1 38071d4279SBram Moolenaar endwhile 39071d4279SBram Moolenaar return width 40071d4279SBram Moolenaarendfunction 41071d4279SBram Moolenaar 42071d4279SBram Moolenaarfunction s:LeadingWhiteSpace(line) 43071d4279SBram Moolenaar let end = strlen(a:line) 44071d4279SBram Moolenaar let width = 0 45071d4279SBram Moolenaar let i = 0 46071d4279SBram Moolenaar while i < end 47071d4279SBram Moolenaar let char = a:line[i] 48071d4279SBram Moolenaar if char != " " && char != "\t" 49071d4279SBram Moolenaar break 50071d4279SBram Moolenaar endif 51071d4279SBram Moolenaar if char != "\t" 52071d4279SBram Moolenaar let width = width + 1 53071d4279SBram Moolenaar else 54071d4279SBram Moolenaar let width = width + &ts - (width % &ts) 55071d4279SBram Moolenaar endif 56071d4279SBram Moolenaar let i = i + 1 57071d4279SBram Moolenaar endwhile 58071d4279SBram Moolenaar return width 59071d4279SBram Moolenaarendfunction 60071d4279SBram Moolenaar 61071d4279SBram Moolenaar 62071d4279SBram Moolenaarfunction GetObjCIndent() 63071d4279SBram Moolenaar let theIndent = cindent(v:lnum) 64071d4279SBram Moolenaar 65071d4279SBram Moolenaar let prev_line = getline(v:lnum - 1) 66071d4279SBram Moolenaar let cur_line = getline(v:lnum) 67071d4279SBram Moolenaar 68071d4279SBram Moolenaar if prev_line !~# ":" || cur_line !~# ":" 69071d4279SBram Moolenaar return theIndent 70071d4279SBram Moolenaar endif 71071d4279SBram Moolenaar 72071d4279SBram Moolenaar if prev_line !~# ";" 73071d4279SBram Moolenaar let prev_colon_pos = s:GetWidth(prev_line, ":") 74071d4279SBram Moolenaar let delta = s:GetWidth(cur_line, ":") - s:LeadingWhiteSpace(cur_line) 75071d4279SBram Moolenaar let theIndent = prev_colon_pos - delta 76071d4279SBram Moolenaar endif 77071d4279SBram Moolenaar 78071d4279SBram Moolenaar return theIndent 79071d4279SBram Moolenaarendfunction 80