summaryrefslogtreecommitdiffstats
path: root/runtime/indent/logtalk.vim
diff options
context:
space:
mode:
Diffstat (limited to 'runtime/indent/logtalk.vim')
-rw-r--r--runtime/indent/logtalk.vim67
1 files changed, 67 insertions, 0 deletions
diff --git a/runtime/indent/logtalk.vim b/runtime/indent/logtalk.vim
new file mode 100644
index 0000000..f7a8b03
--- /dev/null
+++ b/runtime/indent/logtalk.vim
@@ -0,0 +1,67 @@
+" Maintainer: Paulo Moura <pmoura@logtalk.org>
+" Revised on: 2018.08.04
+" 2023 Aug 28 by Vim Project (undo_indent)
+" 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)
+
+let b:undo_indent = "setlocal indentexpr< indentkeys<"
+
+" 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 + shiftwidth()
+ " Check for clause head on previous line
+ elseif pline =~ ':-\s*\(%.*\)\?$'
+ let ind = ind + shiftwidth()
+ " Check for grammar rule head on previous line
+ elseif pline =~ '-->\s*\(%.*\)\?$'
+ let ind = ind + shiftwidth()
+ " Check for entity closing directive on previous line
+ elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$'
+ let ind = ind - shiftwidth()
+ " Check for end of clause on previous line
+ elseif pline =~ '\.\s*\(%.*\)\?$'
+ let ind = ind - shiftwidth()
+ endif
+ " Check for opening conditional on previous line
+ if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)'
+ let ind = ind + shiftwidth()
+ endif
+ " Check for closing an unclosed paren, or middle ; or ->
+ if line =~ '^\s*\([);]\|->\)'
+ let ind = ind - shiftwidth()
+ endif
+ return ind
+endfunction