neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

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