home *** CD-ROM | disk | FTP | other *** search
/ vim.ftp.fu-berlin.de / 2015-02-03.vim.ftp.fu-berlin.de.tar / vim.ftp.fu-berlin.de / runtime / indent / logtalk.vim < prev    next >
Encoding:
Text File  |  2010-08-15  |  1.7 KB  |  62 lines

  1. "  Maintainer:    Paulo Moura <pmoura@logtalk.org>
  2. "  Revised on:    2008.06.02
  3. "  Language:    Logtalk
  4.  
  5. " This Logtalk indent file is a modified version of the Prolog
  6. " indent file written by Gergely Kontra
  7.  
  8. " Only load this indent file when no other was loaded.
  9. if exists("b:did_indent")
  10.     finish
  11. endif
  12.  
  13. let b:did_indent = 1
  14.  
  15. setlocal indentexpr=GetLogtalkIndent()
  16. setlocal indentkeys-=:,0#
  17. setlocal indentkeys+=0%,-,0;,>,0)
  18.  
  19. " Only define the function once.
  20. if exists("*GetLogtalkIndent")
  21.     finish
  22. endif
  23.  
  24. function! GetLogtalkIndent()
  25.     " Find a non-blank line above the current line.
  26.     let pnum = prevnonblank(v:lnum - 1)
  27.     " Hit the start of the file, use zero indent.
  28.     if pnum == 0
  29.         return 0
  30.     endif
  31.     let line = getline(v:lnum)
  32.     let pline = getline(pnum)
  33.  
  34.     let ind = indent(pnum)
  35.     " Previous line was comment -> use previous line's indent
  36.     if pline =~ '^\s*%'
  37.         retu ind
  38.     endif
  39.     " Check for entity opening directive on previous line
  40.     if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$'
  41.         let ind = ind + &sw
  42.     " Check for clause head on previous line
  43.     elseif pline =~ ':-\s*\(%.*\)\?$'
  44.         let ind = ind + &sw
  45.     " Check for entity closing directive on previous line
  46.     elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$'
  47.         let ind = ind - &sw
  48.     " Check for end of clause on previous line
  49.     elseif pline =~ '\.\s*\(%.*\)\?$'
  50.         let ind = ind - &sw
  51.     endif
  52.     " Check for opening conditional on previous line
  53.     if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)'
  54.         let ind = ind + &sw
  55.     endif
  56.     " Check for closing an unclosed paren, or middle ; or ->
  57.     if line =~ '^\s*\([);]\|->\)'
  58.         let ind = ind - &sw
  59.     endif
  60.     return ind
  61. endfunction
  62.