1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- " 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
|