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