xref: /vim-8.2.3635/runtime/indent/prolog.vim (revision 6e649224)
1071d4279SBram Moolenaar"  vim: set sw=4 sts=4:
2071d4279SBram Moolenaar"  Language:	Prolog
3*6e649224SBram Moolenaar"  Maintainer:	Gergely Kontra <[email protected]> (Invalid email address)
4*6e649224SBram Moolenaar" 		Doug Kearns <[email protected]>
5*6e649224SBram Moolenaar"  Revised on:	2002.02.18. 23:34:05
695bafa29SBram Moolenaar"  Last change by: Takuya Fujiwara, 2018 Sep 23
7071d4279SBram Moolenaar
8071d4279SBram Moolenaar" TODO:
9071d4279SBram Moolenaar"   checking with respect to syntax highlighting
10071d4279SBram Moolenaar"   ignoring multiline comments
11071d4279SBram Moolenaar"   detecting multiline strings
12071d4279SBram Moolenaar
13071d4279SBram Moolenaar" Only load this indent file when no other was loaded.
14071d4279SBram Moolenaarif exists("b:did_indent")
15071d4279SBram Moolenaar    finish
16071d4279SBram Moolenaarendif
17071d4279SBram Moolenaar
18071d4279SBram Moolenaarlet b:did_indent = 1
19071d4279SBram Moolenaar
20071d4279SBram Moolenaarsetlocal indentexpr=GetPrologIndent()
21071d4279SBram Moolenaarsetlocal indentkeys-=:,0#
22071d4279SBram Moolenaarsetlocal indentkeys+=0%,-,0;,>,0)
23071d4279SBram Moolenaar
24071d4279SBram Moolenaar" Only define the function once.
25071d4279SBram Moolenaar"if exists("*GetPrologIndent")
26071d4279SBram Moolenaar"    finish
27071d4279SBram Moolenaar"endif
28071d4279SBram Moolenaar
29071d4279SBram Moolenaarfunction! GetPrologIndent()
30071d4279SBram Moolenaar    " Find a non-blank line above the current line.
31071d4279SBram Moolenaar    let pnum = prevnonblank(v:lnum - 1)
32071d4279SBram Moolenaar    " Hit the start of the file, use zero indent.
33071d4279SBram Moolenaar    if pnum == 0
34071d4279SBram Moolenaar       return 0
35071d4279SBram Moolenaar    endif
36071d4279SBram Moolenaar    let line = getline(v:lnum)
37071d4279SBram Moolenaar    let pline = getline(pnum)
38071d4279SBram Moolenaar
39071d4279SBram Moolenaar    let ind = indent(pnum)
40071d4279SBram Moolenaar    " Previous line was comment -> use previous line's indent
41071d4279SBram Moolenaar    if pline =~ '^\s*%'
4295bafa29SBram Moolenaar	return ind
4395bafa29SBram Moolenaar    endif
4495bafa29SBram Moolenaar    " Previous line was the start of block comment -> +1 after '/*' comment
4595bafa29SBram Moolenaar    if pline =~ '^\s*/\*'
4695bafa29SBram Moolenaar	return ind + 1
4795bafa29SBram Moolenaar    endif
4895bafa29SBram Moolenaar    " Previous line was the end of block comment -> -1 after '*/' comment
4995bafa29SBram Moolenaar    if pline =~ '^\s*\*/'
5095bafa29SBram Moolenaar	return ind - 1
51071d4279SBram Moolenaar    endif
52071d4279SBram Moolenaar    " Check for clause head on previous line
5395bafa29SBram Moolenaar    if pline =~ '\%(:-\|-->\)\s*\(%.*\)\?$'
543ec574f2SBram Moolenaar	let ind = ind + shiftwidth()
55071d4279SBram Moolenaar    " Check for end of clause on previous line
56071d4279SBram Moolenaar    elseif pline =~ '\.\s*\(%.*\)\?$'
573ec574f2SBram Moolenaar	let ind = ind - shiftwidth()
58071d4279SBram Moolenaar    endif
59071d4279SBram Moolenaar    " Check for opening conditional on previous line
60071d4279SBram Moolenaar    if pline =~ '^\s*\([(;]\|->\)'
613ec574f2SBram Moolenaar	let ind = ind + shiftwidth()
62071d4279SBram Moolenaar    endif
63071d4279SBram Moolenaar    " Check for closing an unclosed paren, or middle ; or ->
64071d4279SBram Moolenaar    if line =~ '^\s*\([);]\|->\)'
653ec574f2SBram Moolenaar	let ind = ind - shiftwidth()
66071d4279SBram Moolenaar    endif
67071d4279SBram Moolenaar    return ind
68071d4279SBram Moolenaarendfunction
69