xref: /vim-8.2.3635/runtime/indent/objc.vim (revision 6c391a74)
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