1"  Maintainer:	Paulo Moura <pmoura@logtalk.org>
2"  Revised on:	2008.06.02
3"  Language:	Logtalk
4
5" This Logtalk indent file is a modified version of the Prolog
6" indent file written by Gergely Kontra
7
8" Only load this indent file when no other was loaded.
9if exists("b:did_indent")
10	finish
11endif
12
13let b:did_indent = 1
14
15setlocal indentexpr=GetLogtalkIndent()
16setlocal indentkeys-=:,0#
17setlocal indentkeys+=0%,-,0;,>,0)
18
19" Only define the function once.
20if exists("*GetLogtalkIndent")
21	finish
22endif
23
24function! GetLogtalkIndent()
25	" Find a non-blank line above the current line.
26	let pnum = prevnonblank(v:lnum - 1)
27	" Hit the start of the file, use zero indent.
28	if pnum == 0
29		return 0
30	endif
31	let line = getline(v:lnum)
32	let pline = getline(pnum)
33
34	let ind = indent(pnum)
35	" Previous line was comment -> use previous line's indent
36	if pline =~ '^\s*%'
37		retu ind
38	endif
39	" Check for entity opening directive on previous line
40	if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$'
41		let ind = ind + &sw
42	" Check for clause head on previous line
43	elseif pline =~ ':-\s*\(%.*\)\?$'
44		let ind = ind + &sw
45	" Check for entity closing directive on previous line
46	elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$'
47		let ind = ind - &sw
48	" Check for end of clause on previous line
49	elseif pline =~ '\.\s*\(%.*\)\?$'
50		let ind = ind - &sw
51	endif
52	" Check for opening conditional on previous line
53	if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)'
54		let ind = ind + &sw
55	endif
56	" Check for closing an unclosed paren, or middle ; or ->
57	if line =~ '^\s*\([);]\|->\)'
58		let ind = ind - &sw
59	endif
60	return ind
61endfunction
62