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 / falcon.vim < prev    next >
Encoding:
Text File  |  2012-05-31  |  4.5 KB  |  160 lines

  1. " Vim indent file
  2. " Language: Falcon
  3. " Maintainer: Steven Oliver <oliver.steven@gmail.com>
  4. " Website: https://steveno@github.com/steveno/falconpl-vim.git
  5. " Credits: Thanks to the ruby.vim authors, I borrow a lot!
  6. " Previous Maintainer: Brent A. Fulgham <bfulgham@debian.org>
  7. " -----------------------------------------------------------
  8. " GetLatestVimScripts: 2752 1 :AutoInstall: falcon.vim
  9.  
  10. "======================================
  11. "       SETUP
  12. "======================================
  13.  
  14. " Only load this indent file when no other was loaded.
  15. if exists("b:did_indent")
  16.     finish
  17. endif
  18. let b:did_indent = 1
  19.  
  20. setlocal nosmartindent
  21.  
  22. " Setup indent function and when to use it
  23. setlocal indentexpr=FalconGetIndent()
  24. setlocal indentkeys=0{,0},0),0],!^F,o,O,e
  25. setlocal indentkeys+==~case,=~catch,=~default,=~elif,=~else,=~end,=~\"
  26.  
  27. " Define the appropriate indent function but only once
  28. if exists("*FalconGetIndent")
  29.     finish
  30. endif
  31.  
  32. let s:cpo_save = &cpo
  33. set cpo&vim
  34.  
  35. "======================================
  36. "       VARIABLES
  37. "======================================
  38.  
  39. " Regex of syntax group names that are strings AND comments
  40. let s:syng_strcom = '\<falcon\%(String\|StringEscape\|Comment\)\>'
  41.  
  42. " Regex of syntax group names that are strings
  43. let s:syng_string = '\<falcon\%(String\|StringEscape\)\>'
  44.  
  45. " Keywords to indent on
  46. let s:falcon_indent_keywords = '^\s*\(case\|catch\|class\|enum\|default\|elif\|else' .
  47.     \ '\|for\|function\|if.*"[^"]*:.*"\|if \(\(:\)\@!.\)*$\|loop\|object\|select' .
  48.     \ '\|switch\|try\|while\|\w*\s*=\s*\w*([$\)'
  49.  
  50. " Keywords to deindent on
  51. let s:falcon_deindent_keywords = '^\s*\(case\|catch\|default\|elif\|else\|end\)'
  52.  
  53. "======================================
  54. "       FUNCTIONS
  55. "======================================
  56.  
  57. " Check if the character at lnum:col is inside a string
  58. function s:IsInStringOrComment(lnum, col)
  59.     return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
  60. endfunction
  61.  
  62. "======================================
  63. "       INDENT ROUTINE
  64. "======================================
  65.  
  66. function FalconGetIndent()
  67.     " Get the line to be indented
  68.     let cline = getline(v:lnum)
  69.  
  70.     " Don't reindent comments on first column
  71.     if cline =~ '^\/\/'
  72.         return 0
  73.     endif
  74.  
  75.     " Find the previous non-blank line
  76.     let lnum = prevnonblank(v:lnum - 1)
  77.  
  78.     " Use zero indent at the top of the file
  79.     if lnum == 0
  80.         return 0
  81.     endif
  82.  
  83.     let prevline=getline(lnum)
  84.     let ind = indent(lnum)
  85.     let chg = 0
  86.  
  87.     " If we are in a multi-line string or line-comment, don't do anything
  88.     if s:IsInStringOrComment(v:lnum, matchend(cline, '^\s*') + 1 )
  89.         return indent('.')
  90.     endif
  91.  
  92.     " If the start of the line equals a double quote, then indent to the
  93.     " previous lines first double quote
  94.     if cline =~? '^\s*"'
  95.         let chg = chg + &sw
  96.     endif
  97.  
  98.     " If previous line started with a double quote and this one
  99.     " doesn't, unindent
  100.     if prevline =~? '^\s*"' && cline =~? '^\s*'
  101.         let chg = chg - &sw
  102.     endif
  103.  
  104.     " Indent if proper keyword
  105.     if prevline =~? s:falcon_indent_keywords
  106.         let chg = &sw
  107.     " If previous line opened a parenthesis, and did not close it, indent
  108.     elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
  109.         " Make sure this isn't just a function split between two lines
  110.         if prevline =~ ',\s*$'
  111.             return indent(prevnonblank(v:lnum - 1)) + &sw
  112.         else
  113.             return match(prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
  114.         endif
  115.     elseif prevline =~ '^[^(]*)\s*$'
  116.         " This line closes a parenthesis. Finds opening.
  117.         let curr_line = prevnonblank(lnum - 1)
  118.         while curr_line >= 0
  119.             let str = getline(curr_line)
  120.             if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
  121.                 let curr_line = prevnonblank(curr_line - 1)
  122.             else
  123.                 break
  124.             endif
  125.         endwhile
  126.         if curr_line < 0
  127.             return -1
  128.         endif
  129.         let ind = indent(curr_line)
  130.     endif
  131.  
  132.     " If previous line ends in a semi-colon reset indent to previous
  133.     " lines setting
  134.     if prevline =~? ';\s*$' && prevnonblank(prevline) =~? ',\s*$'
  135.         return chg = chg - (2 * &sw)
  136.     endif
  137.  
  138.     " If previous line ended in a comma, indent again
  139.     if prevline =~? ',\s*$'
  140.         let chg = chg + &sw
  141.     endif
  142.  
  143.     " If previous line ended in a =>, indent again
  144.     if prevline =~? '=>\s*$'
  145.         let chg = chg + &sw
  146.     endif
  147.  
  148.     " Deindent on proper keywords
  149.     if cline =~? s:falcon_deindent_keywords
  150.         let chg = chg - &sw
  151.     endif
  152.  
  153.     return ind + chg
  154. endfunction
  155.  
  156. let &cpo = s:cpo_save
  157. unlet s:cpo_save
  158.  
  159. " vim: set sw=4 sts=4 et tw=80 :
  160.