diff runtime/indent/logtalk.vim @ 5:db46d51a3939

Initial revision
author axmo
date Wed, 13 Aug 2008 17:36:09 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/runtime/indent/logtalk.vim	Wed Aug 13 17:36:09 2008 +0900
@@ -0,0 +1,61 @@
+"  Maintainer:	Paulo Moura <pmoura@logtalk.org>
+"  Revised on:	2008.06.02
+"  Language:	Logtalk
+
+" This Logtalk indent file is a modified version of the Prolog
+" indent file written by Gergely Kontra
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+	finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetLogtalkIndent()
+setlocal indentkeys-=:,0#
+setlocal indentkeys+=0%,-,0;,>,0)
+
+" Only define the function once.
+if exists("*GetLogtalkIndent")
+	finish
+endif
+
+function! GetLogtalkIndent()
+	" Find a non-blank line above the current line.
+	let pnum = prevnonblank(v:lnum - 1)
+	" Hit the start of the file, use zero indent.
+	if pnum == 0
+		return 0
+	endif
+	let line = getline(v:lnum)
+	let pline = getline(pnum)
+
+	let ind = indent(pnum)
+	" Previous line was comment -> use previous line's indent
+	if pline =~ '^\s*%'
+		retu ind
+	endif
+	" Check for entity opening directive on previous line
+	if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$'
+		let ind = ind + &sw
+	" Check for clause head on previous line
+	elseif pline =~ ':-\s*\(%.*\)\?$'
+		let ind = ind + &sw
+	" Check for entity closing directive on previous line
+	elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$'
+		let ind = ind - &sw
+	" Check for end of clause on previous line
+	elseif pline =~ '\.\s*\(%.*\)\?$'
+		let ind = ind - &sw
+	endif
+	" Check for opening conditional on previous line
+	if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)'
+		let ind = ind + &sw
+	endif
+	" Check for closing an unclosed paren, or middle ; or ->
+	if line =~ '^\s*\([);]\|->\)'
+		let ind = ind - &sw
+	endif
+	return ind
+endfunction