neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

prolog.vim (1954B)


      1 "  vim: set sw=4 sts=4:
      2 "  Language:	Prolog
      3 "  Maintainer:	Gergely Kontra <kgergely@mcl.hu> (Invalid email address)
      4 " 		Doug Kearns <dougkearns@gmail.com>
      5 "  Revised on:	2002.02.18. 23:34:05
      6 "  Last change by: Takuya Fujiwara, 2018 Sep 23
      7 "		2022 April: b:undo_indent added by Doug Kearns
      8 
      9 " TODO:
     10 "   checking with respect to syntax highlighting
     11 "   ignoring multiline comments
     12 "   detecting multiline strings
     13 
     14 " Only load this indent file when no other was loaded.
     15 if exists("b:did_indent")
     16    finish
     17 endif
     18 
     19 let b:did_indent = 1
     20 
     21 setlocal indentexpr=GetPrologIndent()
     22 setlocal indentkeys-=:,0#
     23 setlocal indentkeys+=0%,-,0;,>,0)
     24 
     25 let b:undo_indent = "setl inde< indk<"
     26 
     27 " Only define the function once.
     28 "if exists("*GetPrologIndent")
     29 "    finish
     30 "endif
     31 
     32 function! GetPrologIndent()
     33    " Find a non-blank line above the current line.
     34    let pnum = prevnonblank(v:lnum - 1)
     35    " Hit the start of the file, use zero indent.
     36    if pnum == 0
     37       return 0
     38    endif
     39    let line = getline(v:lnum)
     40    let pline = getline(pnum)
     41 
     42    let ind = indent(pnum)
     43    " Previous line was comment -> use previous line's indent
     44    if pline =~ '^\s*%'
     45 return ind
     46    endif
     47    " Previous line was the start of block comment -> +1 after '/*' comment
     48    if pline =~ '^\s*/\*'
     49 return ind + 1
     50    endif
     51    " Previous line was the end of block comment -> -1 after '*/' comment
     52    if pline =~ '^\s*\*/'
     53 return ind - 1
     54    endif
     55    " Check for clause head on previous line
     56    if pline =~ '\%(:-\|-->\)\s*\(%.*\)\?$'
     57 let ind = ind + shiftwidth()
     58    " Check for end of clause on previous line
     59    elseif pline =~ '\.\s*\(%.*\)\?$'
     60 let ind = ind - shiftwidth()
     61    endif
     62    " Check for opening conditional on previous line
     63    if pline =~ '^\s*\([(;]\|->\)'
     64 let ind = ind + shiftwidth()
     65    endif
     66    " Check for closing an unclosed paren, or middle ; or ->
     67    if line =~ '^\s*\([);]\|->\)'
     68 let ind = ind - shiftwidth()
     69    endif
     70    return ind
     71 endfunction