123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- " vim: set sw=4 sts=4:
- " Language: Prolog
- " Maintainer: Gergely Kontra <kgergely@mcl.hu> (Invalid email address)
- " Doug Kearns <dougkearns@gmail.com>
- " Revised on: 2002.02.18. 23:34:05
- " Last change by: Takuya Fujiwara, 2018 Sep 23
- " 2022 April: b:undo_indent added by Doug Kearns
- " TODO:
- " checking with respect to syntax highlighting
- " ignoring multiline comments
- " detecting multiline strings
- " Only load this indent file when no other was loaded.
- if exists("b:did_indent")
- finish
- endif
- let b:did_indent = 1
- setlocal indentexpr=GetPrologIndent()
- setlocal indentkeys-=:,0#
- setlocal indentkeys+=0%,-,0;,>,0)
- let b:undo_indent = "setl inde< indk<"
- " Only define the function once.
- "if exists("*GetPrologIndent")
- " finish
- "endif
- function! GetPrologIndent()
- " 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*%'
- return ind
- endif
- " Previous line was the start of block comment -> +1 after '/*' comment
- if pline =~ '^\s*/\*'
- return ind + 1
- endif
- " Previous line was the end of block comment -> -1 after '*/' comment
- if pline =~ '^\s*\*/'
- return ind - 1
- endif
- " Check for clause head on previous line
- if pline =~ '\%(:-\|-->\)\s*\(%.*\)\?$'
- 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*\([(;]\|->\)'
- 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
|