diff options
Diffstat (limited to '')
| -rw-r--r-- | after/indent/objc.vim | 97 | 
1 files changed, 97 insertions, 0 deletions
| diff --git a/after/indent/objc.vim b/after/indent/objc.vim new file mode 100644 index 00000000..64c7e79c --- /dev/null +++ b/after/indent/objc.vim @@ -0,0 +1,97 @@ +if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'objc') == -1 +   +" Vim indent file +" Language:	Objective-C +" Maintainer:	Bjorn Winckler <bjorn.winckler@gmail.com> +" Last Change:	2012 Jan 01 + +" Ensure 'cpo' is set to Vim default values and restore later +let s:save_cpo = &cpo +set cpo&vim + +" Only load this indent file when no other was loaded. +"if exists("b:did_indent") +"    finish +"endif +"let b:did_indent = 1 +"setlocal cindent + +setl indentkeys=0{,0},:,0#,!^F,o,O,e,<:> + +setlocal indentexpr=GetObjCIndentImproved() + +" Top level statements which should not be indented, and which should not +" cause next (non-blank) line to be indented either. +let s:topLev = '^\s*@\%(class\|end\|implementation\|interface\|protocol\|\)\>' + +function! GetObjCIndentImproved() +  " NOTE: Ignore leading white space to avoid having to deal with space vs. +  " tab issues.  Rely on the indent() function instead. +  let thisLine = substitute(getline(v:lnum), '^\s*', '', '') + +  if thisLine =~# s:topLev || getline(prevnonblank(v:lnum - 1)) =~# s:topLev +    return 0 +  endif + +  " If current line looks like an argument to a message dispatch, then line +  " up colon with previous line.  This will indent the second line so that +  " the colons line up in +  " +  "   [obj firstParameter:value +  "                paramB:value2]; +  " +  " but it will not line up colons in +  " +  "   if ([obj something:here]) +  "       [obj other:here]; +  " +  let thisColon = match(thisLine, '^\s*\K\k*\zs:') +  if thisColon > 0 +    let prevLine = substitute(getline(v:lnum - 1), '^\s*', '', '') +    let prevColon = match(prevLine, ':') +    if prevColon > 0 +      " Try to align colons, always making sure line is indented at least +      " one shiftwidth more than the indentation at the beginning of the +      " message.  Avoids situations like this: +      " +      "     if ([obj a:x +      "  aLongParameter:y]) +      " +      let [lnum,lcol] = searchpairpos('\[', '', '\]', 'b', 0, +            \ max([1, v:lnum - 10])) +      let minInd = &sw + (lnum > 0 ? indent(lnum) : 0) +      let alignedInd = indent(v:lnum - 1) + prevColon - thisColon +      return alignedInd > minInd ? alignedInd : minInd +    endif +  endif + +  let prevLnum = v:lnum - 1 +  let ind      = indent(prevLnum) + +  " Indent one shiftwidth after opening block, e.g.: +  " +  "   call_func_with_block(param, ^{ +  "       do_stuff(); +  "   }); +  " +  let blockPat = '\^\s*\(([^)]*)\)\?\s*{$' +  if thisLine =~ '^}' +    norm '^%' +    if getline(".") =~ blockPat +      return indent(".") +    endif +  endif + +  if getline(prevLnum) =~ blockPat +    return ind + &sw +  endif + +  return cindent(v:lnum) +endfunction + + +" Restore 'cpo' options +let &cpo = s:save_cpo +unlet s:save_cpo + +endif | 
