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 / dos / indent / config.vim < prev    next >
Encoding:
Text File  |  2010-08-15  |  2.2 KB  |  83 lines

  1. " Vim indent file
  2. " Language:         Autoconf configure.{ac,in} file
  3. " Maintainer:       Nikolai Weibull <now@bitwi.se>
  4. " Latest Revision:  2006-12-20
  5. " TODO:             how about nested [()]'s in one line
  6. "                   what's wrong with '\\\@!'?
  7.  
  8. " Only load this indent file when no other was loaded.
  9. if exists("b:did_indent")
  10.   finish
  11. endif
  12.  
  13. runtime! indent/sh.vim          " will set b:did_indent
  14.  
  15. setlocal indentexpr=GetConfigIndent()
  16. setlocal indentkeys=!^F,o,O,=then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done
  17. setlocal nosmartindent
  18.  
  19. " Only define the function once.
  20. if exists("*GetConfigIndent")
  21.   finish
  22. endif
  23.  
  24. " get the offset (indent) of the end of the match of 'regexp' in 'line'
  25. function s:GetOffsetOf(line, regexp)
  26.   let end = matchend(a:line, a:regexp)
  27.   let width = 0
  28.   let i = 0
  29.   while i < end
  30.     if a:line[i] != "\t"
  31.       let width = width + 1
  32.     else
  33.       let width = width + &ts - (width % &ts)
  34.     endif
  35.     let i = i + 1
  36.   endwhile
  37.   return width
  38. endfunction
  39.  
  40. function GetConfigIndent()
  41.   " Find a non-blank line above the current line.
  42.   let lnum = prevnonblank(v:lnum - 1)
  43.  
  44.   " Hit the start of the file, use zero indent.
  45.   if lnum == 0
  46.     return 0
  47.   endif
  48.  
  49.   " where to put this
  50.   let ind = GetShIndent()
  51.   let line = getline(lnum)
  52.  
  53.   " if previous line has unmatched, unescaped opening parentheses,
  54.   " indent to its position. TODO: not failsafe if multiple ('s
  55.   if line =~ '\\\@<!([^)]*$'
  56.     let ind = s:GetOffsetOf(line, '\\\@!(')
  57.   endif
  58.  
  59.   " if previous line has unmatched opening bracket,
  60.   " indent to its position. TODO: same as above
  61.   if line =~ '\[[^]]*$'
  62.     let ind = s:GetOffsetOf(line, '\[')
  63.   endif
  64.  
  65.   " if previous line had an unmatched closing parantheses,
  66.   " indent to the matching opening parantheses
  67.   if line =~ '[^(]\+\\\@<!)$'
  68.     call search(')', 'bW')
  69.     let lnum = searchpair('\\\@<!(', '', ')', 'bWn')
  70.     let ind = indent(lnum)
  71.   endif
  72.  
  73.   " if previous line had an unmatched closing bracket,
  74.   " indent to the matching opening bracket
  75.   if line =~ '[^[]\+]$'
  76.     call search(']', 'bW')
  77.     let lnum = searchpair('\[', '', ']', 'bWn')
  78.     let ind = indent(lnum)
  79.   endif
  80.  
  81.   return ind
  82. endfunction
  83.