Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/vim73/indent
diff options
context:
space:
mode:
authorGeroge Hunt <georgejhunt@gmail.com>2011-02-26 20:19:01 (GMT)
committer Geroge Hunt <georgejhunt@gmail.com>2011-02-26 20:19:01 (GMT)
commitfb6211451e0aa64e36ba309934746c12f9ebd869 (patch)
tree2c8f7cbb26f97654a9d7b6b6b26a82a53bc64f07 /vim73/indent
create initial snapshotHEADmaster
Diffstat (limited to 'vim73/indent')
-rw-r--r--vim73/indent/README.txt45
-rw-r--r--vim73/indent/aap.vim12
-rw-r--r--vim73/indent/ada.vim303
-rw-r--r--vim73/indent/ant.vim12
-rw-r--r--vim73/indent/automake.vim11
-rw-r--r--vim73/indent/awk.vim228
-rw-r--r--vim73/indent/bib.vim15
-rw-r--r--vim73/indent/bst.vim75
-rw-r--r--vim73/indent/c.vim15
-rw-r--r--vim73/indent/cdl.vim129
-rw-r--r--vim73/indent/ch.vim18
-rw-r--r--vim73/indent/chaiscript.vim50
-rw-r--r--vim73/indent/changelog.vim14
-rw-r--r--vim73/indent/cmake.vim85
-rw-r--r--vim73/indent/cobol.vim216
-rw-r--r--vim73/indent/config.vim82
-rw-r--r--vim73/indent/cpp.vim15
-rw-r--r--vim73/indent/cs.vim15
-rw-r--r--vim73/indent/css.vim84
-rw-r--r--vim73/indent/cucumber.vim60
-rw-r--r--vim73/indent/cuda.vim15
-rw-r--r--vim73/indent/d.vim22
-rw-r--r--vim73/indent/dictconf.vim13
-rw-r--r--vim73/indent/dictdconf.vim13
-rw-r--r--vim73/indent/docbk.vim15
-rw-r--r--vim73/indent/dtd.vim324
-rw-r--r--vim73/indent/dtrace.vim17
-rw-r--r--vim73/indent/dylan.vim90
-rw-r--r--vim73/indent/eiffel.vim106
-rw-r--r--vim73/indent/erlang.vim206
-rw-r--r--vim73/indent/eruby.vim81
-rw-r--r--vim73/indent/eterm.vim36
-rw-r--r--vim73/indent/falcon.vim156
-rw-r--r--vim73/indent/fortran.vim166
-rw-r--r--vim73/indent/framescript.vim41
-rw-r--r--vim73/indent/gitconfig.vim35
-rw-r--r--vim73/indent/haml.vim73
-rw-r--r--vim73/indent/hamster.vim55
-rw-r--r--vim73/indent/html.vim242
-rw-r--r--vim73/indent/htmldjango.vim12
-rw-r--r--vim73/indent/idlang.vim63
-rw-r--r--vim73/indent/ishd.vim68
-rw-r--r--vim73/indent/java.vim130
-rw-r--r--vim73/indent/javascript.vim16
-rw-r--r--vim73/indent/jsp.vim17
-rw-r--r--vim73/indent/ld.vim84
-rwxr-xr-xvim73/indent/lifelines.vim24
-rw-r--r--vim73/indent/liquid.vim63
-rw-r--r--vim73/indent/lisp.vim15
-rw-r--r--vim73/indent/logtalk.vim61
-rw-r--r--vim73/indent/lua.vim63
-rw-r--r--vim73/indent/mail.vim13
-rw-r--r--vim73/indent/make.vim116
-rw-r--r--vim73/indent/matlab.vim74
-rw-r--r--vim73/indent/mma.vim75
-rw-r--r--vim73/indent/mp.vim206
-rw-r--r--vim73/indent/objc.vim79
-rw-r--r--vim73/indent/ocaml.vim253
-rw-r--r--vim73/indent/occam.vim182
-rw-r--r--vim73/indent/pascal.vim173
-rw-r--r--vim73/indent/perl.vim180
-rw-r--r--vim73/indent/perl6.vim136
-rw-r--r--vim73/indent/php.vim733
-rw-r--r--vim73/indent/postscr.vim68
-rw-r--r--vim73/indent/pov.vim84
-rw-r--r--vim73/indent/prolog.vim58
-rw-r--r--vim73/indent/pyrex.vim13
-rw-r--r--vim73/indent/python.vim193
-rw-r--r--vim73/indent/readline.vim36
-rw-r--r--vim73/indent/rpl.vim63
-rw-r--r--vim73/indent/rst.vim53
-rw-r--r--vim73/indent/ruby.vim378
-rw-r--r--vim73/indent/sass.vim39
-rw-r--r--vim73/indent/scheme.vim11
-rw-r--r--vim73/indent/scss.vim12
-rw-r--r--vim73/indent/sdl.vim89
-rw-r--r--vim73/indent/sh.vim158
-rw-r--r--vim73/indent/sml.vim217
-rw-r--r--vim73/indent/sql.vim39
-rw-r--r--vim73/indent/sqlanywhere.vim385
-rw-r--r--vim73/indent/tcl.vim75
-rw-r--r--vim73/indent/tcsh.vim51
-rw-r--r--vim73/indent/tf.vim72
-rw-r--r--vim73/indent/tilde.vim36
-rw-r--r--vim73/indent/vb.vim78
-rw-r--r--vim73/indent/verilog.vim219
-rw-r--r--vim73/indent/vhdl.vim406
-rw-r--r--vim73/indent/vim.vim74
-rw-r--r--vim73/indent/xf86conf.vim37
-rw-r--r--vim73/indent/xhtml.vim12
-rw-r--r--vim73/indent/xinetd.vim50
-rw-r--r--vim73/indent/xml.vim96
-rw-r--r--vim73/indent/xsd.vim13
-rw-r--r--vim73/indent/xslt.vim13
-rw-r--r--vim73/indent/yacc.vim41
-rw-r--r--vim73/indent/zsh.vim11
96 files changed, 9206 insertions, 0 deletions
diff --git a/vim73/indent/README.txt b/vim73/indent/README.txt
new file mode 100644
index 0000000..a424b4f
--- /dev/null
+++ b/vim73/indent/README.txt
@@ -0,0 +1,45 @@
+This directory contains files to automatically compute the indent for a
+type of file.
+
+If you want to add your own indent file for your personal use, read the docs
+at ":help indent-expression". Looking at the existing files should give you
+inspiration.
+
+If you make a new indent file which would be useful for others, please send it
+to Bram@vim.org. Include instructions for detecting the file type for this
+language, by file name extension or by checking a few lines in the file.
+And please stick to the rules below.
+
+If you have remarks about an existing file, send them to the maintainer of
+that file. Only when you get no response send a message to Bram@vim.org.
+
+If you are the maintainer of an indent file and make improvements, e-mail the
+new version to Bram@vim.org.
+
+
+Rules for making an indent file:
+
+You should use this check for "b:did_indent":
+
+ " Only load this indent file when no other was loaded yet.
+ if exists("b:did_indent")
+ finish
+ endif
+ let b:did_indent = 1
+
+Always use ":setlocal" to set 'indentexpr'. This avoids it being carried over
+to other buffers.
+
+To trigger the indenting after typing a word like "endif", add the word to the
+'cinkeys' option with "+=".
+
+You normally set 'indentexpr' to evaluate a function and then define that
+function. That function only needs to be defined once for as long as Vim is
+running. Add a test if the function exists and use ":finish", like this:
+ if exists("*GetMyIndent")
+ finish
+ endif
+
+The user may have several options set unlike you, try to write the file such
+that it works with any option settings. Also be aware of certain features not
+being compiled in.
diff --git a/vim73/indent/aap.vim b/vim73/indent/aap.vim
new file mode 100644
index 0000000..35828b4
--- /dev/null
+++ b/vim73/indent/aap.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: Aap recipe
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Jun 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Works mostly like Python.
+runtime! indent/python.vim
diff --git a/vim73/indent/ada.vim b/vim73/indent/ada.vim
new file mode 100644
index 0000000..a9b461c
--- /dev/null
+++ b/vim73/indent/ada.vim
@@ -0,0 +1,303 @@
+"------------------------------------------------------------------------------
+" Description: Vim Ada indent file
+" Language: Ada (2005)
+" $Id: ada.vim 887 2008-07-08 14:29:01Z krischik $
+" Copyright: Copyright (C) 2006 Martin Krischik
+" Maintainer: Martin Krischik <krischik@users.sourceforge.net>
+" Neil Bird <neil@fnxweb.com>
+" Ned Okie <nokie@radford.edu>
+" $Author: krischik $
+" $Date: 2008-07-08 16:29:01 +0200 (Di, 08 Jul 2008) $
+" Version: 4.6
+" $Revision: 887 $
+" $HeadURL: https://gnuada.svn.sourceforge.net/svnroot/gnuada/trunk/tools/vim/indent/ada.vim $
+" History: 24.05.2006 MK Unified Headers
+" 16.07.2006 MK Ada-Mode as vim-ball
+" 15.10.2006 MK Bram's suggestion for runtime integration
+" 05.11.2006 MK Bram suggested to save on spaces
+" 19.09.2007 NO g: missing before ada#Comment
+" Help Page: ft-vim-indent
+"------------------------------------------------------------------------------
+" ToDo:
+" Verify handling of multi-line exprs. and recovery upon the final ';'.
+" Correctly find comments given '"' and "" ==> " syntax.
+" Combine the two large block-indent functions into one?
+"------------------------------------------------------------------------------
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent") || version < 700
+ finish
+endif
+
+let b:did_indent = 45
+
+setlocal indentexpr=GetAdaIndent()
+setlocal indentkeys-=0{,0}
+setlocal indentkeys+=0=~then,0=~end,0=~elsif,0=~when,0=~exception,0=~begin,0=~is,0=~record
+
+" Only define the functions once.
+if exists("*GetAdaIndent")
+ finish
+endif
+
+if exists("g:ada_with_gnat_project_files")
+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\<is\>[^;]*$\|\(type\>.*\)\=\<record\>\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|project\>\|then\>\|when\>\|is\>\)'
+else
+ let s:AdaBlockStart = '^\s*\(if\>\|while\>\|else\>\|elsif\>\|loop\>\|for\>.*\<\(loop\|use\)\>\|declare\>\|begin\>\|type\>.*\<is\>[^;]*$\|\(type\>.*\)\=\<record\>\|procedure\>\|function\>\|accept\>\|do\>\|task\>\|package\>\|then\>\|when\>\|is\>\)'
+endif
+
+" Section: s:MainBlockIndent {{{1
+"
+" Try to find indent of the block we're in
+" prev_indent = the previous line's indent
+" prev_lnum = previous line (to start looking on)
+" blockstart = expr. that indicates a possible start of this block
+" stop_at = if non-null, if a matching line is found, gives up!
+" No recursive previous block analysis: simply look for a valid line
+" with a lesser or equal indent than we currently (on prev_lnum) have.
+" This shouldn't work as well as it appears to with lines that are currently
+" nowhere near the correct indent (e.g., start of line)!
+" Seems to work OK as it 'starts' with the indent of the /previous/ line.
+function s:MainBlockIndent (prev_indent, prev_lnum, blockstart, stop_at)
+ let lnum = a:prev_lnum
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+ while lnum > 1
+ if a:stop_at != '' && line =~ '^\s*' . a:stop_at && indent(lnum) < a:prev_indent
+ return a:prev_indent
+ elseif line =~ '^\s*' . a:blockstart
+ let ind = indent(lnum)
+ if ind < a:prev_indent
+ return ind
+ endif
+ endif
+
+ let lnum = prevnonblank(lnum - 1)
+ " Get previous non-blank/non-comment-only line
+ while 1
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+ if line !~ '^\s*$' && line !~ '^\s*#'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return a:prev_indent
+ endif
+ endwhile
+ endwhile
+ " Fallback - just move back one
+ return a:prev_indent - &sw
+endfunction MainBlockIndent
+
+" Section: s:EndBlockIndent {{{1
+"
+" Try to find indent of the block we're in (and about to complete),
+" including handling of nested blocks. Works on the 'end' of a block.
+" prev_indent = the previous line's indent
+" prev_lnum = previous line (to start looking on)
+" blockstart = expr. that indicates a possible start of this block
+" blockend = expr. that indicates a possible end of this block
+function s:EndBlockIndent( prev_indent, prev_lnum, blockstart, blockend )
+ let lnum = a:prev_lnum
+ let line = getline(lnum)
+ let ends = 0
+ while lnum > 1
+ if getline(lnum) =~ '^\s*' . a:blockstart
+ let ind = indent(lnum)
+ if ends <= 0
+ if ind < a:prev_indent
+ return ind
+ endif
+ else
+ let ends = ends - 1
+ endif
+ elseif getline(lnum) =~ '^\s*' . a:blockend
+ let ends = ends + 1
+ endif
+
+ let lnum = prevnonblank(lnum - 1)
+ " Get previous non-blank/non-comment-only line
+ while 1
+ let line = getline(lnum)
+ let line = substitute( line, g:ada#Comment, '', '' )
+ if line !~ '^\s*$'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return a:prev_indent
+ endif
+ endwhile
+ endwhile
+ " Fallback - just move back one
+ return a:prev_indent - &sw
+endfunction EndBlockIndent
+
+" Section: s:StatementIndent {{{1
+"
+" Return indent of previous statement-start
+" (after we've indented due to multi-line statements).
+" This time, we start searching on the line *before* the one given (which is
+" the end of a statement - we want the previous beginning).
+function s:StatementIndent( current_indent, prev_lnum )
+ let lnum = a:prev_lnum
+ while lnum > 0
+ let prev_lnum = lnum
+ let lnum = prevnonblank(lnum - 1)
+ " Get previous non-blank/non-comment-only line
+ while 1
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+
+ if line !~ '^\s*$' && line !~ '^\s*#'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return a:current_indent
+ endif
+ endwhile
+ " Leave indent alone if our ';' line is part of a ';'-delineated
+ " aggregate (e.g., procedure args.) or first line after a block start.
+ if line =~ s:AdaBlockStart || line =~ '(\s*$'
+ return a:current_indent
+ endif
+ if line !~ '[.=(]\s*$'
+ let ind = indent(prev_lnum)
+ if ind < a:current_indent
+ return ind
+ endif
+ endif
+ endwhile
+ " Fallback - just use current one
+ return a:current_indent
+endfunction StatementIndent
+
+
+" Section: GetAdaIndent {{{1
+"
+" Find correct indent of a new line based upon what went before
+"
+function GetAdaIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+ let ind = indent(lnum)
+ let package_line = 0
+
+ " Get previous non-blank/non-comment-only/non-cpp line
+ while 1
+ let line = substitute( getline(lnum), g:ada#Comment, '', '' )
+ if line !~ '^\s*$' && line !~ '^\s*#'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ if lnum <= 0
+ return ind
+ endif
+ endwhile
+
+ " Get default indent (from prev. line)
+ let ind = indent(lnum)
+ let initind = ind
+
+ " Now check what's on the previous line
+ if line =~ s:AdaBlockStart || line =~ '(\s*$'
+ " Check for false matches to AdaBlockStart
+ let false_match = 0
+ if line =~ '^\s*\(procedure\|function\|package\)\>.*\<is\s*new\>'
+ " Generic instantiation
+ let false_match = 1
+ elseif line =~ ')\s*;\s*$' || line =~ '^\([^(]*([^)]*)\)*[^(]*;\s*$'
+ " forward declaration
+ let false_match = 1
+ endif
+ " Move indent in
+ if ! false_match
+ let ind = ind + &sw
+ endif
+ elseif line =~ '^\s*\(case\|exception\)\>'
+ " Move indent in twice (next 'when' will move back)
+ let ind = ind + 2 * &sw
+ elseif line =~ '^\s*end\s*record\>'
+ " Move indent back to tallying 'type' preceeding the 'record'.
+ " Allow indent to be equal to 'end record's.
+ let ind = s:MainBlockIndent( ind+&sw, lnum, 'type\>', '' )
+ elseif line =~ '\(^\s*new\>.*\)\@<!)\s*[;,]\s*$'
+ " Revert to indent of line that started this parenthesis pair
+ exe lnum
+ exe 'normal! $F)%'
+ if getline('.') =~ '^\s*('
+ " Dire layout - use previous indent (could check for g:ada#Comment here)
+ let ind = indent( prevnonblank( line('.')-1 ) )
+ else
+ let ind = indent('.')
+ endif
+ exe v:lnum
+ elseif line =~ '[.=(]\s*$'
+ " A statement continuation - move in one
+ let ind = ind + &sw
+ elseif line =~ '^\s*new\>'
+ " Multiple line generic instantiation ('package blah is\nnew thingy')
+ let ind = s:StatementIndent( ind - &sw, lnum )
+ elseif line =~ ';\s*$'
+ " Statement end (but not 'end' ) - try to find current statement-start indent
+ let ind = s:StatementIndent( ind, lnum )
+ endif
+
+ " Check for potential argument list on next line
+ let continuation = (line =~ '[A-Za-z0-9_]\s*$')
+
+
+ " Check current line; search for simplistic matching start-of-block
+ let line = getline(v:lnum)
+ if line =~ '^\s*#'
+ " Start of line for ada-pp
+ let ind = 0
+ elseif continuation && line =~ '^\s*('
+ " Don't do this if we've already indented due to the previous line
+ if ind == initind
+ let ind = ind + &sw
+ endif
+ elseif line =~ '^\s*\(begin\|is\)\>'
+ let ind = s:MainBlockIndent( ind, lnum, '\(procedure\|function\|declare\|package\|task\)\>', 'begin\>' )
+ elseif line =~ '^\s*record\>'
+ let ind = s:MainBlockIndent( ind, lnum, 'type\>\|for\>.*\<use\>', '' ) + &sw
+ elseif line =~ '^\s*\(else\|elsif\)\>'
+ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' )
+ elseif line =~ '^\s*when\>'
+ " Align 'when' one /in/ from matching block start
+ let ind = s:MainBlockIndent( ind, lnum, '\(case\|exception\)\>', '' ) + &sw
+ elseif line =~ '^\s*end\>\s*\<if\>'
+ " End of if statements
+ let ind = s:EndBlockIndent( ind, lnum, 'if\>', 'end\>\s*\<if\>' )
+ elseif line =~ '^\s*end\>\s*\<loop\>'
+ " End of loops
+ let ind = s:EndBlockIndent( ind, lnum, '\(\(while\|for\)\>.*\)\?\<loop\>', 'end\>\s*\<loop\>' )
+ elseif line =~ '^\s*end\>\s*\<record\>'
+ " End of records
+ let ind = s:EndBlockIndent( ind, lnum, '\(type\>.*\)\=\<record\>', 'end\>\s*\<record\>' )
+ elseif line =~ '^\s*end\>\s*\<procedure\>'
+ " End of procedures
+ let ind = s:EndBlockIndent( ind, lnum, 'procedure\>.*\<is\>', 'end\>\s*\<procedure\>' )
+ elseif line =~ '^\s*end\>\s*\<case\>'
+ " End of case statement
+ let ind = s:EndBlockIndent( ind, lnum, 'case\>.*\<is\>', 'end\>\s*\<case\>' )
+ elseif line =~ '^\s*end\>'
+ " General case for end
+ let ind = s:MainBlockIndent( ind, lnum, '\(if\|while\|for\|loop\|accept\|begin\|record\|case\|exception\|package\)\>', '' )
+ elseif line =~ '^\s*exception\>'
+ let ind = s:MainBlockIndent( ind, lnum, 'begin\>', '' )
+ elseif line =~ '^\s*then\>'
+ let ind = s:MainBlockIndent( ind, lnum, 'if\>', '' )
+ endif
+
+ return ind
+endfunction GetAdaIndent
+
+finish " 1}}}
+
+"------------------------------------------------------------------------------
+" Copyright (C) 2006 Martin Krischik
+"
+" Vim is Charityware - see ":help license" or uganda.txt for licence details.
+"------------------------------------------------------------------------------
+" vim: textwidth=78 wrap tabstop=8 shiftwidth=3 softtabstop=3 noexpandtab
+" vim: foldmethod=marker
diff --git a/vim73/indent/ant.vim b/vim73/indent/ant.vim
new file mode 100644
index 0000000..067f272
--- /dev/null
+++ b/vim73/indent/ant.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: ANT files
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+" Last Change: Thu May 15 2003 10:02:54 PM
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use XML formatting rules
+runtime! indent/xml.vim
diff --git a/vim73/indent/automake.vim b/vim73/indent/automake.vim
new file mode 100644
index 0000000..5fbc222
--- /dev/null
+++ b/vim73/indent/automake.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: automake
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:did_indent")
+ finish
+endif
+
+" same as makefile indenting for now.
+runtime! indent/make.vim
diff --git a/vim73/indent/awk.vim b/vim73/indent/awk.vim
new file mode 100644
index 0000000..726a5dd
--- /dev/null
+++ b/vim73/indent/awk.vim
@@ -0,0 +1,228 @@
+" vim: set sw=3 sts=3:
+
+" Awk indent script. It can handle multi-line statements and expressions.
+" It works up to the point where the distinction between correct/incorrect
+" and personal taste gets fuzzy. Drop me an e-mail for bug reports and
+" reasonable style suggestions.
+"
+" Bugs:
+" =====
+" - Some syntax errors may cause erratic indentation.
+" - Same for very unusual but syntacticly correct use of { }
+" - In some cases it's confused by the use of ( and { in strings constants
+" - This version likes the closing brace of a multiline pattern-action be on
+" character position 1 before the following pattern-action combination is
+" formatted
+
+" Author:
+" =======
+" Erik Janssen, ejanssen@itmatters.nl
+"
+" History:
+" ========
+" 26-04-2002 Got initial version working reasonably well
+" 29-04-2002 Fixed problems in function headers and max line width
+" Added support for two-line if's without curly braces
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetAwkIndent()
+" Mmm, copied from the tcl indent program. Is this okay?
+setlocal indentkeys-=:,0#
+
+" Only define the function once.
+if exists("*GetAwkIndent")
+ finish
+endif
+
+" This function contains a lot of exit points. It checks for simple cases
+" first to get out of the function as soon as possible, thereby reducing the
+" number of possibilities later on in the difficult parts
+
+function! GetAwkIndent()
+
+ " Find previous line and get it's indentation
+ let prev_lineno = s:Get_prev_line( v:lnum )
+ if prev_lineno == 0
+ return 0
+ endif
+ let prev_data = getline( prev_lineno )
+ let ind = indent( prev_lineno )
+
+ " Increase indent if the previous line contains an opening brace. Search
+ " for this brace the hard way to prevent errors if the previous line is a
+ " 'pattern { action }' (simple check match on /{/ increases the indent then)
+
+ if s:Get_brace_balance( prev_data, '{', '}' ) > 0
+ return ind + &sw
+ endif
+
+ let brace_balance = s:Get_brace_balance( prev_data, '(', ')' )
+
+ " If prev line has positive brace_balance and starts with a word (keyword
+ " or function name), align the current line on the first '(' of the prev
+ " line
+
+ if brace_balance > 0 && s:Starts_with_word( prev_data )
+ return s:Safe_indent( ind, s:First_word_len(prev_data), getline(v:lnum))
+ endif
+
+ " If this line starts with an open brace bail out now before the line
+ " continuation checks.
+
+ if getline( v:lnum ) =~ '^\s*{'
+ return ind
+ endif
+
+ " If prev line seems to be part of multiline statement:
+ " 1. Prev line is first line of a multiline statement
+ " -> attempt to indent on first ' ' or '(' of prev line, just like we
+ " indented the positive brace balance case above
+ " 2. Prev line is not first line of a multiline statement
+ " -> copy indent of prev line
+
+ let continue_mode = s:Seems_continuing( prev_data )
+ if continue_mode > 0
+ if s:Seems_continuing( getline(s:Get_prev_line( prev_lineno )) )
+ " Case 2
+ return ind
+ else
+ " Case 1
+ if continue_mode == 1
+ " Need continuation due to comma, backslash, etc
+ return s:Safe_indent( ind, s:First_word_len(prev_data), getline(v:lnum))
+ else
+ " if/for/while without '{'
+ return ind + &sw
+ endif
+ endif
+ endif
+
+ " If the previous line doesn't need continuation on the current line we are
+ " on the start of a new statement. We have to make sure we align with the
+ " previous statement instead of just the previous line. This is a bit
+ " complicated because the previous statement might be multi-line.
+ "
+ " The start of a multiline statement can be found by:
+ "
+ " 1 If the previous line contains closing braces and has negative brace
+ " balance, search backwards until cumulative brace balance becomes zero,
+ " take indent of that line
+ " 2 If the line before the previous needs continuation search backward
+ " until that's not the case anymore. Take indent of one line down.
+
+ " Case 1
+ if prev_data =~ ')' && brace_balance < 0
+ while brace_balance != 0
+ let prev_lineno = s:Get_prev_line( prev_lineno )
+ let prev_data = getline( prev_lineno )
+ let brace_balance=brace_balance+s:Get_brace_balance(prev_data,'(',')' )
+ endwhile
+ let ind = indent( prev_lineno )
+ else
+ " Case 2
+ if s:Seems_continuing( getline( prev_lineno - 1 ) )
+ let prev_lineno = prev_lineno - 2
+ let prev_data = getline( prev_lineno )
+ while prev_lineno > 0 && (s:Seems_continuing( prev_data ) > 0)
+ let prev_lineno = s:Get_prev_line( prev_lineno )
+ let prev_data = getline( prev_lineno )
+ endwhile
+ let ind = indent( prev_lineno + 1 )
+ endif
+ endif
+
+ " Decrease indent if this line contains a '}'.
+ if getline(v:lnum) =~ '^\s*}'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
+
+" Find the open and close braces in this line and return how many more open-
+" than close braces there are. It's also used to determine cumulative balance
+" across multiple lines.
+
+function! s:Get_brace_balance( line, b_open, b_close )
+ let line2 = substitute( a:line, a:b_open, "", "g" )
+ let openb = strlen( a:line ) - strlen( line2 )
+ let line3 = substitute( line2, a:b_close, "", "g" )
+ let closeb = strlen( line2 ) - strlen( line3 )
+ return openb - closeb
+endfunction
+
+" Find out whether the line starts with a word (i.e. keyword or function
+" call). Might need enhancements here.
+
+function! s:Starts_with_word( line )
+ if a:line =~ '^\s*[a-zA-Z_0-9]\+\s*('
+ return 1
+ endif
+ return 0
+endfunction
+
+" Find the length of the first word in a line. This is used to be able to
+" align a line relative to the 'print ' or 'if (' on the previous line in case
+" such a statement spans multiple lines.
+" Precondition: only to be used on lines where 'Starts_with_word' returns 1.
+
+function! s:First_word_len( line )
+ let white_end = matchend( a:line, '^\s*' )
+ if match( a:line, '^\s*func' ) != -1
+ let word_end = matchend( a:line, '[a-z]\+\s\+[a-zA-Z_0-9]\+[ (]*' )
+ else
+ let word_end = matchend( a:line, '[a-zA-Z_0-9]\+[ (]*' )
+ endif
+ return word_end - white_end
+endfunction
+
+" Determine if 'line' completes a statement or is continued on the next line.
+" This one is far from complete and accepts illegal code. Not important for
+" indenting, however.
+
+function! s:Seems_continuing( line )
+ " Unfinished lines
+ if a:line =~ '[\\,\|\&\+\-\*\%\^]\s*$'
+ return 1
+ endif
+ " if/for/while (cond) eol
+ if a:line =~ '^\s*\(if\|while\|for\)\s*(.*)\s*$' || a:line =~ '^\s*else\s*'
+ return 2
+ endif
+ return 0
+endfunction
+
+" Get previous relevant line. Search back until a line is that is no
+" comment or blank and return the line number
+
+function! s:Get_prev_line( lineno )
+ let lnum = a:lineno - 1
+ let data = getline( lnum )
+ while lnum > 0 && (data =~ '^\s*#' || data =~ '^\s*$')
+ let lnum = lnum - 1
+ let data = getline( lnum )
+ endwhile
+ return lnum
+endfunction
+
+" This function checks whether an indented line exceeds a maximum linewidth
+" (hardcoded 80). If so and it is possible to stay within 80 positions (or
+" limit num of characters beyond linewidth) by decreasing the indent (keeping
+" it > base_indent), do so.
+
+function! s:Safe_indent( base, wordlen, this_line )
+ let line_base = matchend( a:this_line, '^\s*' )
+ let line_len = strlen( a:this_line ) - line_base
+ let indent = a:base
+ if (indent + a:wordlen + line_len) > 80
+ " Simple implementation good enough for the time being
+ let indent = indent + 3
+ endif
+ return indent + a:wordlen
+endfunction
diff --git a/vim73/indent/bib.vim b/vim73/indent/bib.vim
new file mode 100644
index 0000000..d1a0636
--- /dev/null
+++ b/vim73/indent/bib.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: BibTeX
+" Maintainer: Dorai Sitaram <ds26@gte.com>
+" URL: http://www.ccs.neu.edu/~dorai/vimplugins/vimplugins.html
+" Last Change: 2005 Mar 28
+
+" Only do this when not done yet for this buffer
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/vim73/indent/bst.vim b/vim73/indent/bst.vim
new file mode 100644
index 0000000..be1f63e
--- /dev/null
+++ b/vim73/indent/bst.vim
@@ -0,0 +1,75 @@
+" Vim indent file
+" Language: bst
+" Author: Tim Pope <vimNOSPAM@tpope.info>
+" $Id: bst.vim,v 1.1 2007/05/05 18:11:12 vimboss Exp $
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetBstIndent(v:lnum)
+"setlocal smartindent
+setlocal cinkeys&
+setlocal cinkeys-=0#
+setlocal indentkeys&
+"setlocal indentkeys+=0%
+
+" Only define the function once.
+if exists("*GetBstIndent")
+ finish
+endif
+
+function! s:prevgood(lnum)
+ " Find a non-blank line above the current line.
+ " Skip over comments.
+ let lnum = a:lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ if getline(lnum) !~ '^\s*%.*$'
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function! s:strip(lnum)
+ let line = getline(a:lnum)
+ let line = substitute(line,'"[^"]*"','""','g')
+ let line = substitute(line,'%.*','','')
+ let line = substitute(line,'^\s\+','','')
+ return line
+endfunction
+
+function! s:count(string,char)
+ let str = substitute(a:string,'[^'.a:char.']','','g')
+ return strlen(str)
+endfunction
+
+function! GetBstIndent(lnum) abort
+ if a:lnum == 1
+ return 0
+ endif
+ let lnum = s:prevgood(a:lnum)
+ if lnum <= 0
+ return indent(a:lnum - 1)
+ endif
+ let line = s:strip(lnum)
+ let cline = s:strip(a:lnum)
+ if cline =~ '^}' && exists("b:current_syntax")
+ call cursor(a:lnum,indent(a:lnum))
+ if searchpair('{','','}','bW',"synIDattr(synID(line('.'),col('.'),1),'name') =~? 'comment\\|string'")
+ if col('.')+1 == col('$')
+ return indent('.')
+ else
+ return virtcol('.')-1
+ endif
+ endif
+ endif
+ let fakeline = substitute(line,'^}','','').matchstr(cline,'^}')
+ let ind = indent(lnum)
+ let ind = ind + &sw * s:count(line,'{')
+ let ind = ind - &sw * s:count(fakeline,'}')
+ return ind
+endfunction
diff --git a/vim73/indent/c.vim b/vim73/indent/c.vim
new file mode 100644
index 0000000..e224382
--- /dev/null
+++ b/vim73/indent/c.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: C
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Mar 27
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" C indenting is built-in, thus this is very simple
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/vim73/indent/cdl.vim b/vim73/indent/cdl.vim
new file mode 100644
index 0000000..db2b905
--- /dev/null
+++ b/vim73/indent/cdl.vim
@@ -0,0 +1,129 @@
+" Description: Comshare Dimension Definition Language (CDL)
+" Author: Raul Segura Acevedo <raulseguraaceved@netscape.net>
+" Last Change: Fri Nov 30 13:35:48 2001 CST
+
+if exists("b:did_indent")
+ "finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=CdlGetIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==~else,=~endif,=~then,;,),=
+
+" Only define the function once.
+if exists("*CdlGetIndent")
+ "finish
+endif
+
+" find out if an "...=..." expresion its an asignment (or a conditional)
+" it scans 'line' first, and then the previos lines
+fun! CdlAsignment(lnum, line)
+ let f = -1
+ let lnum = a:lnum
+ let line = a:line
+ while lnum > 0 && f == -1
+ " line without members [a] of [b]:[c]...
+ let inicio = 0
+ while 1
+ " keywords that help to decide
+ let inicio = matchend(line, '\c\<\(expr\|\a*if\|and\|or\|not\|else\|then\|memberis\|\k\+of\)\>\|[<>;]', inicio)
+ if inicio < 0
+ break
+ endif
+ " it's formula if there's a ';', 'elsE', 'theN', 'enDif' or 'expr'
+ " conditional if there's a '<', '>', 'elseif', 'if', 'and', 'or', 'not',
+ " 'memberis', 'childrenof' and other \k\+of funcions
+ let f = line[inicio-1] =~? '[en;]' || strpart(line, inicio-4, 4) =~? 'ndif\|expr'
+ endw
+ let lnum = prevnonblank(lnum-1)
+ let line = substitute(getline(lnum), '\c\(\[[^]]*]\(\s*of\s*\|:\)*\)\+', ' ', 'g')
+ endw
+ " if we hit the start of the file then f = -1, return 1 (formula)
+ return f != 0
+endf
+
+fun! CdlGetIndent(lnum)
+ let thisline = getline(a:lnum)
+ if match(thisline, '^\s*\(\k\+\|\[[^]]*]\)\s*\(,\|;\s*$\)') >= 0
+ " it's an attributes line
+ return &sw
+ elseif match(thisline, '^\c\s*\([{}]\|\/[*/]\|dimension\|schedule\|group\|hierarchy\|class\)') >= 0
+ " it's a header or '{' or '}' or a comment
+ return 0
+ end
+
+ let lnum = prevnonblank(a:lnum-1)
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " PREVIOUS LINE
+ let ind = indent(lnum)
+ let line = getline(lnum)
+ let f = -1 " wether a '=' is a conditional or a asignment, -1 means we don't know yet
+ " one 'closing' element at the beginning of the line has already reduced the
+ " indent, but 'else', 'elseif' & 'then' increment it for the next line
+ " '=' at the beginning has already de right indent (increased for asignments)
+ let inicio = matchend(line, '^\c\s*\(else\a*\|then\|endif\|/[*/]\|[);={]\)')
+ if inicio > 0
+ let c = line[inicio-1]
+ " ')' and '=' don't change indent and are useless to set 'f'
+ if c == '{'
+ return &sw
+ elseif c != ')' && c != '='
+ let f = 1 " all but 'elseif' are followed by a formula
+ if c ==? 'n' || c ==? 'e' " 'then', 'else'
+ let ind = ind + &sw
+ elseif strpart(line, inicio-6, 6) ==? 'elseif' " elseif, set f to conditional
+ let ind = ind + &sw
+ let f = 0
+ end
+ end
+ end
+
+ " remove members [a] of [b]:[c]... (inicio remainds valid)
+ let line = substitute(line, '\c\(\[[^]]*]\(\s*of\s*\|:\)*\)\+', ' ', 'g')
+ while 1
+ " search for the next interesting element
+ let inicio=matchend(line, '\c\<if\|endif\|[()=;]', inicio)
+ if inicio < 0
+ break
+ end
+
+ let c = line[inicio-1]
+ " 'expr(...)' containing the formula
+ if strpart(line, inicio-5, 5) ==? 'expr('
+ let ind = 0
+ let f = 1
+ elseif c == ')' || c== ';' || strpart(line, inicio-5, 5) ==? 'endif'
+ let ind = ind - &sw
+ elseif c == '(' || c ==? 'f' " '(' or 'if'
+ let ind = ind + &sw
+ else " c == '='
+ " if it is an asignment increase indent
+ if f == -1 " we don't know yet, find out
+ let f = CdlAsignment(lnum, strpart(line, 0, inicio))
+ end
+ if f == 1 " formula increase it
+ let ind = ind + &sw
+ end
+ end
+ endw
+
+ " CURRENT LINE, if it starts with a closing element, decrease indent
+ " or if it starts with '=' (asignment), increase indent
+ if match(thisline, '^\c\s*\(else\|then\|endif\|[);]\)') >= 0
+ let ind = ind - &sw
+ elseif match(thisline, '^\s*=') >= 0
+ if f == -1 " we don't know yet if is an asignment, find out
+ let f = CdlAsignment(lnum, "")
+ end
+ if f == 1 " formula increase it
+ let ind = ind + &sw
+ end
+ end
+
+ return ind
+endfun
diff --git a/vim73/indent/ch.vim b/vim73/indent/ch.vim
new file mode 100644
index 0000000..e1bd8a3
--- /dev/null
+++ b/vim73/indent/ch.vim
@@ -0,0 +1,18 @@
+" Vim indent file
+" Language: Ch
+" Maintainer: SoftIntegration, Inc. <info@softintegration.com>
+" URL: http://www.softintegration.com/download/vim/indent/ch.vim
+" Last change: 2006 Apr 30
+" Created based on cpp.vim
+"
+" Ch is a C/C++ interpreter with many high level extensions
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Ch indenting is built-in, thus this is very simple
+setlocal cindent
diff --git a/vim73/indent/chaiscript.vim b/vim73/indent/chaiscript.vim
new file mode 100644
index 0000000..247e1a6
--- /dev/null
+++ b/vim73/indent/chaiscript.vim
@@ -0,0 +1,50 @@
+" Vim indent file
+" Language: ChaiScript
+" Maintainer: Jason Turner <lefticus 'at' gmail com>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetChaiScriptIndent()
+setlocal autoindent
+
+" Only define the function once.
+if exists("*GetChaiScriptIndent")
+ finish
+endif
+
+function! GetChaiScriptIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Add a 'shiftwidth' after lines that start a block:
+ " lines containing a {
+ let ind = indent(lnum)
+ let flag = 0
+ let prevline = getline(lnum)
+ if prevline =~ '^.*{.*'
+ let ind = ind + &shiftwidth
+ let flag = 1
+ endif
+
+ " Subtract a 'shiftwidth' after lines containing a { followed by a }
+ " to keep it balanced
+ if flag == 1 && prevline =~ '.*{.*}.*'
+ let ind = ind - &shiftwidth
+ endif
+
+ " Subtract a 'shiftwidth' on lines ending with }
+ if getline(v:lnum) =~ '^\s*\%(}\)'
+ let ind = ind - &shiftwidth
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/changelog.vim b/vim73/indent/changelog.vim
new file mode 100644
index 0000000..522c64d
--- /dev/null
+++ b/vim73/indent/changelog.vim
@@ -0,0 +1,14 @@
+" Vim indent file
+" Language: generic Changelog file
+" Maintainer: noone
+" Last Change: 2005 Mar 29
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal ai
+
+let b:undo_indent = "setl ai<"
diff --git a/vim73/indent/cmake.vim b/vim73/indent/cmake.vim
new file mode 100644
index 0000000..8c408fb
--- /dev/null
+++ b/vim73/indent/cmake.vim
@@ -0,0 +1,85 @@
+" Vim indent file
+" Program: CMake - Cross-Platform Makefile Generator
+" Module: $RCSfile: cmake-indent.vim,v $
+" Language: CMake (ft=cmake)
+" Author: Andy Cedilnik <andy.cedilnik@kitware.com>
+" Maintainer: Karthik Krishnan <karthik.krishnan@kitware.com>
+" Last Change: $Date: 2008-01-16 16:53:53 $
+" Version: $Revision: 1.9 $
+"
+" Licence: The CMake license applies to this file. See
+" http://www.cmake.org/HTML/Copyright.html
+" This implies that distribution with Vim is allowed
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=CMakeGetIndent(v:lnum)
+setlocal indentkeys+==ENDIF(,ENDFOREACH(,ENDMACRO(,ELSE(,ELSEIF(,ENDWHILE(
+
+" Only define the function once.
+if exists("*CMakeGetIndent")
+ finish
+endif
+
+fun! CMakeGetIndent(lnum)
+ let this_line = getline(a:lnum)
+
+ " Find a non-blank line above the current line.
+ let lnum = a:lnum
+ let lnum = prevnonblank(lnum - 1)
+ let previous_line = getline(lnum)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ let or = '\|'
+ " Regular expressions used by line indentation function.
+ let cmake_regex_comment = '#.*'
+ let cmake_regex_identifier = '[A-Za-z][A-Za-z0-9_]*'
+ let cmake_regex_quoted = '"\([^"\\]\|\\.\)*"'
+ let cmake_regex_arguments = '\(' . cmake_regex_quoted .
+ \ or . '\$(' . cmake_regex_identifier . ')' .
+ \ or . '[^()\\#"]' . or . '\\.' . '\)*'
+
+ let cmake_indent_comment_line = '^\s*' . cmake_regex_comment
+ let cmake_indent_blank_regex = '^\s*$'
+ let cmake_indent_open_regex = '^\s*' . cmake_regex_identifier .
+ \ '\s*(' . cmake_regex_arguments .
+ \ '\(' . cmake_regex_comment . '\)\?$'
+
+ let cmake_indent_close_regex = '^' . cmake_regex_arguments .
+ \ ')\s*' .
+ \ '\(' . cmake_regex_comment . '\)\?$'
+
+ let cmake_indent_begin_regex = '^\s*\(IF\|MACRO\|FOREACH\|ELSE\|ELSEIF\|WHILE\|FUNCTION\)\s*('
+ let cmake_indent_end_regex = '^\s*\(ENDIF\|ENDFOREACH\|ENDMACRO\|ELSE\|ELSEIF\|ENDWHILE\|ENDFUNCTION\)\s*('
+
+ " Add
+ if previous_line =~? cmake_indent_comment_line " Handle comments
+ let ind = ind
+ else
+ if previous_line =~? cmake_indent_begin_regex
+ let ind = ind + &sw
+ endif
+ if previous_line =~? cmake_indent_open_regex
+ let ind = ind + &sw
+ endif
+ endif
+
+ " Subtract
+ if this_line =~? cmake_indent_end_regex
+ let ind = ind - &sw
+ endif
+ if previous_line =~? cmake_indent_close_regex
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfun
diff --git a/vim73/indent/cobol.vim b/vim73/indent/cobol.vim
new file mode 100644
index 0000000..8dce3cd
--- /dev/null
+++ b/vim73/indent/cobol.vim
@@ -0,0 +1,216 @@
+" Vim indent file
+" Language: cobol
+" Author: Tim Pope <vimNOSPAM@tpope.info>
+" $Id: cobol.vim,v 1.1 2007/05/05 18:08:19 vimboss Exp $
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetCobolIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+=0<*>,0/,0$,0=01,=~division,=~section,0=~end,0=~then,0=~else,0=~when,*<Return>,.
+
+" Only define the function once.
+if exists("*GetCobolIndent")
+ finish
+endif
+
+let s:skip = 'getline(".") =~ "^.\\{6\\}[*/$-]\\|\"[^\"]*\""'
+
+function! s:prevgood(lnum)
+ " Find a non-blank line above the current line.
+ " Skip over comments.
+ let lnum = a:lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let line = getline(lnum)
+ if line !~? '^\s*[*/$-]' && line !~? '^.\{6\}[*/$CD-]'
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function! s:stripped(lnum)
+ return substitute(strpart(getline(a:lnum),0,72),'^\s*','','')
+endfunction
+
+function! s:optionalblock(lnum,ind,blocks,clauses)
+ let ind = a:ind
+ let clauses = '\c\<\%(\<NOT\s\+\)\@<!\%(NOT\s\+\)\=\%('.a:clauses.'\)'
+ let begin = '\c-\@<!\<\%('.a:blocks.'\)\>'
+ let beginfull = begin.'\ze.*\%(\n\%(\s*\%([*/$-].*\)\=\n\)*\)\=\s*\%('.clauses.'\)'
+ let end = '\c\<end-\%('.a:blocks.'\)\>\|\%(\.\%( \|$\)\)\@='
+ let cline = s:stripped(a:lnum)
+ let line = s:stripped(s:prevgood(a:lnum))
+ if cline =~? clauses "&& line !~? '^search\>'
+ call cursor(a:lnum,1)
+ let lastclause = searchpair(beginfull,clauses,end,'bWr',s:skip)
+ if getline(lastclause) =~? clauses && s:stripped(lastclause) !~? '^'.begin
+ let ind = indent(lastclause)
+ elseif lastclause > 0
+ let ind = indent(lastclause) + &sw
+ "let ind = ind + &sw
+ endif
+ elseif line =~? clauses && cline !~? end
+ let ind = ind + &sw
+ endif
+ return ind
+endfunction
+
+function! GetCobolIndent(lnum) abort
+ let minshft = 6
+ let ashft = minshft + 1
+ let bshft = ashft + 4
+ " (Obsolete) numbered lines
+ if getline(a:lnum) =~? '^\s*\d\{6\}\%($\|[ */$CD-]\)'
+ return 0
+ endif
+ let cline = s:stripped(a:lnum)
+ " Comments, etc. must start in the 7th column
+ if cline =~? '^[*/$-]'
+ return minshft
+ elseif cline =~# '^[CD]' && indent(a:lnum) == minshft
+ return minshft
+ endif
+ " Divisions, sections, and file descriptions start in area A
+ if cline =~? '\<\(DIVISION\|SECTION\)\%($\|\.\)' || cline =~? '^[FS]D\>'
+ return ashft
+ endif
+ " Fields
+ if cline =~? '^0*\(1\|77\)\>'
+ return ashft
+ endif
+ if cline =~? '^\d\+\>'
+ let cnum = matchstr(cline,'^\d\+\>')
+ let default = 0
+ let step = -1
+ while step < 2
+ let lnum = a:lnum
+ while lnum > 0 && lnum < line('$') && lnum > a:lnum - 500 && lnum < a:lnum + 500
+ let lnum = step > 0 ? nextnonblank(lnum + step) : prevnonblank(lnum + step)
+ let line = getline(lnum)
+ let lindent = indent(lnum)
+ if line =~? '^\s*\d\+\>'
+ let num = matchstr(line,'^\s*\zs\d\+\>')
+ if 0+cnum == num
+ return lindent
+ elseif 0+cnum > num && default < lindent + &sw
+ let default = lindent + &sw
+ endif
+ elseif lindent < bshft && lindent >= ashft
+ break
+ endif
+ endwhile
+ let step = step + 2
+ endwhile
+ return default ? default : bshft
+ endif
+ let lnum = s:prevgood(a:lnum)
+ " Hit the start of the file, use "zero" indent.
+ if lnum == 0
+ return ashft
+ endif
+ " Initial spaces are ignored
+ let line = s:stripped(lnum)
+ let ind = indent(lnum)
+ " Paragraphs. There may be some false positives.
+ if cline =~? '^\(\a[A-Z0-9-]*[A-Z0-9]\|\d[A-Z0-9-]*\a\)\.' "\s*$'
+ if cline !~? '^EXIT\s*\.' && line =~? '\.\s*$'
+ return ashft
+ endif
+ endif
+ " Paragraphs in the identification division.
+ "if cline =~? '^\(PROGRAM-ID\|AUTHOR\|INSTALLATION\|' .
+ "\ 'DATE-WRITTEN\|DATE-COMPILED\|SECURITY\)\>'
+ "return ashft
+ "endif
+ if line =~? '\.$'
+ " XXX
+ return bshft
+ endif
+ if line =~? '^PERFORM\>'
+ let perfline = substitute(line, '\c^PERFORM\s*', "", "")
+ if perfline =~? '^\%(\k\+\s\+TIMES\)\=\s*$'
+ let ind = ind + &sw
+ elseif perfline =~? '^\%(WITH\s\+TEST\|VARYING\|UNTIL\)\>.*[^.]$'
+ let ind = ind + &sw
+ endif
+ endif
+ if line =~? '^\%(IF\|THEN\|ELSE\|READ\|EVALUATE\|SEARCH\|SELECT\)\>'
+ let ind = ind + &sw
+ endif
+ let ind = s:optionalblock(a:lnum,ind,'ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT','ON\s\+SIZE\s\+ERROR')
+ let ind = s:optionalblock(a:lnum,ind,'STRING\|UNSTRING\|ACCEPT\|DISPLAY\|CALL','ON\s\+OVERFLOW\|ON\s\+EXCEPTION')
+ if cline !~? '^AT\s\+END\>' || line !~? '^SEARCH\>'
+ let ind = s:optionalblock(a:lnum,ind,'DELETE\|REWRITE\|START\|WRITE\|READ','INVALID\s\+KEY\|AT\s\+END\|NO\s\+DATA\|AT\s\+END-OF-PAGE')
+ endif
+ if cline =~? '^WHEN\>'
+ call cursor(a:lnum,1)
+ " We also search for READ so that contained AT ENDs are skipped
+ let lastclause = searchpair('\c-\@<!\<\%(SEARCH\|EVALUATE\|READ\)\>','\c\<\%(WHEN\|AT\s\+END\)\>','\c\<END-\%(SEARCH\|EVALUATE\|READ\)\>','bW',s:skip)
+ let g:foo = s:stripped(lastclause)
+ if s:stripped(lastclause) =~? '\c\<\%(WHEN\|AT\s\+END\)\>'
+ "&& s:stripped(lastclause) !~? '^\%(SEARCH\|EVALUATE\|READ\)\>'
+ let ind = indent(lastclause)
+ elseif lastclause > 0
+ let ind = indent(lastclause) + &sw
+ endif
+ elseif line =~? '^WHEN\>'
+ let ind = ind + &sw
+ endif
+ "I'm not sure why I had this
+ "if line =~? '^ELSE\>-\@!' && line !~? '\.$'
+ "let ind = indent(s:prevgood(lnum))
+ "endif
+ if cline =~? '^\(END\)\>-\@!'
+ " On lines with just END, 'guess' a simple shift left
+ let ind = ind - &sw
+ elseif cline =~? '^\(END-IF\|THEN\|ELSE\)\>-\@!'
+ call cursor(a:lnum,indent(a:lnum))
+ let match = searchpair('\c-\@<!\<IF\>','\c-\@<!\%(THEN\|ELSE\)\>','\c-\@<!\<END-IF\>\zs','bnW',s:skip)
+ if match > 0
+ let ind = indent(match)
+ endif
+ elseif cline =~? '^END-[A-Z]'
+ let beginword = matchstr(cline,'\c\<END-\zs[A-Z0-9-]\+')
+ let endword = 'END-'.beginword
+ let first = 0
+ let suffix = '.*\%(\n\%(\%(\s*\|.\{6\}\)[*/].*\n\)*\)\=\s*'
+ if beginword =~? '^\%(ADD\|COMPUTE\|DIVIDE\|MULTIPLY\|SUBTRACT\)$'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+SIZE\s\+ERROR'
+ let g:beginword = beginword
+ let first = 1
+ elseif beginword =~? '^\%(STRING\|UNSTRING\)$'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+OVERFLOW'
+ let first = 1
+ elseif beginword =~? '^\%(ACCEPT\|DISPLAY\)$'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+EXCEPTION'
+ let first = 1
+ elseif beginword ==? 'CALL'
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=ON\s\+\%(EXCEPTION\|OVERFLOW\)'
+ let first = 1
+ elseif beginword =~? '^\%(DELETE\|REWRITE\|START\|READ\|WRITE\)$'
+ let first = 1
+ let beginword = beginword . suffix . '\<\%(NOT\s\+\)\=\(INVALID\s\+KEY'
+ if beginword =~? '^READ'
+ let first = 0
+ let beginword = beginword . '\|AT\s\+END\|NO\s\+DATA'
+ elseif beginword =~? '^WRITE'
+ let beginword = beginword . '\|AT\s\+END-OF-PAGE'
+ endif
+ let beginword = beginword . '\)'
+ endif
+ call cursor(a:lnum,indent(a:lnum))
+ let match = searchpair('\c-\@<!\<'.beginword.'\>','','\c\<'.endword.'\>\zs','bnW'.(first? 'r' : ''),s:skip)
+ if match > 0
+ let ind = indent(match)
+ elseif cline =~? '^\(END-\(READ\|EVALUATE\|SEARCH\|PERFORM\)\)\>'
+ let ind = ind - &sw
+ endif
+ endif
+ return ind < bshft ? bshft : ind
+endfunction
diff --git a/vim73/indent/config.vim b/vim73/indent/config.vim
new file mode 100644
index 0000000..7eb1657
--- /dev/null
+++ b/vim73/indent/config.vim
@@ -0,0 +1,82 @@
+" Vim indent file
+" Language: Autoconf configure.{ac,in} file
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+" TODO: how about nested [()]'s in one line
+" what's wrong with '\\\@!'?
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/sh.vim " will set b:did_indent
+
+setlocal indentexpr=GetConfigIndent()
+setlocal indentkeys=!^F,o,O,=then,=do,=else,=elif,=esac,=fi,=fin,=fil,=done
+setlocal nosmartindent
+
+" Only define the function once.
+if exists("*GetConfigIndent")
+ finish
+endif
+
+" get the offset (indent) of the end of the match of 'regexp' in 'line'
+function s:GetOffsetOf(line, regexp)
+ let end = matchend(a:line, a:regexp)
+ let width = 0
+ let i = 0
+ while i < end
+ if a:line[i] != "\t"
+ let width = width + 1
+ else
+ let width = width + &ts - (width % &ts)
+ endif
+ let i = i + 1
+ endwhile
+ return width
+endfunction
+
+function GetConfigIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " where to put this
+ let ind = GetShIndent()
+ let line = getline(lnum)
+
+ " if previous line has unmatched, unescaped opening parentheses,
+ " indent to its position. TODO: not failsafe if multiple ('s
+ if line =~ '\\\@<!([^)]*$'
+ let ind = s:GetOffsetOf(line, '\\\@!(')
+ endif
+
+ " if previous line has unmatched opening bracket,
+ " indent to its position. TODO: same as above
+ if line =~ '\[[^]]*$'
+ let ind = s:GetOffsetOf(line, '\[')
+ endif
+
+ " if previous line had an unmatched closing parantheses,
+ " indent to the matching opening parantheses
+ if line =~ '[^(]\+\\\@<!)$'
+ call search(')', 'bW')
+ let lnum = searchpair('\\\@<!(', '', ')', 'bWn')
+ let ind = indent(lnum)
+ endif
+
+ " if previous line had an unmatched closing bracket,
+ " indent to the matching opening bracket
+ if line =~ '[^[]\+]$'
+ call search(']', 'bW')
+ let lnum = searchpair('\[', '', ']', 'bWn')
+ let ind = indent(lnum)
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/cpp.vim b/vim73/indent/cpp.vim
new file mode 100644
index 0000000..ffa37d7
--- /dev/null
+++ b/vim73/indent/cpp.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: C++
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2008 Nov 29
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" C++ indenting is built-in, thus this is very simple
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/vim73/indent/cs.vim b/vim73/indent/cs.vim
new file mode 100644
index 0000000..4a040b6
--- /dev/null
+++ b/vim73/indent/cs.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: C#
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: Fri, 15 Mar 2002 07:53:54 CET
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" C# is like indenting C
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/vim73/indent/css.vim b/vim73/indent/css.vim
new file mode 100644
index 0000000..d13c1ad
--- /dev/null
+++ b/vim73/indent/css.vim
@@ -0,0 +1,84 @@
+" Vim indent file
+" Language: CSS
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetCSSIndent()
+setlocal indentkeys=0{,0},!^F,o,O
+setlocal nosmartindent
+
+if exists("*GetCSSIndent")
+ finish
+endif
+
+function s:prevnonblanknoncomment(lnum)
+ let lnum = a:lnum
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ let line = getline(lnum)
+ if line =~ '\*/'
+ while lnum > 1 && line !~ '/\*'
+ let lnum -= 1
+ endwhile
+ if line =~ '^\s*/\*'
+ let lnum -= 1
+ else
+ break
+ endif
+ else
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'css\%(Comment\|StringQ\{1,2}\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetCSSIndent()
+ let line = getline(v:lnum)
+ if line =~ '^\s*\*'
+ return cindent(v:lnum)
+ elseif line =~ '^\s*}'
+ return indent(v:lnum) - &sw
+ endif
+
+ let pnum = s:prevnonblanknoncomment(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw
+
+ let pline = getline(pnum)
+ if pline =~ '}\s*$'
+ let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/cucumber.vim b/vim73/indent/cucumber.vim
new file mode 100644
index 0000000..a19d123
--- /dev/null
+++ b/vim73/indent/cucumber.vim
@@ -0,0 +1,60 @@
+" Vim indent file
+" Language: Cucumber
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 May 21
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetCucumberIndent()
+setlocal indentkeys=o,O,*<Return>,<:>,0<Bar>,0#,=,!^F
+
+" Only define the function once.
+if exists("*GetCucumberIndent")
+ finish
+endif
+
+function! s:syn(lnum)
+ return synIDattr(synID(a:lnum,1+indent(a:lnum),1),'name')
+endfunction
+
+function! GetCucumberIndent()
+ let line = getline(prevnonblank(v:lnum-1))
+ let cline = getline(v:lnum)
+ let syn = s:syn(prevnonblank(v:lnum-1))
+ let csyn = s:syn(v:lnum)
+ if csyn ==# 'cucumberFeature' || cline =~# '^\s*Feature:'
+ return 0
+ elseif csyn ==# 'cucumberExamples' || cline =~# '^\s*\%(Examples\|Scenarios\):'
+ return 2 * &sw
+ elseif csyn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || cline =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
+ return &sw
+ elseif syn ==# 'cucumberFeature' || line =~# '^\s*Feature:'
+ return &sw
+ elseif syn ==# 'cucumberExamples' || line =~# '^\s*\%(Examples\|Scenarios\):'
+ return 3 * &sw
+ elseif syn =~# '^cucumber\%(Background\|Scenario\|ScenarioOutline\)$' || line =~# '^\s*\%(Background\|Scenario\|Scenario Outline\):'
+ return 2 * &sw
+ elseif cline =~# '^\s*@' && (s:syn(nextnonblank(v:lnum+1)) == 'cucumberFeature' || getline(nextnonblank(v:lnum+1)) =~# '^\s*Feature:' || indent(prevnonblank(v:lnum-1)) <= 0)
+ return 0
+ elseif line =~# '^\s*@'
+ return &sw
+ elseif cline =~# '^\s*|' && line =~# '^\s*|'
+ return indent(prevnonblank(v:lnum-1))
+ elseif cline =~# '^\s*|' && line =~# '^\s*[^|#]'
+ return indent(prevnonblank(v:lnum-1)) + &sw
+ elseif cline =~# '^\s*[^|# \t]' && line =~# '^\s*|'
+ return indent(prevnonblank(v:lnum-1)) - &sw
+ elseif cline =~# '^\s*$' && line =~# '^\s*|'
+ let in = indent(prevnonblank(v:lnum-1))
+ return in == indent(v:lnum) ? in : in - &sw
+ elseif cline =~# '^\s*#' && getline(v:lnum-1) =~ '^\s*$' && getline(v:lnum+1) =~# '\S'
+ return indent(getline(v:lnum+1))
+ endif
+ return indent(prevnonblank(v:lnum-1))
+endfunction
+
+" vim:set sts=2 sw=2:
diff --git a/vim73/indent/cuda.vim b/vim73/indent/cuda.vim
new file mode 100644
index 0000000..68ee9ce
--- /dev/null
+++ b/vim73/indent/cuda.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: CUDA
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2008 Nov 29
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" It's just like C indenting
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/vim73/indent/d.vim b/vim73/indent/d.vim
new file mode 100644
index 0000000..b5dd5e8
--- /dev/null
+++ b/vim73/indent/d.vim
@@ -0,0 +1,22 @@
+" Vim indent file for the D programming language (version 0.137).
+"
+" Language: D
+" Maintainer: Jason Mills<jmills@cs.mun.ca>
+" Last Change: 2005 Nov 22
+" Version: 0.1
+"
+" Please email me with bugs, comments, and suggestion. Put vim in the subject
+" to ensure the email will not be marked has spam.
+"
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+" D indenting is a lot like the built-in C indenting.
+setlocal cindent
+
+" vim: ts=8 noet
diff --git a/vim73/indent/dictconf.vim b/vim73/indent/dictconf.vim
new file mode 100644
index 0000000..adbc1a5
--- /dev/null
+++ b/vim73/indent/dictconf.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: dict(1) configuration file
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys=0{,0},!^F,o,O cinwords= autoindent smartindent
+setlocal nosmartindent
+inoremap <buffer> # X#
diff --git a/vim73/indent/dictdconf.vim b/vim73/indent/dictdconf.vim
new file mode 100644
index 0000000..9427342
--- /dev/null
+++ b/vim73/indent/dictdconf.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: dictd(8) configuration file
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys=0{,0},!^F,o,O cinwords= autoindent smartindent
+setlocal nosmartindent
+inoremap <buffer> # X#
diff --git a/vim73/indent/docbk.vim b/vim73/indent/docbk.vim
new file mode 100644
index 0000000..3fde2a1
--- /dev/null
+++ b/vim73/indent/docbk.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: DocBook Documentation Format
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:did_indent")
+ finish
+endif
+
+" Same as XML indenting for now.
+runtime! indent/xml.vim
+
+if exists('*XmlIndentGet')
+ setlocal indentexpr=XmlIndentGet(v:lnum,0)
+endif
diff --git a/vim73/indent/dtd.vim b/vim73/indent/dtd.vim
new file mode 100644
index 0000000..42a8789
--- /dev/null
+++ b/vim73/indent/dtd.vim
@@ -0,0 +1,324 @@
+" Vim indent file
+" Language: DTD (Document Type Definition for XML)
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-09-21
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+setlocal indentexpr=GetDTDIndent()
+setlocal indentkeys=!^F,o,O,>
+setlocal nosmartindent
+
+if exists("*GetDTDIndent")
+ finish
+endif
+
+" TODO: Needs to be adjusted to stop at [, <, and ].
+let s:token_pattern = '^[^[:space:]]\+'
+
+function s:lex1(input, start, ...)
+ let pattern = a:0 > 0 ? a:1 : s:token_pattern
+ let start = matchend(a:input, '^\_s*', a:start)
+ if start == -1
+ return ["", a:start]
+ endif
+ let end = matchend(a:input, pattern, start)
+ if end == -1
+ return ["", a:start]
+ endif
+ let token = strpart(a:input, start, end - start)
+ return [token, end]
+endfunction
+
+function s:lex(input, start, ...)
+ let pattern = a:0 > 0 ? a:1 : s:token_pattern
+ let info = s:lex1(a:input, a:start, pattern)
+ while info[0] == '--'
+ let info = s:lex1(a:input, info[1], pattern)
+ while info[0] != "" && info[0] != '--'
+ let info = s:lex1(a:input, info[1], pattern)
+ endwhile
+ if info[0] == ""
+ return info
+ endif
+ let info = s:lex1(a:input, info[1], pattern)
+ endwhile
+ return info
+endfunction
+
+function s:indent_to_innermost_parentheses(line, end)
+ let token = '('
+ let end = a:end
+ let parentheses = [end - 1]
+ while token != ""
+ let [token, end] = s:lex(a:line, end, '^\%([(),|]\|[A-Za-z0-9_-]\+\|#PCDATA\|%[A-Za-z0-9_-]\+;\)[?*+]\=')
+ if token[0] == '('
+ call add(parentheses, end - 1)
+ elseif token[0] == ')'
+ if len(parentheses) == 1
+ return [-1, end]
+ endif
+ call remove(parentheses, -1)
+ endif
+ endwhile
+ return [parentheses[-1] - strridx(a:line, "\n", parentheses[-1]), end]
+endfunction
+
+" TODO: Line and end could be script global (think OO members).
+function GetDTDIndent()
+ if v:lnum == 1
+ return 0
+ endif
+
+ " Begin by searching back for a <! that isn’t inside a comment.
+ " From here, depending on what follows immediately after, parse to
+ " where we’re at to determine what to do.
+ if search('<!', 'bceW') == 0
+ return indent(v:lnum - 1)
+ endif
+ let lnum = line('.')
+ let col = col('.')
+ let indent = indent('.')
+ let line = lnum == v:lnum ? getline(lnum) : join(getline(lnum, v:lnum - 1), "\n")
+
+ let [declaration, end] = s:lex1(line, col)
+ if declaration == ""
+ return indent + &sw
+ elseif declaration == '--'
+ " We’re looking at a comment. Now, simply determine if the comment is
+ " terminated or not. If it isn’t, let Vim take care of that using
+ " 'comments' and 'autoindent'. Otherwise, indent to the first lines level.
+ while declaration != ""
+ let [declaration, end] = s:lex(line, end)
+ if declaration == "-->"
+ return indent
+ endif
+ endwhile
+ return -1
+ elseif declaration == 'ELEMENT'
+ " Check for element name. If none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + &sw
+ endif
+
+ " Check for token following element name. This can be a specification of
+ " whether the start or end tag may be omitted. If nothing is found, indent
+ " one level.
+ let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)')
+ let n = 0
+ while token =~ '[-O]' && n < 2
+ let [token, end] = s:lex(line, end, '^\%([-O(]\|ANY\|EMPTY\)')
+ let n += 1
+ endwhile
+ if token == ""
+ return indent + &sw
+ endif
+
+ " Next comes the content model. If the token we’ve found isn’t a
+ " parenthesis it must be either ANY, EMPTY or some random junk. Either
+ " way, we’re done indenting this element, so set it to that of the first
+ " line so that the terminating “>†winds up having the same indention.
+ if token != '('
+ return indent
+ endif
+
+ " Now go through the content model. We need to keep track of the nesting
+ " of parentheses. As soon as we hit 0 we’re done. If that happens we must
+ " have a complete content model. Thus set indention to be the same as that
+ " of the first line so that the terminating “>†winds up having the same
+ " indention. Otherwise, we’ll indent to the innermost parentheses not yet
+ " matched.
+ let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
+ if indent_of_innermost != -1
+ return indent_of_innermost
+ endif
+
+ " Finally, look for any additions and/or exceptions to the content model.
+ " This is defined by a “+†or “-†followed by another content model
+ " declaration.
+ " TODO: Can the “-†be separated by whitespace from the “(�
+ let seen = { '+(': 0, '-(': 0 }
+ while 1
+ let [additions_exceptions, end] = s:lex(line, end, '^[+-](')
+ if additions_exceptions != '+(' && additions_exceptions != '-('
+ let [token, end] = s:lex(line, end)
+ if token == '>'
+ return indent
+ endif
+ " TODO: Should use s:lex here on getline(v:lnum) and check for >.
+ return getline(v:lnum) =~ '^\s*>' || count(values(seen), 0) == 0 ? indent : (indent + &sw)
+ endif
+
+ " If we’ve seen an addition or exception already and this is of the same
+ " kind, the user is writing a broken DTD. Time to bail.
+ if seen[additions_exceptions]
+ return indent
+ endif
+ let seen[additions_exceptions] = 1
+
+ let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
+ if indent_of_innermost != -1
+ return indent_of_innermost
+ endif
+ endwhile
+ elseif declaration == 'ATTLIST'
+ " Check for element name. If none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + &sw
+ endif
+
+ " Check for any number of attributes.
+ while 1
+ " Check for attribute name. If none exists, indent one level, unless the
+ " current line is a lone “>â€, in which case we indent to the same level
+ " as the first line. Otherwise, if the attribute name is “>â€, we have
+ " actually hit the end of the attribute list, in which case we indent to
+ " the same level as the first line.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ " TODO: Should use s:lex here on getline(v:lnum) and check for >.
+ return getline(v:lnum) =~ '^\s*>' ? indent : (indent + &sw)
+ elseif name == ">"
+ return indent
+ endif
+
+ " Check for attribute value declaration. If none exists, indent two
+ " levels. Otherwise, if it’s an enumerated value, check for nested
+ " parentheses and indent to the innermost one if we don’t reach the end
+ " of the listc. Otherwise, just continue with looking for the default
+ " attribute value.
+ " TODO: Do validation of keywords
+ " (CDATA|NMTOKEN|NMTOKENS|ID|IDREF|IDREFS|ENTITY|ENTITIES)?
+ let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)')
+ if value == ""
+ return indent + &sw * 2
+ elseif value == 'NOTATION'
+ " If this is a enumerated value based on notations, read another token
+ " for the actual value. If it doesn’t exist, indent three levels.
+ " TODO: If validating according to above, value must be equal to '('.
+ let [value, end] = s:lex(line, end, '^\%((\|[^[:space:]]\+\)')
+ if value == ""
+ return indent + &sw * 3
+ endif
+ endif
+
+ if value == '('
+ let [indent_of_innermost, end] = s:indent_to_innermost_parentheses(line, end)
+ if indent_of_innermost != -1
+ return indent_of_innermost
+ endif
+ endif
+
+ " Finally look for the attribute’s default value. If non exists, indent
+ " two levels.
+ let [default, end] = s:lex(line, end, '^\%("\_[^"]*"\|#\(REQUIRED\|IMPLIED\|FIXED\)\)')
+ if default == ""
+ return indent + &sw * 2
+ elseif default == '#FIXED'
+ " We need to look for the fixed value. If non exists, indent three
+ " levels.
+ let [default, end] = s:lex(line, end, '^"\_[^"]*"')
+ if default == ""
+ return indent + &sw * 3
+ endif
+ endif
+ endwhile
+ elseif declaration == 'ENTITY'
+ " Check for entity name. If none exists, indent one level. Otherwise, if
+ " the name actually turns out to be a percent sign, “%â€, this is a
+ " parameter entity. Read another token to determine the entity name and,
+ " again, if none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + &sw
+ elseif name == '%'
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + &sw
+ endif
+ endif
+
+ " Now check for the entity value. If none exists, indent one level. If it
+ " does exist, indent to same level as first line, as we’re now done with
+ " this entity.
+ "
+ " The entity value can be a string in single or double quotes (no escapes
+ " to worry about, as entities are used instead). However, it can also be
+ " that this is an external unparsed entity. In that case we have to look
+ " further for (possibly) a public ID and an URI followed by the NDATA
+ " keyword and the actual notation name. For the public ID and URI, indent
+ " two levels, if they don’t exist. If the NDATA keyword doesn’t exist,
+ " indent one level. Otherwise, if the actual notation name doesn’t exist,
+ " indent two level. If it does, indent to same level as first line, as
+ " we’re now done with this entity.
+ let [value, end] = s:lex(line, end)
+ if value == ""
+ return indent + &sw
+ elseif value == 'SYSTEM' || value == 'PUBLIC'
+ let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
+ if quoted_string == ""
+ return indent + &sw * 2
+ endif
+
+ if value == 'PUBLIC'
+ let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
+ if quoted_string == ""
+ return indent + &sw * 2
+ endif
+ endif
+
+ let [ndata, end] = s:lex(line, end)
+ if ndata == ""
+ return indent + &sw
+ endif
+
+ let [name, end] = s:lex(line, end)
+ return name == "" ? (indent + &sw * 2) : indent
+ else
+ return indent
+ endif
+ elseif declaration == 'NOTATION'
+ " Check for notation name. If none exists, indent one level.
+ let [name, end] = s:lex(line, end)
+ if name == ""
+ return indent + &sw
+ endif
+
+ " Now check for the external ID. If none exists, indent one level.
+ let [id, end] = s:lex(line, end)
+ if id == ""
+ return indent + &sw
+ elseif id == 'SYSTEM' || id == 'PUBLIC'
+ let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\)')
+ if quoted_string == ""
+ return indent + &sw * 2
+ endif
+
+ if id == 'PUBLIC'
+ let [quoted_string, end] = s:lex(line, end, '\%("[^"]\+"\|''[^'']\+''\|>\)')
+ if quoted_string == ""
+ " TODO: Should use s:lex here on getline(v:lnum) and check for >.
+ return getline(v:lnum) =~ '^\s*>' ? indent : (indent + &sw * 2)
+ elseif quoted_string == '>'
+ return indent
+ endif
+ endif
+ endif
+
+ return indent
+ endif
+
+ " TODO: Processing directives could be indented I suppose. But perhaps it’s
+ " just as well to let the user decide how to indent them (perhaps extending
+ " this function to include proper support for whatever processing directive
+ " language they want to use).
+
+ " Conditional sections are simply passed along to let Vim decide what to do
+ " (and hence the user).
+ return -1
+endfunction
+
+let &cpo = s:cpo_save
diff --git a/vim73/indent/dtrace.vim b/vim73/indent/dtrace.vim
new file mode 100644
index 0000000..e41d398
--- /dev/null
+++ b/vim73/indent/dtrace.vim
@@ -0,0 +1,17 @@
+" Vim indent file
+" Language: D script as described in "Solaris Dynamic Tracing Guide",
+" http://docs.sun.com/app/docs/doc/817-6223
+" Last Change: 2008/03/20
+" Version: 1.2
+" Maintainer: Nicolas Weber <nicolasweber@gmx.de>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Built-in C indenting works nicely for dtrace.
+setlocal cindent
+
+let b:undo_indent = "setl cin<"
diff --git a/vim73/indent/dylan.vim b/vim73/indent/dylan.vim
new file mode 100644
index 0000000..0afcbea
--- /dev/null
+++ b/vim73/indent/dylan.vim
@@ -0,0 +1,90 @@
+" Vim indent file
+" Language: Dylan
+" Version: 0.01
+" Last Change: 2003 Feb 04
+" Maintainer: Brent A. Fulgham <bfulgham@debian.org>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys+==~begin,=~block,=~case,=~cleanup,=~define,=~end,=~else,=~elseif,=~exception,=~for,=~finally,=~if,=~otherwise,=~select,=~unless,=~while
+
+" Define the appropriate indent function but only once
+setlocal indentexpr=DylanGetIndent()
+if exists("*DylanGetIndent")
+ finish
+endif
+
+function DylanGetIndent()
+ " Get the line to be indented
+ let cline = getline(v:lnum)
+
+ " Don't reindent comments on first column
+ if cline =~ '^/\[/\*]'
+ return 0
+ endif
+
+ "Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+ "Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let prevline=getline(lnum)
+ let ind = indent(lnum)
+ let chg = 0
+
+ " If previous line was a comment, use its indent
+ if prevline =~ '^\s*//'
+ return ind
+ endif
+
+ " If previous line was a 'define', indent
+ if prevline =~? '\(^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)\|\s*\S*\s*=>$\)'
+ let chg = &sw
+ " local methods indent the shift-width, plus 6 for the 'local'
+ elseif prevline =~? '^\s*local'
+ let chg = &sw + 6
+ " If previous line was a let with no closing semicolon, indent
+ elseif prevline =~? '^\s*let.*[^;]\s*$'
+ let chg = &sw
+ " If previous line opened a parenthesis, and did not close it, indent
+ elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ return = match( prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
+ "elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ elseif prevline =~ '^[^(]*)\s*$'
+ " This line closes a parenthesis. Find opening
+ let curr_line = prevnonblank(lnum - 1)
+ while curr_line >= 0
+ let str = getline(curr_line)
+ if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ let curr_line = prevnonblank(curr_line - 1)
+ else
+ break
+ endif
+ endwhile
+ if curr_line < 0
+ return -1
+ endif
+ let ind = indent(curr_line)
+ " Although we found the closing parenthesis, make sure this
+ " line doesn't start with an indentable command:
+ let curr_str = getline(curr_line)
+ if curr_str =~? '^\s*\(begin\|block\|case\|define\|else\|elseif\|for\|finally\|if\|select\|unless\|while\)'
+ let chg = &sw
+ endif
+ endif
+
+ " If a line starts with end, un-indent (even if we just indented!)
+ if cline =~? '^\s*\(cleanup\|end\|else\|elseif\|exception\|finally\|otherwise\)'
+ let chg = chg - &sw
+ endif
+
+ return ind + chg
+endfunction
+
+" vim:sw=2 tw=130
diff --git a/vim73/indent/eiffel.vim b/vim73/indent/eiffel.vim
new file mode 100644
index 0000000..db66bf8
--- /dev/null
+++ b/vim73/indent/eiffel.vim
@@ -0,0 +1,106 @@
+" Vim indent file
+" Language: Eiffel
+" Maintainer: Jocelyn Fiat <eiffel@djoce.net>
+" Previous-Maintainer: David Clarke <gadicath@dishevelled.net>
+" $Date: 2004/12/09 21:33:52 $
+" $Revision: 1.3 $
+" URL: http://www.djoce.net/page/vim/
+" Last Change: 2004 Sept 14 : removed specific value for tab (sw)
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetEiffelIndent()
+setlocal nolisp
+setlocal nosmartindent
+setlocal nocindent
+setlocal autoindent
+setlocal comments=:--
+setlocal indentkeys+==end,=else,=ensure,=require,=check,=loop,=until
+setlocal indentkeys+==creation,=feature,=inherit,=class,=is,=redefine,=rename,=variant
+setlocal indentkeys+==invariant,=do,=local,=export
+
+" Define some stuff
+" keywords grouped by indenting
+let s:trust_user_indent = '\(+\)\(\s*\(--\).*\)\=$'
+let s:relative_indent = '^\s*\(deferred\|class\|feature\|creation\|inherit\|loop\|from\|until\|if\|else\|elseif\|ensure\|require\|check\|do\|local\|invariant\|variant\|rename\|redefine\|do\|export\)\>'
+let s:outdent = '^\s*\(else\|invariant\|variant\|do\|require\|until\|loop\|local\)\>'
+let s:no_indent = '^\s*\(class\|feature\|creation\|inherit\)\>'
+let s:single_dent = '^[^-]\+[[:alnum:]]\+ is\(\s*\(--\).*\)\=$'
+let s:inheritance_dent = '\s*\(redefine\|rename\|export\)\>'
+
+
+" Only define the function once.
+if exists("*GetEiffelIndent")
+ finish
+endif
+
+function GetEiffelIndent()
+
+ " Eiffel Class indenting
+ "
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " trust the user's indenting
+ if getline(lnum) =~ s:trust_user_indent
+ return -1
+ endif
+
+ " Add a 'shiftwidth' after lines that start with an indent word
+ let ind = indent(lnum)
+ if getline(lnum) =~ s:relative_indent
+ let ind = ind + &sw
+ endif
+
+ " Indent to single indent
+ if getline(v:lnum) =~ s:single_dent && getline(v:lnum) !~ s:relative_indent
+ \ && getline(v:lnum) !~ '\s*\<\(and\|or\|implies\)\>'
+ let ind = &sw
+ endif
+
+ " Indent to double indent
+ if getline(v:lnum) =~ s:inheritance_dent
+ let ind = 2 * &sw
+ endif
+
+ " Indent line after the first line of the function definition
+ if getline(lnum) =~ s:single_dent
+ let ind = ind + &sw
+ endif
+
+ " The following should always be at the start of a line, no indenting
+ if getline(v:lnum) =~ s:no_indent
+ let ind = 0
+ endif
+
+ " Subtract a 'shiftwidth', if this isn't the first thing after the 'is'
+ " or first thing after the 'do'
+ if getline(v:lnum) =~ s:outdent && getline(v:lnum - 1) !~ s:single_dent
+ \ && getline(v:lnum - 1) !~ '^\s*do\>'
+ let ind = ind - &sw
+ endif
+
+ " Subtract a shiftwidth for end statements
+ if getline(v:lnum) =~ '^\s*end\>'
+ let ind = ind - &sw
+ endif
+
+ " set indent of zero end statements that are at an indent of 3, this should
+ " only ever be the class's end.
+ if getline(v:lnum) =~ '^\s*end\>' && ind == &sw
+ let ind = 0
+ endif
+
+ return ind
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/erlang.vim b/vim73/indent/erlang.vim
new file mode 100644
index 0000000..5ce3f82
--- /dev/null
+++ b/vim73/indent/erlang.vim
@@ -0,0 +1,206 @@
+" Vim indent file
+" Language: Erlang
+" Maintainer: Csaba Hoch <csaba.hoch@gmail.com>
+" Contributor: Edwin Fine <efine145_nospam01 at usa dot net>
+" Last Change: 2008 Mar 12
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=ErlangIndent()
+setlocal indentkeys+==after,=end,=catch,=),=],=}
+
+" Only define the functions once.
+if exists("*ErlangIndent")
+ finish
+endif
+
+" The function go through the whole line, analyses it and sets the indentation
+" (ind variable).
+" l: the number of the line to be examined.
+function s:ErlangIndentAtferLine(l)
+ let i = 0 " the index of the current character in the line
+ let length = strlen(a:l) " the length of the line
+ let ind = 0 " how much should be the difference between the indentation of
+ " the current line and the indentation of the next line?
+ " e.g. +1: the indentation of the next line should be equal to
+ " the indentation of the current line plus one shiftwidth
+ let lastFun = 0 " the last token was a 'fun'
+ let lastReceive = 0 " the last token was a 'receive'; needed for 'after'
+ let lastHashMark = 0 " the last token was a 'hashmark'
+
+ while 0<= i && i < length
+
+ " m: the next value of the i
+ if a:l[i] == '%'
+ break
+ elseif a:l[i] == '"'
+ let m = matchend(a:l,'"\%([^"\\]\|\\.\)*"',i)
+ let lastReceive = 0
+ elseif a:l[i] == "'"
+ let m = matchend(a:l,"'[^']*'",i)
+ let lastReceive = 0
+ elseif a:l[i] =~# "[a-z]"
+ let m = matchend(a:l,".[[:alnum:]_]*",i)
+ if lastFun
+ let ind = ind - 1
+ let lastFun = 0
+ let lastReceive = 0
+ elseif a:l[(i):(m-1)] =~# '^\%(case\|if\|try\)$'
+ let ind = ind + 1
+ elseif a:l[(i):(m-1)] =~# '^receive$'
+ let ind = ind + 1
+ let lastReceive = 1
+ elseif a:l[(i):(m-1)] =~# '^begin$'
+ let ind = ind + 2
+ let lastReceive = 0
+ elseif a:l[(i):(m-1)] =~# '^end$'
+ let ind = ind - 2
+ let lastReceive = 0
+ elseif a:l[(i):(m-1)] =~# '^after$'
+ if lastReceive == 0
+ let ind = ind - 1
+ else
+ let ind = ind + 0
+ end
+ let lastReceive = 0
+ elseif a:l[(i):(m-1)] =~# '^fun$'
+ let ind = ind + 1
+ let lastFun = 1
+ let lastReceive = 0
+ endif
+ elseif a:l[i] =~# "[A-Z_]"
+ let m = matchend(a:l,".[[:alnum:]_]*",i)
+ let lastReceive = 0
+ elseif a:l[i] == '$'
+ let m = i+2
+ let lastReceive = 0
+ elseif a:l[i] == "." && (i+1>=length || a:l[i+1]!~ "[0-9]")
+ let m = i+1
+ if lastHashMark
+ let lastHashMark = 0
+ else
+ let ind = ind - 1
+ end
+ let lastReceive = 0
+ elseif a:l[i] == '-' && (i+1<length && a:l[i+1]=='>')
+ let m = i+2
+ let ind = ind + 1
+ let lastReceive = 0
+ elseif a:l[i] == ';'
+ let m = i+1
+ let ind = ind - 1
+ let lastReceive = 0
+ elseif a:l[i] == '#'
+ let m = i+1
+ let lastHashMark = 1
+ elseif a:l[i] =~# '[({[]'
+ let m = i+1
+ let ind = ind + 1
+ let lastFun = 0
+ let lastReceive = 0
+ let lastHashMark = 0
+ elseif a:l[i] =~# '[)}\]]'
+ let m = i+1
+ let ind = ind - 1
+ let lastReceive = 0
+ else
+ let m = i+1
+ endif
+
+ let i = m
+
+ endwhile
+
+ return ind
+
+endfunction
+
+function s:FindPrevNonBlankNonComment(lnum)
+ let lnum = prevnonblank(a:lnum)
+ let line = getline(lnum)
+ " continue to search above if the current line begins with a '%'
+ while line =~# '^\s*%.*$'
+ let lnum = prevnonblank(lnum - 1)
+ if 0 == lnum
+ return 0
+ endif
+ let line = getline(lnum)
+ endwhile
+ return lnum
+endfunction
+
+function ErlangIndent()
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let prevline = getline(lnum)
+ let currline = getline(v:lnum)
+
+ let ind = indent(lnum) + &sw * s:ErlangIndentAtferLine(prevline)
+
+ " special cases:
+ if prevline =~# '^\s*\%(after\|end\)\>'
+ let ind = ind + 2*&sw
+ endif
+ if currline =~# '^\s*end\>'
+ let ind = ind - 2*&sw
+ endif
+ if currline =~# '^\s*after\>'
+ let plnum = s:FindPrevNonBlankNonComment(v:lnum-1)
+ if getline(plnum) =~# '^[^%]*\<receive\>\s*\%(%.*\)\=$'
+ let ind = ind - 1*&sw
+ " If the 'receive' is not in the same line as the 'after'
+ else
+ let ind = ind - 2*&sw
+ endif
+ endif
+ if prevline =~# '^\s*[)}\]]'
+ let ind = ind + 1*&sw
+ endif
+ if currline =~# '^\s*[)}\]]'
+ let ind = ind - 1*&sw
+ endif
+ if prevline =~# '^\s*\%(catch\)\s*\%(%\|$\)'
+ let ind = ind + 1*&sw
+ endif
+ if currline =~# '^\s*\%(catch\)\s*\%(%\|$\)'
+ let ind = ind - 1*&sw
+ endif
+
+ if ind<0
+ let ind = 0
+ endif
+ return ind
+
+endfunction
+
+" TODO:
+"
+" f() ->
+" x("foo
+" bar")
+" ,
+" bad_indent.
+"
+" fun
+" init/0,
+" bad_indent
+"
+" #rec
+" .field,
+" bad_indent
+"
+" case X of
+" 1 when A; B ->
+" bad_indent
+
diff --git a/vim73/indent/eruby.vim b/vim73/indent/eruby.vim
new file mode 100644
index 0000000..a4de118
--- /dev/null
+++ b/vim73/indent/eruby.vim
@@ -0,0 +1,81 @@
+" Vim indent file
+" Language: eRuby
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 May 28
+" URL: http://vim-ruby.rubyforge.org
+" Anon CVS: See above site
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/ruby.vim
+unlet! b:did_indent
+setlocal indentexpr=
+
+if exists("b:eruby_subtype")
+ exe "runtime! indent/".b:eruby_subtype.".vim"
+else
+ runtime! indent/html.vim
+endif
+unlet! b:did_indent
+
+if &l:indentexpr == ''
+ if &l:cindent
+ let &l:indentexpr = 'cindent(v:lnum)'
+ else
+ let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))'
+ endif
+endif
+let b:eruby_subtype_indentexpr = &l:indentexpr
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetErubyIndent()
+setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=else,=elsif,=rescue,=ensure,=when
+
+" Only define the function once.
+if exists("*GetErubyIndent")
+ finish
+endif
+
+function! GetErubyIndent(...)
+ if a:0 && a:1 == '.'
+ let v:lnum = line('.')
+ elseif a:0 && a:1 =~ '^\d'
+ let v:lnum = a:1
+ endif
+ let vcol = col('.')
+ call cursor(v:lnum,1)
+ let inruby = searchpair('<%','','%>','W')
+ call cursor(v:lnum,vcol)
+ if inruby && getline(v:lnum) !~ '^<%\|^\s*-\=%>'
+ let ind = GetRubyIndent()
+ else
+ exe "let ind = ".b:eruby_subtype_indentexpr
+ endif
+ let lnum = prevnonblank(v:lnum-1)
+ let line = getline(lnum)
+ let cline = getline(v:lnum)
+ if cline =~# '^\s*<%-\=\s*\%(}\|end\|else\|\%(ensure\|rescue\|elsif\|when\).\{-\}\)\s*\%(-\=%>\|$\)'
+ let ind = ind - &sw
+ endif
+ if line =~# '\S\s*<%-\=\s*\%(}\|end\).\{-\}\s*\%(-\=%>\|$\)'
+ let ind = ind - &sw
+ endif
+ if line =~# '\%({\|\<do\)\%(\s*|[^|]*|\)\=\s*-\=%>'
+ let ind = ind + &sw
+ elseif line =~# '<%-\=\s*\%(module\|class\|def\|if\|for\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure\|rescue\)\>.*%>'
+ let ind = ind + &sw
+ endif
+ if line =~# '^\s*<%[=#-]\=\s*$' && cline !~# '^\s*end\>'
+ let ind = ind + &sw
+ endif
+ if cline =~# '^\s*-\=%>\s*$'
+ let ind = ind - &sw
+ endif
+ return ind
+endfunction
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/vim73/indent/eterm.vim b/vim73/indent/eterm.vim
new file mode 100644
index 0000000..f25f5f4
--- /dev/null
+++ b/vim73/indent/eterm.vim
@@ -0,0 +1,36 @@
+" Vim indent file
+" Language: Eterm configuration file
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetEtermIndent()
+setlocal indentkeys=!^F,o,O,=end
+setlocal nosmartindent
+
+if exists("*GetEtermIndent")
+ finish
+endif
+
+function GetEtermIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~ '^\s*begin\>'
+ let ind = ind + &sw
+ endif
+
+ if getline(v:lnum) =~ '^\s*end\>'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/falcon.vim b/vim73/indent/falcon.vim
new file mode 100644
index 0000000..933eb61
--- /dev/null
+++ b/vim73/indent/falcon.vim
@@ -0,0 +1,156 @@
+" Vim indent file
+" Language: Falcon
+" Maintainer: Steven Oliver <oliver.steven@gmail.com>
+" Website: https://steveno@github.com/steveno/falconpl-vim.git
+" Credits: Thanks to the ruby.vim authors, I borrow a lot!
+" Previous Maintainer: Brent A. Fulgham <bfulgham@debian.org>
+" -----------------------------------------------------------
+" GetLatestVimScripts: 2752 1 :AutoInstall: falcon.vim
+
+"======================================
+" SETUP
+"======================================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Setup indent function and when to use it
+setlocal indentexpr=FalconGetIndent()
+setlocal indentkeys=0{,0},0),0],!^F,o,O,e
+setlocal indentkeys+==~case,=~catch,=~default,=~elif,=~else,=~end,=~\"
+
+" Define the appropriate indent function but only once
+if exists("*FalconGetIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+"======================================
+" VARIABLES
+"======================================
+
+" Regex of syntax group names that are strings AND comments
+let s:syng_strcom = '\<falcon\%(String\|StringEscape\|Comment\)\>'
+
+" Regex of syntax group names that are strings
+let s:syng_string = '\<falcon\%(String\|StringEscape\)\>'
+
+" Keywords to indent on
+let s:falcon_indent_keywords = '^\s*\(case\|catch\|class\|enum\|default\|elif\|else' .
+ \ '\|for\|function\|if.*"[^"]*:.*"\|if \(\(:\)\@!.\)*$\|loop\|object\|select' .
+ \ '\|switch\|try\|while\|\w*\s*=\s*\w*([$\)'
+
+" Keywords to deindent on
+let s:falcon_deindent_keywords = '^\s*\(case\|catch\|default\|elif\|else\|end\)'
+
+"======================================
+" FUNCTIONS
+"======================================
+
+" Check if the character at lnum:col is inside a string
+function s:IsInStringOrComment(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
+endfunction
+
+"======================================
+" INDENT ROUTINE
+"======================================
+
+function FalconGetIndent()
+ " Get the line to be indented
+ let cline = getline(v:lnum)
+
+ " Don't reindent comments on first column
+ if cline =~ '^\/\/'
+ return 0
+ endif
+
+ " Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let prevline=getline(lnum)
+ let ind = indent(lnum)
+ let chg = 0
+
+ " If we are in a multi-line string or line-comment, don't do anything
+ if s:IsInStringOrComment(v:lnum, matchend(cline, '^\s*') + 1 )
+ return indent('.')
+ endif
+
+ " If the start of the line equals a double quote, then indent to the
+ " previous lines first double quote
+ if cline =~? '^\s*"'
+ let chg = chg + &sw
+ endif
+
+ " If previous line started with a double quote and this one
+ " doesn't, unindent
+ if prevline =~? '^\s*"' && cline =~? '^\s*'
+ let chg = chg - &sw
+ endif
+
+ " Indent if proper keyword
+ if prevline =~? s:falcon_indent_keywords
+ let chg = &sw
+ " If previous line opened a parenthesis, and did not close it, indent
+ elseif prevline =~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ " Make sure this isn't just a function split between two lines
+ if prevline =~ ',\s*$'
+ return indent(prevnonblank(v:lnum - 1)) + &sw
+ else
+ return match(prevline, '(.*\((.*)\|[^)]\)*.*$') + 1
+ endif
+ elseif prevline =~ '^[^(]*)\s*$'
+ " This line closes a parenthesis. Finds opening.
+ let curr_line = prevnonblank(lnum - 1)
+ while curr_line >= 0
+ let str = getline(curr_line)
+ if str !~ '^.*(\s*[^)]*\((.*)\)*[^)]*$'
+ let curr_line = prevnonblank(curr_line - 1)
+ else
+ break
+ endif
+ endwhile
+ if curr_line < 0
+ return -1
+ endif
+ let ind = indent(curr_line)
+ endif
+
+ " If previous line ends in a semi-colon reset indent to previous
+ " lines setting
+ if prevline =~? ';\s*$' && prevnonblank(prevline) =~? ',\s*$'
+ return chg = chg - (2 * &sw)
+ endif
+
+ " If previous line ended in a comma, indent again
+ if prevline =~? ',\s*$'
+ let chg = chg + &sw
+ endif
+
+ " If previous line ended in a =>, indent again
+ if prevline =~? '=>\s*$'
+ let chg = chg + &sw
+ endif
+
+ " Deindent on proper keywords
+ if cline =~? s:falcon_deindent_keywords
+ let chg = chg - &sw
+ endif
+
+ return ind + chg
+endfunction
+
+" vim: set sw=4 sts=4 et tw=80 :
diff --git a/vim73/indent/fortran.vim b/vim73/indent/fortran.vim
new file mode 100644
index 0000000..4ff0700
--- /dev/null
+++ b/vim73/indent/fortran.vim
@@ -0,0 +1,166 @@
+" Vim indent file
+" Language: Fortran95 (and Fortran90, Fortran77, F and elf90)
+" Version: 0.38
+" Last Change: 2010 July 21
+" Maintainer: Ajit J. Thakkar <ajit@unb.ca>; <http://www.unb.ca/chem/ajit/>
+" Usage: Do :help fortran-indent from Vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys+==~end,=~case,=~if,=~else,=~do,=~where,=~elsewhere,=~select
+setlocal indentkeys+==~endif,=~enddo,=~endwhere,=~endselect
+setlocal indentkeys+==~type,=~interface
+
+" Determine whether this is a fixed or free format source file
+" if this hasn't been done yet
+if !exists("b:fortran_fixed_source")
+ if exists("fortran_free_source")
+ " User guarantees free source form
+ let b:fortran_fixed_source = 0
+ elseif exists("fortran_fixed_source")
+ " User guarantees fixed source form
+ let b:fortran_fixed_source = 1
+ else
+ " f90 and f95 allow both fixed and free source form
+ " assume fixed source form unless signs of free source form
+ " are detected in the first five columns of the first 250 lines
+ " Detection becomes more accurate and time-consuming if more lines
+ " are checked. Increase the limit below if you keep lots of comments at
+ " the very top of each file and you have a fast computer
+ let s:lmax = 500
+ if ( s:lmax > line("$") )
+ let s:lmax = line("$")
+ endif
+ let b:fortran_fixed_source = 1
+ let s:ln=1
+ while s:ln <= s:lmax
+ let s:test = strpart(getline(s:ln),0,5)
+ if s:test !~ '^[Cc*]' && s:test !~ '^ *[!#]' && s:test =~ '[^ 0-9\t]' && s:test !~ '^[ 0-9]*\t'
+ let b:fortran_fixed_source = 0
+ break
+ endif
+ let s:ln = s:ln + 1
+ endwhile
+ endif
+endif
+
+" Define the appropriate indent function but only once
+if (b:fortran_fixed_source == 1)
+ setlocal indentexpr=FortranGetFixedIndent()
+ if exists("*FortranGetFixedIndent")
+ finish
+ endif
+else
+ setlocal indentexpr=FortranGetFreeIndent()
+ if exists("*FortranGetFreeIndent")
+ finish
+ endif
+endif
+
+let s:cposet=&cpoptions
+set cpoptions-=C
+
+function FortranGetIndent(lnum)
+ let ind = indent(a:lnum)
+ let prevline=getline(a:lnum)
+ " Strip tail comment
+ let prevstat=substitute(prevline, '!.*$', '', '')
+
+ "Indent do loops only if they are all guaranteed to be of do/end do type
+ if exists("b:fortran_do_enddo") || exists("g:fortran_do_enddo")
+ if prevstat =~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*do\>'
+ let ind = ind + &sw
+ endif
+ if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*end\s*do\>'
+ let ind = ind - &sw
+ endif
+ endif
+
+ "Add a shiftwidth to statements following if, else, case,
+ "where, elsewhere, type and interface statements
+ if prevstat =~? '^\s*\(\d\+\s\)\=\s*\(else\|case\|where\|elsewhere\)\>'
+ \ ||prevstat =~? '^\s*\(\d\+\s\)\=\s*\(type\|interface\)\>'
+ \ || prevstat =~? '^\s*\(\d\+\s\)\=\s*\(\a\w*\s*:\)\=\s*if\>'
+ let ind = ind + &sw
+ " Remove unwanted indent after logical and arithmetic ifs
+ if prevstat =~? '\<if\>' && prevstat !~? '\<then\>'
+ let ind = ind - &sw
+ endif
+ " Remove unwanted indent after type( statements
+ if prevstat =~? '\<type\s*('
+ let ind = ind - &sw
+ endif
+ endif
+
+ "Subtract a shiftwidth from else, elsewhere, case, end if,
+ " end where, end select, end interface and end type statements
+ if getline(v:lnum) =~? '^\s*\(\d\+\s\)\=\s*'
+ \. '\(else\|elsewhere\|case\|end\s*\(if\|where\|select\|interface\|type\)\)\>'
+ let ind = ind - &sw
+ " Fix indent for case statement immediately after select
+ if prevstat =~? '\<select\>'
+ let ind = ind + &sw
+ endif
+ endif
+
+ return ind
+endfunction
+
+function FortranGetFreeIndent()
+ "Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ "Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let ind=FortranGetIndent(lnum)
+ return ind
+endfunction
+
+function FortranGetFixedIndent()
+ let currline=getline(v:lnum)
+ "Don't indent comments, continuation lines and labelled lines
+ if strpart(currline,0,6) =~ '[^ \t]'
+ let ind = indent(v:lnum)
+ return ind
+ endif
+
+ "Find the previous line which is not blank, not a comment,
+ "not a continuation line, and does not have a label
+ let lnum = v:lnum - 1
+ while lnum > 0
+ let prevline=getline(lnum)
+ if (prevline =~ "^[C*!]") || (prevline =~ "^\s*$")
+ \ || (strpart(prevline,5,1) !~ "[ 0]")
+ " Skip comments, blank lines and continuation lines
+ let lnum = lnum - 1
+ else
+ let test=strpart(prevline,0,5)
+ if test =~ "[0-9]"
+ " Skip lines with statement numbers
+ let lnum = lnum - 1
+ else
+ break
+ endif
+ endif
+ endwhile
+
+ "First line must begin at column 7
+ if lnum == 0
+ return 6
+ endif
+
+ let ind=FortranGetIndent(lnum)
+ return ind
+endfunction
+
+let &cpoptions=s:cposet
+unlet s:cposet
+
+" vim:sw=2 tw=130
diff --git a/vim73/indent/framescript.vim b/vim73/indent/framescript.vim
new file mode 100644
index 0000000..49ff92a
--- /dev/null
+++ b/vim73/indent/framescript.vim
@@ -0,0 +1,41 @@
+" Vim indent file
+" Language: FrameScript
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2008-07-19
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetFrameScriptIndent()
+setlocal indentkeys=!^F,o,O,0=~Else,0=~EndIf,0=~EndLoop,0=~EndSub
+setlocal nosmartindent
+
+if exists("*GetFrameScriptIndent")
+ finish
+endif
+
+function GetFrameScriptIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+
+ if lnum == 0
+ return 0
+ endif
+
+ if getline(v:lnum) =~ '^\s*\*'
+ return cindent(v:lnum)
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~? '^\s*\%(If\|Loop\|Sub\)'
+ let ind = ind + &sw
+ endif
+
+ if getline(v:lnum) =~? '^\s*\%(Else\|End\%(If\|Loop\|Sub\)\)'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/gitconfig.vim b/vim73/indent/gitconfig.vim
new file mode 100644
index 0000000..fa57e56
--- /dev/null
+++ b/vim73/indent/gitconfig.vim
@@ -0,0 +1,35 @@
+" Vim indent file
+" Language: git config file
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 May 21
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetGitconfigIndent()
+setlocal indentkeys=o,O,*<Return>,0[,],0;,0#,=,!^F
+
+" Only define the function once.
+if exists("*GetGitconfigIndent")
+ finish
+endif
+
+function! GetGitconfigIndent()
+ let line = getline(prevnonblank(v:lnum-1))
+ let cline = getline(v:lnum)
+ if line =~ '\\\@<!\%(\\\\\)*\\$'
+ " odd number of slashes, in a line continuation
+ return 2 * &sw
+ elseif cline =~ '^\s*\['
+ return 0
+ elseif cline =~ '^\s*\a'
+ return &sw
+ elseif cline == '' && line =~ '^\['
+ return &sw
+ else
+ return -1
+ endif
+endfunction
diff --git a/vim73/indent/haml.vim b/vim73/indent/haml.vim
new file mode 100644
index 0000000..58c0307
--- /dev/null
+++ b/vim73/indent/haml.vim
@@ -0,0 +1,73 @@
+" Vim indent file
+" Language: Haml
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 May 21
+
+if exists("b:did_indent")
+ finish
+endif
+runtime! indent/ruby.vim
+unlet! b:did_indent
+let b:did_indent = 1
+
+setlocal autoindent sw=2 et
+setlocal indentexpr=GetHamlIndent()
+setlocal indentkeys=o,O,*<Return>,},],0),!^F,=end,=else,=elsif,=rescue,=ensure,=when
+
+" Only define the function once.
+if exists("*GetHamlIndent")
+ finish
+endif
+
+let s:attributes = '\%({.\{-\}}\|\[.\{-\}\]\)'
+let s:tag = '\%([%.#][[:alnum:]_-]\+\|'.s:attributes.'\)*[<>]*'
+
+if !exists('g:haml_self_closing_tags')
+ let g:haml_self_closing_tags = 'meta|link|img|hr|br'
+endif
+
+function! GetHamlIndent()
+ let lnum = prevnonblank(v:lnum-1)
+ if lnum == 0
+ return 0
+ endif
+ let line = substitute(getline(lnum),'\s\+$','','')
+ let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','')
+ let lastcol = strlen(line)
+ let line = substitute(line,'^\s\+','','')
+ let indent = indent(lnum)
+ let cindent = indent(v:lnum)
+ if cline =~# '\v^-\s*%(elsif|else|when)>'
+ let indent = cindent < indent ? cindent : indent - &sw
+ endif
+ let increase = indent + &sw
+ if indent == indent(lnum)
+ let indent = cindent <= indent ? -1 : increase
+ endif
+
+ let group = synIDattr(synID(lnum,lastcol,1),'name')
+
+ if line =~ '^!!!'
+ return indent
+ elseif line =~ '^/\%(\[[^]]*\]\)\=$'
+ return increase
+ elseif group == 'hamlFilter'
+ return increase
+ elseif line =~ '^'.s:tag.'[&!]\=[=~-]\s*\%(\%(if\|else\|elsif\|unless\|case\|when\|while\|until\|for\|begin\|module\|class\|def\)\>\%(.*\<end\>\)\@!\|.*do\%(\s*|[^|]*|\)\=\s*$\)'
+ return increase
+ elseif line =~ '^'.s:tag.'[&!]\=[=~-].*,\s*$'
+ return increase
+ elseif line == '-#'
+ return increase
+ elseif group =~? '\v^(hamlSelfCloser)$' || line =~? '^%\v%('.g:haml_self_closing_tags.')>'
+ return indent
+ elseif group =~? '\v^%(hamlTag|hamlAttributesDelimiter|hamlObjectDelimiter|hamlClass|hamlId|htmlTagName|htmlSpecialTagName)$'
+ return increase
+ elseif synIDattr(synID(v:lnum,1,1),'name') ==? 'hamlRubyFilter'
+ return GetRubyIndent()
+ else
+ return indent
+ endif
+endfunction
+
+" vim:set sw=2:
diff --git a/vim73/indent/hamster.vim b/vim73/indent/hamster.vim
new file mode 100644
index 0000000..93e7db4
--- /dev/null
+++ b/vim73/indent/hamster.vim
@@ -0,0 +1,55 @@
+" Vim indent file
+" Language: Hamster Script
+" Version: 2.0.6.0
+" Last Change: Wed Nov 08 2006 12:02:42 PM
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys+==~if,=~else,=~endif,=~endfor,=~endwhile
+setlocal indentkeys+==~do,=~until,=~while,=~repeat,=~for,=~loop
+setlocal indentkeys+==~sub,=~endsub
+
+" Define the appropriate indent function but only once
+setlocal indentexpr=HamGetFreeIndent()
+if exists("*HamGetFreeIndent")
+ finish
+endif
+
+function HamGetIndent(lnum)
+ let ind = indent(a:lnum)
+ let prevline=getline(a:lnum)
+
+ " Add a shiftwidth to statements following if, else, elseif,
+ " case, select, default, do, until, while, for, start
+ if prevline =~? '^\s*\<\(if\|else\%(if\)\?\|for\|repeat\|do\|while\|sub\)\>'
+ let ind = ind + &sw
+ endif
+
+ " Subtract a shiftwidth from else, elseif, end(if|while|for), until
+ let line = getline(v:lnum)
+ if line =~? '^\s*\(else\|elseif\|loop\|until\|end\%(if\|while\|for\|sub\)\)\>'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
+
+function HamGetFreeIndent()
+ " Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let ind=HamGetIndent(lnum)
+ return ind
+endfunction
+
+" vim:sw=2 tw=80
diff --git a/vim73/indent/html.vim b/vim73/indent/html.vim
new file mode 100644
index 0000000..6f016ad
--- /dev/null
+++ b/vim73/indent/html.vim
@@ -0,0 +1,242 @@
+" Description: html indenter
+" Author: Johannes Zellner <johannes@zellner.org>
+" Last Change: Mo, 05 Jun 2006 22:32:41 CEST
+" Restoring 'cpo' and 'ic' added by Bram 2006 May 5
+" Globals: g:html_indent_tags -- indenting tags
+" g:html_indent_strict -- inhibit 'O O' elements
+" g:html_indent_strict_table -- inhibit 'O -' elements
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+
+" [-- local settings (must come before aborting the script) --]
+setlocal indentexpr=HtmlIndentGet(v:lnum)
+setlocal indentkeys=o,O,*<Return>,<>>,{,}
+
+
+if exists('g:html_indent_tags')
+ unlet g:html_indent_tags
+endif
+
+" [-- helper function to assemble tag list --]
+fun! <SID>HtmlIndentPush(tag)
+ if exists('g:html_indent_tags')
+ let g:html_indent_tags = g:html_indent_tags.'\|'.a:tag
+ else
+ let g:html_indent_tags = a:tag
+ endif
+endfun
+
+
+" [-- <ELEMENT ? - - ...> --]
+call <SID>HtmlIndentPush('a')
+call <SID>HtmlIndentPush('abbr')
+call <SID>HtmlIndentPush('acronym')
+call <SID>HtmlIndentPush('address')
+call <SID>HtmlIndentPush('b')
+call <SID>HtmlIndentPush('bdo')
+call <SID>HtmlIndentPush('big')
+call <SID>HtmlIndentPush('blockquote')
+call <SID>HtmlIndentPush('button')
+call <SID>HtmlIndentPush('caption')
+call <SID>HtmlIndentPush('center')
+call <SID>HtmlIndentPush('cite')
+call <SID>HtmlIndentPush('code')
+call <SID>HtmlIndentPush('colgroup')
+call <SID>HtmlIndentPush('del')
+call <SID>HtmlIndentPush('dfn')
+call <SID>HtmlIndentPush('dir')
+call <SID>HtmlIndentPush('div')
+call <SID>HtmlIndentPush('dl')
+call <SID>HtmlIndentPush('em')
+call <SID>HtmlIndentPush('fieldset')
+call <SID>HtmlIndentPush('font')
+call <SID>HtmlIndentPush('form')
+call <SID>HtmlIndentPush('frameset')
+call <SID>HtmlIndentPush('h1')
+call <SID>HtmlIndentPush('h2')
+call <SID>HtmlIndentPush('h3')
+call <SID>HtmlIndentPush('h4')
+call <SID>HtmlIndentPush('h5')
+call <SID>HtmlIndentPush('h6')
+call <SID>HtmlIndentPush('i')
+call <SID>HtmlIndentPush('iframe')
+call <SID>HtmlIndentPush('ins')
+call <SID>HtmlIndentPush('kbd')
+call <SID>HtmlIndentPush('label')
+call <SID>HtmlIndentPush('legend')
+call <SID>HtmlIndentPush('map')
+call <SID>HtmlIndentPush('menu')
+call <SID>HtmlIndentPush('noframes')
+call <SID>HtmlIndentPush('noscript')
+call <SID>HtmlIndentPush('object')
+call <SID>HtmlIndentPush('ol')
+call <SID>HtmlIndentPush('optgroup')
+" call <SID>HtmlIndentPush('pre')
+call <SID>HtmlIndentPush('q')
+call <SID>HtmlIndentPush('s')
+call <SID>HtmlIndentPush('samp')
+call <SID>HtmlIndentPush('script')
+call <SID>HtmlIndentPush('select')
+call <SID>HtmlIndentPush('small')
+call <SID>HtmlIndentPush('span')
+call <SID>HtmlIndentPush('strong')
+call <SID>HtmlIndentPush('style')
+call <SID>HtmlIndentPush('sub')
+call <SID>HtmlIndentPush('sup')
+call <SID>HtmlIndentPush('table')
+call <SID>HtmlIndentPush('textarea')
+call <SID>HtmlIndentPush('title')
+call <SID>HtmlIndentPush('tt')
+call <SID>HtmlIndentPush('u')
+call <SID>HtmlIndentPush('ul')
+call <SID>HtmlIndentPush('var')
+
+
+" [-- <ELEMENT ? O O ...> --]
+if !exists('g:html_indent_strict')
+ call <SID>HtmlIndentPush('body')
+ call <SID>HtmlIndentPush('head')
+ call <SID>HtmlIndentPush('html')
+ call <SID>HtmlIndentPush('tbody')
+endif
+
+
+" [-- <ELEMENT ? O - ...> --]
+if !exists('g:html_indent_strict_table')
+ call <SID>HtmlIndentPush('th')
+ call <SID>HtmlIndentPush('td')
+ call <SID>HtmlIndentPush('tr')
+ call <SID>HtmlIndentPush('tfoot')
+ call <SID>HtmlIndentPush('thead')
+endif
+
+delfun <SID>HtmlIndentPush
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+" [-- count indent-increasing tags of line a:lnum --]
+fun! <SID>HtmlIndentOpen(lnum, pattern)
+ let s = substitute('x'.getline(a:lnum),
+ \ '.\{-}\(\(<\)\('.a:pattern.'\)\>\)', "\1", 'g')
+ let s = substitute(s, "[^\1].*$", '', '')
+ return strlen(s)
+endfun
+
+" [-- count indent-decreasing tags of line a:lnum --]
+fun! <SID>HtmlIndentClose(lnum, pattern)
+ let s = substitute('x'.getline(a:lnum),
+ \ '.\{-}\(\(<\)/\('.a:pattern.'\)\>>\)', "\1", 'g')
+ let s = substitute(s, "[^\1].*$", '', '')
+ return strlen(s)
+endfun
+
+" [-- count indent-increasing '{' of (java|css) line a:lnum --]
+fun! <SID>HtmlIndentOpenAlt(lnum)
+ return strlen(substitute(getline(a:lnum), '[^{]\+', '', 'g'))
+endfun
+
+" [-- count indent-decreasing '}' of (java|css) line a:lnum --]
+fun! <SID>HtmlIndentCloseAlt(lnum)
+ return strlen(substitute(getline(a:lnum), '[^}]\+', '', 'g'))
+endfun
+
+" [-- return the sum of indents respecting the syntax of a:lnum --]
+fun! <SID>HtmlIndentSum(lnum, style)
+ if a:style == match(getline(a:lnum), '^\s*</')
+ if a:style == match(getline(a:lnum), '^\s*</\<\('.g:html_indent_tags.'\)\>')
+ let open = <SID>HtmlIndentOpen(a:lnum, g:html_indent_tags)
+ let close = <SID>HtmlIndentClose(a:lnum, g:html_indent_tags)
+ if 0 != open || 0 != close
+ return open - close
+ endif
+ endif
+ endif
+ if '' != &syntax &&
+ \ synIDattr(synID(a:lnum, 1, 1), 'name') =~ '\(css\|java\).*' &&
+ \ synIDattr(synID(a:lnum, strlen(getline(a:lnum)), 1), 'name')
+ \ =~ '\(css\|java\).*'
+ if a:style == match(getline(a:lnum), '^\s*}')
+ return <SID>HtmlIndentOpenAlt(a:lnum) - <SID>HtmlIndentCloseAlt(a:lnum)
+ endif
+ endif
+ return 0
+endfun
+
+fun! HtmlIndentGet(lnum)
+ " Find a non-empty line above the current line.
+ let lnum = prevnonblank(a:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let restore_ic = &ic
+ setlocal ic " ignore case
+
+ " [-- special handling for <pre>: no indenting --]
+ if getline(a:lnum) =~ '\c</pre>'
+ \ || 0 < searchpair('\c<pre>', '', '\c</pre>', 'nWb')
+ \ || 0 < searchpair('\c<pre>', '', '\c</pre>', 'nW')
+ " we're in a line with </pre> or inside <pre> ... </pre>
+ if restore_ic == 0
+ setlocal noic
+ endif
+ return -1
+ endif
+
+ " [-- special handling for <javascript>: use cindent --]
+ let js = '<script.*type\s*=\s*.*java'
+
+ """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
+ " by Tye Zdrojewski <zdro@yahoo.com>, 05 Jun 2006
+ " ZDR: This needs to be an AND (we are 'after the start of the pair' AND
+ " we are 'before the end of the pair'). Otherwise, indentation
+ " before the start of the script block will be affected; the end of
+ " the pair will still match if we are before the beginning of the
+ " pair.
+ "
+ if 0 < searchpair(js, '', '</script>', 'nWb')
+ \ && 0 < searchpair(js, '', '</script>', 'nW')
+ " we're inside javascript
+ if getline(lnum) !~ js && getline(a:lnum) != '</script>'
+ if restore_ic == 0
+ setlocal noic
+ endif
+ return cindent(a:lnum)
+ endif
+ endif
+
+ if getline(lnum) =~ '\c</pre>'
+ " line before the current line a:lnum contains
+ " a closing </pre>. --> search for line before
+ " starting <pre> to restore the indent.
+ let preline = prevnonblank(search('\c<pre>', 'bW') - 1)
+ if preline > 0
+ if restore_ic == 0
+ setlocal noic
+ endif
+ return indent(preline)
+ endif
+ endif
+
+ let ind = <SID>HtmlIndentSum(lnum, -1)
+ let ind = ind + <SID>HtmlIndentSum(a:lnum, 0)
+
+ if restore_ic == 0
+ setlocal noic
+ endif
+
+ return indent(lnum) + (&sw * ind)
+endfun
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" [-- EOF <runtime>/indent/html.vim --]
diff --git a/vim73/indent/htmldjango.vim b/vim73/indent/htmldjango.vim
new file mode 100644
index 0000000..8da9fe3
--- /dev/null
+++ b/vim73/indent/htmldjango.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: Django HTML template
+" Maintainer: Dave Hodder <dmh@dmh.org.uk>
+" Last Change: 2007 Jan 25
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use HTML formatting rules.
+runtime! indent/html.vim
diff --git a/vim73/indent/idlang.vim b/vim73/indent/idlang.vim
new file mode 100644
index 0000000..97c31ad
--- /dev/null
+++ b/vim73/indent/idlang.vim
@@ -0,0 +1,63 @@
+" IDL (Interactive Data Language) indent file.
+" Language: IDL (ft=idlang)
+" Last change: 2002 Sep 23
+" Maintainer: Aleksandar Jelenak <ajelenak AT yahoo.com>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentkeys=o,O,0=endif,0=ENDIF,0=endelse,0=ENDELSE,0=endwhile,
+ \0=ENDWHILE,0=endfor,0=ENDFOR,0=endrep,0=ENDREP
+
+setlocal indentexpr=GetIdlangIndent(v:lnum)
+
+" Only define the function once.
+if exists("*GetIdlangIndent")
+ finish
+endif
+
+function GetIdlangIndent(lnum)
+ " First non-empty line above the current line.
+ let pnum = prevnonblank(v:lnum-1)
+ " v:lnum is the first non-empty line -- zero indent.
+ if pnum == 0
+ return 0
+ endif
+ " Second non-empty line above the current line.
+ let pnum2 = prevnonblank(pnum-1)
+
+ " Current indent.
+ let curind = indent(pnum)
+
+ " Indenting of continued lines.
+ if getline(pnum) =~ '\$\s*\(;.*\)\=$'
+ if getline(pnum2) !~ '\$\s*\(;.*\)\=$'
+ let curind = curind+&sw
+ endif
+ else
+ if getline(pnum2) =~ '\$\s*\(;.*\)\=$'
+ let curind = curind-&sw
+ endif
+ endif
+
+ " Indenting blocks of statements.
+ if getline(v:lnum) =~? '^\s*\(endif\|endelse\|endwhile\|endfor\|endrep\)\>'
+ if getline(pnum) =~? 'begin\>'
+ elseif indent(v:lnum) > curind-&sw
+ let curind = curind-&sw
+ else
+ return -1
+ endif
+ elseif getline(pnum) =~? 'begin\>'
+ if indent(v:lnum) < curind+&sw
+ let curind = curind+&sw
+ else
+ return -1
+ endif
+ endif
+ return curind
+endfunction
+
diff --git a/vim73/indent/ishd.vim b/vim73/indent/ishd.vim
new file mode 100644
index 0000000..f55f7dc
--- /dev/null
+++ b/vim73/indent/ishd.vim
@@ -0,0 +1,68 @@
+" Description: InstallShield indenter
+" Author: Johannes Zellner <johannes@zellner.org>
+" Last Change: Tue, 27 Apr 2004 14:54:59 CEST
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetIshdIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==else,=elseif,=endif,=end,=begin,<:>
+" setlocal indentkeys-=0#
+
+let b:undo_indent = "setl ai< indentexpr< indentkeys<"
+
+" Only define the function once.
+if exists("*GetIshdIndent")
+ finish
+endif
+
+fun! GetIshdIndent(lnum)
+ " labels and preprocessor get zero indent immediately
+ let this_line = getline(a:lnum)
+ let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)'
+ let LABELS_OR_PREPROC_EXCEPT = '^\s*\<default\+\>:'
+ if this_line =~ LABELS_OR_PREPROC && this_line !~ LABELS_OR_PREPROC_EXCEPT
+ return 0
+ endif
+
+ " Find a non-blank line above the current line.
+ " Skip over labels and preprocessor directives.
+ let lnum = a:lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let previous_line = getline(lnum)
+ if previous_line !~ LABELS_OR_PREPROC || previous_line =~ LABELS_OR_PREPROC_EXCEPT
+ break
+ endif
+ endwhile
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ " Add
+ if previous_line =~ '^\s*\<\(function\|begin\|switch\|case\|default\|if.\{-}then\|else\|elseif\|while\|repeat\)\>'
+ let ind = ind + &sw
+ endif
+
+ " Subtract
+ if this_line =~ '^\s*\<endswitch\>'
+ let ind = ind - 2 * &sw
+ elseif this_line =~ '^\s*\<\(begin\|end\|endif\|endwhile\|else\|elseif\|until\)\>'
+ let ind = ind - &sw
+ elseif this_line =~ '^\s*\<\(case\|default\)\>'
+ if previous_line !~ '^\s*\<switch\>'
+ let ind = ind - &sw
+ endif
+ endif
+
+ return ind
+endfun
diff --git a/vim73/indent/java.vim b/vim73/indent/java.vim
new file mode 100644
index 0000000..facbdbf
--- /dev/null
+++ b/vim73/indent/java.vim
@@ -0,0 +1,130 @@
+" Vim indent file
+" Language: Java
+" Maintainer: Toby Allsopp <toby.allsopp@peace.com> (resigned)
+" Last Change: 2005 Mar 28
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Indent Java anonymous classes correctly.
+setlocal cindent cinoptions& cinoptions+=j1
+
+" The "extends" and "implements" lines start off with the wrong indent.
+setlocal indentkeys& indentkeys+=0=extends indentkeys+=0=implements
+
+" Set the function to do the work.
+setlocal indentexpr=GetJavaIndent()
+
+let b:undo_indent = "set cin< cino< indentkeys< indentexpr<"
+
+" Only define the function once.
+if exists("*GetJavaIndent")
+ finish
+endif
+
+function! SkipJavaBlanksAndComments(startline)
+ let lnum = a:startline
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ if getline(lnum) =~ '\*/\s*$'
+ while getline(lnum) !~ '/\*' && lnum > 1
+ let lnum = lnum - 1
+ endwhile
+ if getline(lnum) =~ '^\s*/\*'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+ elseif getline(lnum) =~ '^\s*//'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function GetJavaIndent()
+
+ " Java is just like C; use the built-in C indenting and then correct a few
+ " specific cases.
+ let theIndent = cindent(v:lnum)
+
+ " If we're in the middle of a comment then just trust cindent
+ if getline(v:lnum) =~ '^\s*\*'
+ return theIndent
+ endif
+
+ " find start of previous line, in case it was a continuation line
+ let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+ let prev = lnum
+ while prev > 1
+ let next_prev = SkipJavaBlanksAndComments(prev - 1)
+ if getline(next_prev) !~ ',\s*$'
+ break
+ endif
+ let prev = next_prev
+ endwhile
+
+ " Try to align "throws" lines for methods and "extends" and "implements" for
+ " classes.
+ if getline(v:lnum) =~ '^\s*\(extends\|implements\)\>'
+ \ && getline(lnum) !~ '^\s*\(extends\|implements\)\>'
+ let theIndent = theIndent + &sw
+ endif
+
+ " correct for continuation lines of "throws", "implements" and "extends"
+ let cont_kw = matchstr(getline(prev),
+ \ '^\s*\zs\(throws\|implements\|extends\)\>\ze.*,\s*$')
+ if strlen(cont_kw) > 0
+ let amount = strlen(cont_kw) + 1
+ if getline(lnum) !~ ',\s*$'
+ let theIndent = theIndent - (amount + &sw)
+ if theIndent < 0
+ let theIndent = 0
+ endif
+ elseif prev == lnum
+ let theIndent = theIndent + amount
+ if cont_kw ==# 'throws'
+ let theIndent = theIndent + &sw
+ endif
+ endif
+ elseif getline(prev) =~ '^\s*\(throws\|implements\|extends\)\>'
+ \ && (getline(prev) =~ '{\s*$'
+ \ || getline(v:lnum) =~ '^\s*{\s*$')
+ let theIndent = theIndent - &sw
+ endif
+
+ " When the line starts with a }, try aligning it with the matching {,
+ " skipping over "throws", "extends" and "implements" clauses.
+ if getline(v:lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$'
+ call cursor(v:lnum, 1)
+ silent normal %
+ let lnum = line('.')
+ if lnum < v:lnum
+ while lnum > 1
+ let next_lnum = SkipJavaBlanksAndComments(lnum - 1)
+ if getline(lnum) !~ '^\s*\(throws\|extends\|implements\)\>'
+ \ && getline(next_lnum) !~ ',\s*$'
+ break
+ endif
+ let lnum = prevnonblank(next_lnum)
+ endwhile
+ return indent(lnum)
+ endif
+ endif
+
+ " Below a line starting with "}" never indent more. Needed for a method
+ " below a method with an indented "throws" clause.
+ let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+ if getline(lnum) =~ '^\s*}\s*\(//.*\|/\*.*\)\=$' && indent(lnum) < theIndent
+ let theIndent = indent(lnum)
+ endif
+
+ return theIndent
+endfunction
+
+" vi: sw=2 et
diff --git a/vim73/indent/javascript.vim b/vim73/indent/javascript.vim
new file mode 100644
index 0000000..a83d34b
--- /dev/null
+++ b/vim73/indent/javascript.vim
@@ -0,0 +1,16 @@
+" Vim indent file
+" Language: Javascript
+" Maintainer: None! Wanna improve this?
+" Last Change: 2007 Jan 22
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" C indenting is not too bad.
+setlocal cindent
+setlocal cinoptions+=j1,J1
+
+let b:undo_indent = "setl cin<"
diff --git a/vim73/indent/jsp.vim b/vim73/indent/jsp.vim
new file mode 100644
index 0000000..6f7069e
--- /dev/null
+++ b/vim73/indent/jsp.vim
@@ -0,0 +1,17 @@
+" Vim filetype indent file
+" Language: JSP files
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+" Version: 1.0
+" Last Change: Wed Nov 08 2006 11:08:05 AM
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" If there has been no specific JSP indent script created,
+" use the default html indent script which will handle
+" html, javascript and most of the JSP constructs.
+runtime! indent/html.vim
+
+
diff --git a/vim73/indent/ld.vim b/vim73/indent/ld.vim
new file mode 100644
index 0000000..eccf42b
--- /dev/null
+++ b/vim73/indent/ld.vim
@@ -0,0 +1,84 @@
+" Vim indent file
+" Language: ld(1) script
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetLDIndent()
+setlocal indentkeys=0{,0},!^F,o,O
+setlocal nosmartindent
+
+if exists("*GetLDIndent")
+ finish
+endif
+
+function s:prevnonblanknoncomment(lnum)
+ let lnum = a:lnum
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ let line = getline(lnum)
+ if line =~ '\*/'
+ while lnum > 1 && line !~ '/\*'
+ let lnum -= 1
+ endwhile
+ if line =~ '^\s*/\*'
+ let lnum -= 1
+ else
+ break
+ endif
+ else
+ break
+ endif
+ endwhile
+ return lnum
+endfunction
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetLDIndent()
+ let line = getline(v:lnum)
+ if line =~ '^\s*\*'
+ return cindent(v:lnum)
+ elseif line =~ '^\s*}'
+ return indent(v:lnum) - &sw
+ endif
+
+ let pnum = s:prevnonblanknoncomment(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw
+
+ let pline = getline(pnum)
+ if pline =~ '}\s*$'
+ let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/lifelines.vim b/vim73/indent/lifelines.vim
new file mode 100755
index 0000000..0d9b2b4
--- /dev/null
+++ b/vim73/indent/lifelines.vim
@@ -0,0 +1,24 @@
+" Vim indent file
+" Language: LifeLines
+" Maintainer: Patrick Texier <p.texier@orsennes.com>
+" Location: <http://patrick.texier.free.fr/vim/indent/lifelines.vim>
+" Last Change: 2010 May 7
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" LifeLines uses cindent without ; line terminator, C functions
+" declarations, C keywords, C++ formating
+setlocal cindent
+setlocal cinwords=""
+setlocal cinoptions+=+0
+setlocal cinoptions+=p0
+setlocal cinoptions+=i0
+setlocal cinoptions+=t0
+setlocal cinoptions+=*500
+
+let b:undo_indent = "setl cin< cino< cinw<"
+" vim: ts=8 sw=4
diff --git a/vim73/indent/liquid.vim b/vim73/indent/liquid.vim
new file mode 100644
index 0000000..08341b0
--- /dev/null
+++ b/vim73/indent/liquid.vim
@@ -0,0 +1,63 @@
+" Vim indent file
+" Language: Liquid
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 May 21
+
+if exists('b:did_indent')
+ finish
+endif
+
+set indentexpr=
+if exists('b:liquid_subtype')
+ exe 'runtime! indent/'.b:liquid_subtype.'.vim'
+else
+ runtime! indent/html.vim
+endif
+unlet! b:did_indent
+
+if &l:indentexpr == ''
+ if &l:cindent
+ let &l:indentexpr = 'cindent(v:lnum)'
+ else
+ let &l:indentexpr = 'indent(prevnonblank(v:lnum-1))'
+ endif
+endif
+let b:liquid_subtype_indentexpr = &l:indentexpr
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetLiquidIndent()
+setlocal indentkeys=o,O,*<Return>,<>>,{,},0),0],o,O,!^F,=end,=endif,=endunless,=endifchanged,=endcase,=endfor,=endtablerow,=endcapture,=else,=elsif,=when,=empty
+
+" Only define the function once.
+if exists('*GetLiquidIndent')
+ finish
+endif
+
+function! s:count(string,pattern)
+ let string = substitute(a:string,'\C'.a:pattern,"\n",'g')
+ return strlen(substitute(string,"[^\n]",'','g'))
+endfunction
+
+function! GetLiquidIndent(...)
+ if a:0 && a:1 == '.'
+ let v:lnum = line('.')
+ elseif a:0 && a:1 =~ '^\d'
+ let v:lnum = a:1
+ endif
+ let vcol = col('.')
+ call cursor(v:lnum,1)
+ exe "let ind = ".b:liquid_subtype_indentexpr
+ let lnum = prevnonblank(v:lnum-1)
+ let line = getline(lnum)
+ let cline = getline(v:lnum)
+ let line = substitute(line,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','')
+ let line .= matchstr(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+')
+ let cline = substitute(cline,'\C^\%(\s*{%\s*end\w*\s*%}\)\+','','')
+ let ind += &sw * s:count(line,'{%\s*\%(if\|elsif\|else\|unless\|ifchanged\|case\|when\|for\|tablerow\|capture\)\>')
+ let ind -= &sw * s:count(line,'{%\s*end\%(if\|unless\|ifchanged\|case\|for\|tablerow\|capture\)\>')
+ let ind += &sw * s:count(line,'{%\s*\%(elsif\|else\|when\|empty\)\>')
+ let ind -= &sw * s:count(cline,'{%\s*\%(elsif\|else\|when\|empty\)\>')
+ let ind -= &sw * s:count(cline,'{%\s*end\w*$')
+ return ind
+endfunction
diff --git a/vim73/indent/lisp.vim b/vim73/indent/lisp.vim
new file mode 100644
index 0000000..9f404ae
--- /dev/null
+++ b/vim73/indent/lisp.vim
@@ -0,0 +1,15 @@
+" Vim indent file
+" Language: Lisp
+" Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" URL: http://iamphet.nm.ru/vim
+" Last Change: 2005 May 19
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal ai nosi
+
+let b:undo_indent = "setl ai< si<"
diff --git a/vim73/indent/logtalk.vim b/vim73/indent/logtalk.vim
new file mode 100644
index 0000000..99e6ec8
--- /dev/null
+++ b/vim73/indent/logtalk.vim
@@ -0,0 +1,61 @@
+" Maintainer: Paulo Moura <pmoura@logtalk.org>
+" Revised on: 2008.06.02
+" Language: Logtalk
+
+" This Logtalk indent file is a modified version of the Prolog
+" indent file written by Gergely Kontra
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetLogtalkIndent()
+setlocal indentkeys-=:,0#
+setlocal indentkeys+=0%,-,0;,>,0)
+
+" Only define the function once.
+if exists("*GetLogtalkIndent")
+ finish
+endif
+
+function! GetLogtalkIndent()
+ " 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*%'
+ retu ind
+ endif
+ " Check for entity opening directive on previous line
+ if pline =~ '^\s*:-\s\(object\|protocol\|category\)\ze(.*,$'
+ let ind = ind + &sw
+ " Check for clause head on previous line
+ elseif pline =~ ':-\s*\(%.*\)\?$'
+ let ind = ind + &sw
+ " Check for entity closing directive on previous line
+ elseif pline =~ '^\s*:-\send_\(object\|protocol\|category\)\.\(%.*\)\?$'
+ let ind = ind - &sw
+ " Check for end of clause on previous line
+ elseif pline =~ '\.\s*\(%.*\)\?$'
+ let ind = ind - &sw
+ endif
+ " Check for opening conditional on previous line
+ if pline =~ '^\s*\([(;]\|->\)' && pline !~ '\.\s*\(%.*\)\?$' && pline !~ '^.*\([)][,]\s*\(%.*\)\?$\)'
+ let ind = ind + &sw
+ endif
+ " Check for closing an unclosed paren, or middle ; or ->
+ if line =~ '^\s*\([);]\|->\)'
+ let ind = ind - &sw
+ endif
+ return ind
+endfunction
diff --git a/vim73/indent/lua.vim b/vim73/indent/lua.vim
new file mode 100644
index 0000000..21b02f1
--- /dev/null
+++ b/vim73/indent/lua.vim
@@ -0,0 +1,63 @@
+" Vim indent file
+" Language: Lua script
+" Maintainer: Marcus Aurelius Farias <marcus.cf 'at' bol.com.br>
+" First Author: Max Ischenko <mfi 'at' ukr.net>
+" Last Change: 2007 Jul 23
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetLuaIndent()
+
+" To make Vim call GetLuaIndent() when it finds '\s*end' or '\s*until'
+" on the current line ('else' is default and includes 'elseif').
+setlocal indentkeys+=0=end,0=until
+
+setlocal autoindent
+
+" Only define the function once.
+if exists("*GetLuaIndent")
+ finish
+endif
+
+function! GetLuaIndent()
+ " Find a non-blank line above the current line.
+ let prevlnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if prevlnum == 0
+ return 0
+ endif
+
+ " Add a 'shiftwidth' after lines that start a block:
+ " 'function', 'if', 'for', 'while', 'repeat', 'else', 'elseif', '{'
+ let ind = indent(prevlnum)
+ let prevline = getline(prevlnum)
+ let midx = match(prevline, '^\s*\%(if\>\|for\>\|while\>\|repeat\>\|else\>\|elseif\>\|do\>\|then\>\)')
+ if midx == -1
+ let midx = match(prevline, '{\s*$')
+ if midx == -1
+ let midx = match(prevline, '\<function\>\s*\%(\k\|[.:]\)\{-}\s*(')
+ endif
+ endif
+
+ if midx != -1
+ " Add 'shiftwidth' if what we found previously is not in a comment and
+ " an "end" or "until" is not present on the same line.
+ if synIDattr(synID(prevlnum, midx + 1, 1), "name") != "luaComment" && prevline !~ '\<end\>\|\<until\>'
+ let ind = ind + &shiftwidth
+ endif
+ endif
+
+ " Subtract a 'shiftwidth' on end, else (and elseif), until and '}'
+ " This is the part that requires 'indentkeys'.
+ let midx = match(getline(v:lnum), '^\s*\%(end\|else\|until\|}\)')
+ if midx != -1 && synIDattr(synID(v:lnum, midx + 1, 1), "name") != "luaComment"
+ let ind = ind - &shiftwidth
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/mail.vim b/vim73/indent/mail.vim
new file mode 100644
index 0000000..6246b40
--- /dev/null
+++ b/vim73/indent/mail.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: Mail
+" Maintainer: Bram Moolenaar
+" Last Change: 2009 Jun 03
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" What works best is auto-indenting, disable other indenting.
+" For formatting see the ftplugin.
+setlocal autoindent nosmartindent nocindent indentexpr=
diff --git a/vim73/indent/make.vim b/vim73/indent/make.vim
new file mode 100644
index 0000000..8412fbb
--- /dev/null
+++ b/vim73/indent/make.vim
@@ -0,0 +1,116 @@
+" Vim indent file
+" Language: Makefile
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2007-05-07
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetMakeIndent()
+setlocal indentkeys=!^F,o,O,<:>,=else,=endif
+setlocal nosmartindent
+
+if exists("*GetMakeIndent")
+ finish
+endif
+
+let s:comment_rx = '^\s*#'
+let s:rule_rx = '^[^ \t#:][^#:]*:\{1,2}\%([^=:]\|$\)'
+let s:continued_rule_rx = '^[^#:]*:\{1,2}\%([^=:]\|$\)'
+let s:continuation_rx = '\\$'
+let s:assignment_rx = '^\s*\h\w*\s*[+?]\==\s*\zs.*\\$'
+let s:folded_assignment_rx = '^\s*\h\w*\s*[+?]\=='
+" TODO: This needs to be a lot more restrictive in what it matches.
+let s:just_inserted_rule_rx = '^\s*[^#:]\+:\{1,2}$'
+let s:conditional_directive_rx = '^ *\%(ifn\=\%(eq\|def\)\|else\)\>'
+let s:end_conditional_directive_rx = '^\s*\%(else\|endif\)\>'
+
+function s:remove_continuation(line)
+ return substitute(a:line, s:continuation_rx, "", "")
+endfunction
+
+function GetMakeIndent()
+ " TODO: Should this perhaps be v:lnum -1?
+" let prev_lnum = prevnonblank(v:lnum - 1)
+ let prev_lnum = v:lnum - 1
+ if prev_lnum == 0
+ return 0
+ endif
+ let prev_line = getline(prev_lnum)
+
+ let prev_prev_lnum = prev_lnum - 1
+ let prev_prev_line = prev_prev_lnum != 0 ? getline(prev_prev_lnum) : ""
+
+ " TODO: Deal with comments. In comments, continuations aren't interesting.
+ if prev_line =~ s:continuation_rx
+ if prev_prev_line =~ s:continuation_rx
+ return indent(prev_lnum)
+ elseif prev_line =~ s:rule_rx
+ return &sw
+ elseif prev_line =~ s:assignment_rx
+ call cursor(prev_lnum, 1)
+ if search(s:assignment_rx, 'W') != 0
+ return virtcol('.') - 1
+ else
+ " TODO: ?
+ return &sw
+ endif
+ else
+ " TODO: OK, this might be a continued shell command, so perhaps indent
+ " properly here? Leave this out for now, but in the next release this
+ " should be using indent/sh.vim somehow.
+ "if prev_line =~ '^\t' " s:rule_command_rx
+ " if prev_line =~ '^\s\+[@-]\%(if\)\>'
+ " return indent(prev_lnum) + 2
+ " endif
+ "endif
+ return indent(prev_lnum) + &sw
+ endif
+ elseif prev_prev_line =~ s:continuation_rx
+ let folded_line = s:remove_continuation(prev_prev_line) . ' ' . s:remove_continuation(prev_line)
+ let lnum = prev_prev_lnum - 1
+ let line = getline(lnum)
+ while line =~ s:continuation_rx
+ let folded_line = s:remove_continuation(line) . ' ' . folded_line
+ let lnum -= 1
+ let line = getline(lnum)
+ endwhile
+ let folded_lnum = lnum + 1
+ if folded_line =~ s:rule_rx
+ if getline(v:lnum) =~ s:rule_rx
+ return 0
+ else
+ return &ts
+ endif
+ else
+" elseif folded_line =~ s:folded_assignment_rx
+ if getline(v:lnum) =~ s:rule_rx
+ return 0
+ else
+ return indent(folded_lnum)
+ endif
+" else
+" " TODO: ?
+" return indent(prev_lnum)
+ endif
+ elseif prev_line =~ s:rule_rx
+ if getline(v:lnum) =~ s:rule_rx
+ return 0
+ else
+ return &ts
+ endif
+ elseif prev_line =~ s:conditional_directive_rx
+ return &sw
+ else
+ let line = getline(v:lnum)
+ if line =~ s:just_inserted_rule_rx
+ return 0
+ elseif line =~ s:end_conditional_directive_rx
+ return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1) - &sw
+ else
+ return v:lnum - 1 == 0 ? 0 : indent(v:lnum - 1)
+ endif
+ endif
+endfunction
diff --git a/vim73/indent/matlab.vim b/vim73/indent/matlab.vim
new file mode 100644
index 0000000..7bccc7c
--- /dev/null
+++ b/vim73/indent/matlab.vim
@@ -0,0 +1,74 @@
+" Matlab indent file
+" Language: Matlab
+" Maintainer: Christophe Poucet <christophe.poucet@pandora.be>
+" Last Change: 6 January, 2001
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Some preliminary setting
+setlocal indentkeys=!,o,O=end,=case,=else,=elseif,=otherwise,=catch
+
+
+setlocal indentexpr=GetMatlabIndent(v:lnum)
+
+" Only define the function once.
+if exists("*GetMatlabIndent")
+ finish
+endif
+
+function GetMatlabIndent(lnum)
+ " Give up if this line is explicitly joined.
+ if getline(a:lnum - 1) =~ '\\$'
+ return -1
+ endif
+
+ " Search backwards for the first non-empty line.
+ let plnum = a:lnum - 1
+ while plnum > 0 && getline(plnum) =~ '^\s*$'
+ let plnum = plnum - 1
+ endwhile
+
+ if plnum == 0
+ " This is the first non-empty line, use zero indent.
+ return 0
+ endif
+
+ let curind = indent(plnum)
+
+ " If the current line is a stop-block statement...
+ if getline(v:lnum) =~ '^\s*\(end\|else\|elseif\|case\|otherwise\|catch\)\>'
+ " See if this line does not follow the line right after an openblock
+ if getline(plnum) =~ '^\s*\(for\|if\|else\|elseif\|case\|while\|switch\|try\|otherwise\|catch\)\>'
+ " See if the user has already dedented
+ elseif indent(v:lnum) > curind - &sw
+ " If not, recommend one dedent
+ let curind = curind - &sw
+ else
+ " Otherwise, trust the user
+ return -1
+ endif
+" endif
+
+ " If the previous line opened a block
+ elseif getline(plnum) =~ '^\s*\(for\|if\|else\|elseif\|case\|while\|switch\|try\|otherwise\|catch\)\>'
+ " See if the user has already indented
+ if indent(v:lnum) < curind + &sw
+ "If not, recommend indent
+ let curind = curind + &sw
+ else
+ " Otherwise, trust the user
+ return -1
+ endif
+ endif
+
+
+
+ " If we got to here, it means that the user takes the standardversion, so we return it
+ return curind
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/mma.vim b/vim73/indent/mma.vim
new file mode 100644
index 0000000..356b876
--- /dev/null
+++ b/vim73/indent/mma.vim
@@ -0,0 +1,75 @@
+" Vim indent file
+" Language: Mathematica
+" Author: steve layland <layland@wolfram.com>
+" Last Change: Sat May 10 18:56:22 CDT 2005
+" Source: http://vim.sourceforge.net/scripts/script.php?script_id=1274
+" http://members.wolfram.com/layland/vim/indent/mma.vim
+"
+" NOTE:
+" Empty .m files will automatically be presumed to be Matlab files
+" unless you have the following in your .vimrc:
+"
+" let filetype_m="mma"
+"
+" Credits:
+" o steve hacked this out of a random indent file in the Vim 6.1
+" distribution that he no longer remembers...sh.vim? Thanks!
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetMmaIndent()
+setlocal indentkeys+=0[,0],0(,0)
+setlocal nosi "turn off smart indent so we don't over analyze } blocks
+
+if exists("*GetMmaIndent")
+ finish
+endif
+
+function GetMmaIndent()
+
+ " Hit the start of the file, use zero indent.
+ if v:lnum == 0
+ return 0
+ endif
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " use indenting as a base
+ let ind = indent(v:lnum)
+ let lnum = v:lnum
+
+ " if previous line has an unmatched bracket, or ( indent.
+ " doesn't do multiple parens/blocks/etc...
+
+ " also, indent only if this line if this line isn't starting a new
+ " block... TODO - fix this with indentkeys?
+ if getline(v:lnum-1) =~ '\\\@<!\%(\[[^\]]*\|([^)]*\|{[^}]*\)$' && getline(v:lnum) !~ '\s\+[\[({]'
+ let ind = ind+&sw
+ endif
+
+ " if this line had unmatched closing block,
+ " indent to the matching opening block
+ if getline(v:lnum) =~ '[^[]*]\s*$'
+ " move to the closing bracket
+ call search(']','bW')
+ " and find it's partner's indent
+ let ind = indent(searchpair('\[','',']','bWn'))
+ " same for ( blocks
+ elseif getline(v:lnum) =~ '[^(]*)$'
+ call search(')','bW')
+ let ind = indent(searchpair('(','',')','bWn'))
+
+ " and finally, close { blocks if si ain't already set
+ elseif getline(v:lnum) =~ '[^{]*}'
+ call search('}','bW')
+ let ind = indent(searchpair('{','','}','bWn'))
+ endif
+
+ return ind
+endfunction
+
diff --git a/vim73/indent/mp.vim b/vim73/indent/mp.vim
new file mode 100644
index 0000000..1aea4f8
--- /dev/null
+++ b/vim73/indent/mp.vim
@@ -0,0 +1,206 @@
+" MetaPost indent file
+" Language: MetaPost
+" Maintainer: Eugene Minkovskii <emin@mccme.ru>
+" Last Change: 2003 Nov 21
+" Version: 0.1
+" ==========================================================================
+
+" Identation Rules: {{{1
+" First of all, MetaPost language don't expect any identation rules.
+" This screept need for you only if you (not MetaPost) need to do
+" exactly code. If you don't need to use indentation, see
+" :help filetype-indent-off
+"
+" Note: Every rules of identation in MetaPost or TeX languages (and in some
+" other of course) is very subjective. I can release only my vision of this
+" promlem.
+"
+" ..........................................................................
+" Example of correct (by me) identation {{{2
+" shiftwidth=4
+" ==========================================================================
+" for i=0 upto 99:
+" z[i] = (0,1u) rotated (i*360/100);
+" endfor
+" draw z0 -- z10 -- z20
+" withpen ... % <- 2sw because breaked line
+" withcolor ...; % <- same as previous
+" draw z0 for i=1 upto 99:
+" -- z[i] % <- 1sw from left end of 'for' satement
+" endfor withpen ... % <- 0sw from left end of 'for' satement
+" withcolor ...; % <- 2sw because breaked line
+" draw if One: % <- This is internal if (like 'for' above)
+" one
+" elsif Other:
+" other
+" fi withpen ...;
+" if one: % <- This is external if
+" draw one;
+" elseif other:
+" draw other;
+" fi
+" draw z0; draw z1;
+" }}}
+" }}}
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetMetaPostIndent()
+setlocal indentkeys+=;,<:>,=if,=for,=def,=end,=else,=fi
+
+" Only define the function once.
+if exists("*GetMetaPostIndent")
+ finish
+endif
+
+" Auxiliary Definitions: {{{1
+function! MetaNextNonblankNoncomment(pos)
+ " Like nextnonblank() but ignore comment lines
+ let tmp = nextnonblank(a:pos)
+ while tmp && getline(tmp) =~ '^\s*%'
+ let tmp = nextnonblank(tmp+1)
+ endwhile
+ return tmp
+endfunction
+
+function! MetaPrevNonblankNoncomment(pos)
+ " Like prevnonblank() but ignore comment lines
+ let tmp = prevnonblank(a:pos)
+ while tmp && getline(tmp) =~ '^\s*%'
+ let tmp = prevnonblank(tmp-1)
+ endwhile
+ return tmp
+endfunction
+
+function! MetaSearchNoncomment(pattern, ...)
+ " Like search() but ignore commented areas
+ if a:0
+ let flags = a:1
+ elseif &wrapscan
+ let flags = "w"
+ else
+ let flags = "W"
+ endif
+ let cl = line(".")
+ let cc = col(".")
+ let tmp = search(a:pattern, flags)
+ while tmp && synIDattr(synID(line("."), col("."), 1), "name") =~
+ \ 'm[fp]\(Comment\|TeXinsert\|String\)'
+ let tmp = search(a:pattern, flags)
+ endwhile
+ if !tmp
+ call cursor(cl,cc)
+ endif
+ return tmp
+endfunction
+" }}}
+
+function! GetMetaPostIndent()
+ " not indent in comment ???
+ if synIDattr(synID(line("."), col("."), 1), "name") =~
+ \ 'm[fp]\(Comment\|TeXinsert\|String\)'
+ return -1
+ endif
+ " Some RegExps: {{{1
+ " end_of_item: all of end by ';'
+ " + all of end by :endfor, :enddef, :endfig, :endgroup, :fi
+ " + all of start by :beginfig(num), :begingroup
+ " + all of start by :for, :if, :else, :elseif and end by ':'
+ " + all of start by :def, :vardef and end by '='
+ let end_of_item = '\(' .
+ \ ';\|' .
+ \ '\<\(end\(for\|def\|fig\|group\)\|fi\)\>\|' .
+ \ '\<begin\(group\>\|fig\s*(\s*\d\+\s*)\)\|' .
+ \ '\<\(for\|if\|else\(if\)\=\)\>.\+:\|' .
+ \ '\<\(var\)\=def\>.\+=' . '\)'
+ " }}}
+ " Save: current position {{{1
+ let cl = line (".")
+ let cc = col (".")
+ let cs = getline(".")
+ " if it is :beginfig or :endfig use zero indent
+ if cs =~ '^\s*\(begin\|end\)fig\>'
+ return 0
+ endif
+ " }}}
+ " Initialise: ind variable {{{1
+ " search previous item not in current line
+ let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
+ while p_semicol_l == cl
+ let p_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
+ endwhile
+ " if this is first item in program use zero indent
+ if !p_semicol_l
+ return 0
+ endif
+ " if this is multiline item, remember first indent
+ if MetaNextNonblankNoncomment(p_semicol_l+1) < cl
+ let ind = indent(MetaNextNonblankNoncomment(p_semicol_l+1))
+ " else --- search pre-previous item for search first line in previous item
+ else
+ " search pre-previous item not in current line
+ let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
+ while pp_semicol_l == p_semicol_l
+ let pp_semicol_l = MetaSearchNoncomment(end_of_item,"bW")
+ endwhile
+ " if we find pre-previous item, remember indent of previous item
+ " else --- remember zero
+ if pp_semicol_l
+ let ind = indent(MetaNextNonblankNoncomment(line(".")+1))
+ else
+ let ind = 0
+ endif
+ endif
+ " }}}
+ " Increase Indent: {{{1
+ " if it is an internal/external :for or :if statements {{{2
+ let pnn_s = getline(MetaPrevNonblankNoncomment(cl-1))
+ if pnn_s =~ '\<\(for\|if\)\>.\+:\s*\($\|%\)'
+ let ind = match(pnn_s, '\<\(for\|if\)\>.\+:\s*\($\|%\)') + &sw
+ " }}}
+ " if it is a :def, :vardef, :beginfig, :begingroup, :else, :elseif {{{2
+ elseif pnn_s =~ '^\s*\(' .
+ \ '\(var\)\=def\|' .
+ \ 'begin\(group\|fig\s*(\s*\d\+\s*)\)\|' .
+ \ 'else\(if\)\=' . '\)\>'
+ let ind = ind + &sw
+ " }}}
+ " if it is a broken line {{{2
+ elseif pnn_s !~ end_of_item.'\s*\($\|%\)'
+ let ind = ind + (2 * &sw)
+ endif
+ " }}}
+ " }}}
+ " Decrease Indent: {{{1
+ " if this is :endfor or :enddef statements {{{2
+ " this is correct because :def cannot be inside :for
+ if cs =~ '\<end\(for\|def\)\=\>'
+ call MetaSearchNoncomment('\<for\>.\+:\s*\($\|%\)' . '\|' .
+ \ '^\s*\(var\)\=def\>',"bW")
+ if col(".") > 1
+ let ind = col(".") - 1
+ else
+ let ind = indent(".")
+ endif
+ " }}}
+ " if this is :fi, :else, :elseif statements {{{2
+ elseif cs =~ '\<\(else\(if\)\=\|fi\)\>'
+ call MetaSearchNoncomment('\<if\>.\+:\s*\($\|%\)',"bW")
+ let ind = col(".") - 1
+ " }}}
+ " if this is :endgroup statement {{{2
+ elseif cs =~ '^\s*endgroup\>'
+ let ind = ind - &sw
+ endif
+ " }}}
+ " }}}
+
+ return ind
+endfunction
+"
+
+" vim:sw=2:fdm=marker
diff --git a/vim73/indent/objc.vim b/vim73/indent/objc.vim
new file mode 100644
index 0000000..beadca9
--- /dev/null
+++ b/vim73/indent/objc.vim
@@ -0,0 +1,79 @@
+" Vim indent file
+" Language: Objective-C
+" Maintainer: Kazunobu Kuriyama <kazunobu.kuriyama@nifty.com>
+" Last Change: 2004 May 16
+"
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+setlocal cindent
+
+" Set the function to do the work.
+setlocal indentexpr=GetObjCIndent()
+
+" To make a colon (:) suggest an indentation other than a goto/swich label,
+setlocal indentkeys-=:
+setlocal indentkeys+=<:>
+
+" Only define the function once.
+if exists("*GetObjCIndent")
+ finish
+endif
+
+function s:GetWidth(line, regexp)
+ let end = matchend(a:line, a:regexp)
+ let width = 0
+ let i = 0
+ while i < end
+ if a:line[i] != "\t"
+ let width = width + 1
+ else
+ let width = width + &ts - (width % &ts)
+ endif
+ let i = i + 1
+ endwhile
+ return width
+endfunction
+
+function s:LeadingWhiteSpace(line)
+ let end = strlen(a:line)
+ let width = 0
+ let i = 0
+ while i < end
+ let char = a:line[i]
+ if char != " " && char != "\t"
+ break
+ endif
+ if char != "\t"
+ let width = width + 1
+ else
+ let width = width + &ts - (width % &ts)
+ endif
+ let i = i + 1
+ endwhile
+ return width
+endfunction
+
+
+function GetObjCIndent()
+ let theIndent = cindent(v:lnum)
+
+ let prev_line = getline(v:lnum - 1)
+ let cur_line = getline(v:lnum)
+
+ if prev_line !~# ":" || cur_line !~# ":"
+ return theIndent
+ endif
+
+ if prev_line !~# ";"
+ let prev_colon_pos = s:GetWidth(prev_line, ":")
+ let delta = s:GetWidth(cur_line, ":") - s:LeadingWhiteSpace(cur_line)
+ let theIndent = prev_colon_pos - delta
+ endif
+
+ return theIndent
+endfunction
diff --git a/vim73/indent/ocaml.vim b/vim73/indent/ocaml.vim
new file mode 100644
index 0000000..5c267af
--- /dev/null
+++ b/vim73/indent/ocaml.vim
@@ -0,0 +1,253 @@
+" Vim indent file
+" Language: OCaml
+" Maintainers: Jean-Francois Yuen <jfyuen@happycoders.org>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus.mottl@gmail.com>
+" URL: http://www.ocaml.info/vim/indent/ocaml.vim
+" Last Change: 2005 Jun 25 - Fixed multiple bugs due to 'else\nreturn ind' working
+" 2005 May 09 - Added an option to not indent OCaml-indents specially (MM)
+" 2005 Apr 11 - Fixed an indentation bug concerning "let" (MM)
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetOCamlIndent()
+setlocal indentkeys+=0=and,0=class,0=constraint,0=done,0=else,0=end,0=exception,0=external,0=if,0=in,0=include,0=inherit,0=initializer,0=let,0=method,0=open,0=then,0=type,0=val,0=with,0;;,0>\],0\|\],0>},0\|,0},0\],0)
+setlocal nolisp
+setlocal nosmartindent
+setlocal textwidth=80
+
+" Comment formatting
+if !exists("no_ocaml_comments")
+ if (has("comments"))
+ setlocal comments=sr:(*,mb:*,ex:*)
+ setlocal fo=cqort
+ endif
+endif
+
+" Only define the function once.
+if exists("*GetOCamlIndent")
+ finish
+endif
+
+" Define some patterns:
+let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|<-\|=\|;\|(\)\s*$'
+let s:letpat = '^\s*\(let\|type\|module\|class\|open\|exception\|val\|include\|external\)\>'
+let s:letlim = '\(\<\(sig\|struct\)\|;;\)\s*$'
+let s:lim = '^\s*\(exception\|external\|include\|let\|module\|open\|type\|val\)\>'
+let s:module = '\<\%(begin\|sig\|struct\|object\)\>'
+let s:obj = '^\s*\(constraint\|inherit\|initializer\|method\|val\)\>\|\<\(object\|object\s*(.*)\)\s*$'
+let s:type = '^\s*\%(class\|let\|type\)\>.*='
+
+" Skipping pattern, for comments
+function s:GetLineWithoutFullComment(lnum)
+ let lnum = prevnonblank(a:lnum - 1)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+ while lline =~ '^\s*$' && lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+ endwhile
+ return lnum
+endfunction
+
+" Indent for ';;' to match multiple 'let'
+function s:GetInd(lnum, pat, lim)
+ let llet = search(a:pat, 'bW')
+ let old = indent(a:lnum)
+ while llet > 0
+ let old = indent(llet)
+ let nb = s:GetLineWithoutFullComment(llet)
+ if getline(nb) =~ a:lim
+ return old
+ endif
+ let llet = search(a:pat, 'bW')
+ endwhile
+ return old
+endfunction
+
+" Indent pairs
+function s:FindPair(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+ return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+endfunction
+
+" Indent 'let'
+function s:FindLet(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+ return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ s:beflet'))
+endfunction
+
+function GetOCamlIndent()
+ " Find a non-commented line above the current line.
+ let lnum = s:GetLineWithoutFullComment(v:lnum)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let lline = substitute(getline(lnum), '(\*.*\*)\s*$', '', '')
+
+ " Return double 'shiftwidth' after lines matching:
+ if lline =~ '^\s*|.*->\s*$'
+ return ind + &sw + &sw
+ endif
+
+ let line = getline(v:lnum)
+
+ " Indent if current line begins with 'end':
+ if line =~ '^\s*end\>'
+ return s:FindPair(s:module, '','\<end\>')
+
+ " Indent if current line begins with 'done' for 'do':
+ elseif line =~ '^\s*done\>'
+ return s:FindPair('\<do\>', '','\<done\>')
+
+ " Indent if current line begins with '}' or '>}':
+ elseif line =~ '^\s*\(\|>\)}'
+ return s:FindPair('{', '','}')
+
+ " Indent if current line begins with ']', '|]' or '>]':
+ elseif line =~ '^\s*\(\||\|>\)\]'
+ return s:FindPair('\[', '','\]')
+
+ " Indent if current line begins with ')':
+ elseif line =~ '^\s*)'
+ return s:FindPair('(', '',')')
+
+ " Indent if current line begins with 'let':
+ elseif line =~ '^\s*let\>'
+ if lline !~ s:lim . '\|' . s:letlim . '\|' . s:beflet
+ return s:FindLet(s:type, '','\<let\s*$')
+ endif
+
+ " Indent if current line begins with 'class' or 'type':
+ elseif line =~ '^\s*\(class\|type\)\>'
+ if lline !~ s:lim . '\|\<and\s*$\|' . s:letlim
+ return s:FindLet(s:type, '','\<\(class\|type\)\s*$')
+ endif
+
+ " Indent for pattern matching:
+ elseif line =~ '^\s*|'
+ if lline !~ '^\s*\(|[^\]]\|\(match\|type\|with\)\>\)\|\<\(function\|parser\|private\|with\)\s*$'
+ call search('|', 'bW')
+ return indent(searchpair('^\s*\(match\|type\)\>\|\<\(function\|parser\|private\|with\)\s*$', '', '^\s*|', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") !~ "^\\s*|.*->"'))
+ endif
+
+ " Indent if current line begins with ';;':
+ elseif line =~ '^\s*;;'
+ if lline !~ ';;\s*$'
+ return s:GetInd(v:lnum, s:letpat, s:letlim)
+ endif
+
+ " Indent if current line begins with 'in':
+ elseif line =~ '^\s*in\>'
+ if lline !~ '^\s*\(let\|and\)\>'
+ return s:FindPair('\<let\>', '', '\<in\>')
+ endif
+
+ " Indent if current line begins with 'else':
+ elseif line =~ '^\s*else\>'
+ if lline !~ '^\s*\(if\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<else\>')
+ endif
+
+ " Indent if current line begins with 'then':
+ elseif line =~ '^\s*then\>'
+ if lline !~ '^\s*\(if\|else\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ endif
+
+ " Indent if current line begins with 'and':
+ elseif line =~ '^\s*and\>'
+ if lline !~ '^\s*\(and\|let\|type\)\>\|\<end\s*$'
+ return ind - &sw
+ endif
+
+ " Indent if current line begins with 'with':
+ elseif line =~ '^\s*with\>'
+ if lline !~ '^\s*\(match\|try\)\>'
+ return s:FindPair('\<\%(match\|try\)\>', '','\<with\>')
+ endif
+
+ " Indent if current line begins with 'exception', 'external', 'include' or
+ " 'open':
+ elseif line =~ '^\s*\(exception\|external\|include\|open\)\>'
+ if lline !~ s:lim . '\|' . s:letlim
+ call search(line)
+ return indent(search('^\s*\(\(exception\|external\|include\|open\|type\)\>\|val\>.*:\)', 'bW'))
+ endif
+
+ " Indent if current line begins with 'val':
+ elseif line =~ '^\s*val\>'
+ if lline !~ '^\s*\(exception\|external\|include\|open\)\>\|' . s:obj . '\|' . s:letlim
+ return indent(search('^\s*\(\(exception\|include\|initializer\|method\|open\|type\|val\)\>\|external\>.*:\)', 'bW'))
+ endif
+
+ " Indent if current line begins with 'constraint', 'inherit', 'initializer'
+ " or 'method':
+ elseif line =~ '^\s*\(constraint\|inherit\|initializer\|method\)\>'
+ if lline !~ s:obj
+ return indent(search('\<\(object\|object\s*(.*)\)\s*$', 'bW')) + &sw
+ endif
+
+ endif
+
+ " Add a 'shiftwidth' after lines ending with:
+ if lline =~ '\(:\|=\|->\|<-\|(\|\[\|{\|{<\|\[|\|\[<\|\<\(begin\|do\|else\|fun\|function\|functor\|if\|initializer\|object\|parser\|private\|sig\|struct\|then\|try\)\|\<object\s*(.*)\)\s*$'
+ let ind = ind + &sw
+
+ " Back to normal indent after lines ending with ';;':
+ elseif lline =~ ';;\s*$' && lline !~ '^\s*;;'
+ let ind = s:GetInd(v:lnum, s:letpat, s:letlim)
+
+ " Back to normal indent after lines ending with 'end':
+ elseif lline =~ '\<end\s*$'
+ let ind = s:FindPair(s:module, '','\<end\>')
+
+ " Back to normal indent after lines ending with 'in':
+ elseif lline =~ '\<in\s*$' && lline !~ '^\s*in\>'
+ let ind = s:FindPair('\<let\>', '', '\<in\>')
+
+ " Back to normal indent after lines ending with 'done':
+ elseif lline =~ '\<done\s*$'
+ let ind = s:FindPair('\<do\>', '','\<done\>')
+
+ " Back to normal indent after lines ending with '}' or '>}':
+ elseif lline =~ '\(\|>\)}\s*$'
+ let ind = s:FindPair('{', '','}')
+
+ " Back to normal indent after lines ending with ']', '|]' or '>]':
+ elseif lline =~ '\(\||\|>\)\]\s*$'
+ let ind = s:FindPair('\[', '','\]')
+
+ " Back to normal indent after comments:
+ elseif lline =~ '\*)\s*$'
+ call search('\*)', 'bW')
+ let ind = indent(searchpair('(\*', '', '\*)', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string"'))
+
+ " Back to normal indent after lines ending with ')':
+ elseif lline =~ ')\s*$'
+ let ind = s:FindPair('(', '',')')
+
+ " If this is a multiline comment then align '*':
+ elseif lline =~ '^\s*(\*' && line =~ '^\s*\*'
+ let ind = ind + 1
+
+ endif
+
+ " Subtract a 'shiftwidth' after lines matching 'match ... with parser':
+ if lline =~ '\<match\>.*\<with\>\s*\<parser\s*$'
+ let ind = ind - &sw
+ endif
+
+ return ind
+
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/occam.vim b/vim73/indent/occam.vim
new file mode 100644
index 0000000..ba978e0
--- /dev/null
+++ b/vim73/indent/occam.vim
@@ -0,0 +1,182 @@
+" Vim indent file
+" Language: occam
+" Maintainer: Mario Schweigler <ms44@kent.ac.uk>
+" Last Change: 23 April 2003
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+"{{{ Settings
+" Set the occam indent function
+setlocal indentexpr=GetOccamIndent()
+" Indent after new line and after initial colon
+setlocal indentkeys=o,O,0=:
+"}}}
+
+" Only define the function once
+if exists("*GetOccamIndent")
+ finish
+endif
+
+"{{{ Indent definitions
+" Define carriage return indent
+let s:FirstLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\|PAR\|SEQ\|PRI\s\+PAR\|WHILE\|VALOF\|CLAIM\|FORKING\)\>\|\(--.*\)\@<!\(\<PROC\>\|??\|\<CASE\>\s*\(--.*\)\=\_$\)'
+let s:FirstLevelNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'
+let s:SecondLevelIndent = '^\C\s*\(IF\|ALT\|PRI\s\+ALT\)\>\|\(--.*\)\@<!?\s*\<CASE\>\s*\(--.*\)\=\_$'
+let s:SecondLevelNonColonEndIndent = '\(--.*\)\@<!\<\(CHAN\|DATA\)\s\+TYPE\>'
+
+" Define colon indent
+let s:ColonIndent = '\(--.*\)\@<!\<PROC\>'
+let s:ColonNonColonEndIndent = '^\C\s*PROTOCOL\>\|\(--.*\)\@<!\<\(\(CHAN\|DATA\)\s\+TYPE\|FUNCTION\)\>'
+
+let s:ColonEnd = '\(--.*\)\@<!:\s*\(--.*\)\=$'
+let s:ColonStart = '^\s*:\s*\(--.*\)\=$'
+
+" Define comment
+let s:CommentLine = '^\s*--'
+"}}}
+
+"{{{ function GetOccamIndent()
+" Auxiliary function to get the correct indent for a line of occam code
+function GetOccamIndent()
+
+ " Ensure magic is on
+ let save_magic = &magic
+ setlocal magic
+
+ " Get reference line number
+ let linenum = prevnonblank(v:lnum - 1)
+ while linenum > 0 && getline(linenum) =~ s:CommentLine
+ let linenum = prevnonblank(linenum - 1)
+ endwhile
+
+ " Get current indent
+ let curindent = indent(linenum)
+
+ " Get current line
+ let line = getline(linenum)
+
+ " Get previous line number
+ let prevlinenum = prevnonblank(linenum - 1)
+ while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine
+ let prevlinenum = prevnonblank(prevlinenum - 1)
+ endwhile
+
+ " Get previous line
+ let prevline = getline(prevlinenum)
+
+ " Colon indent
+ if getline(v:lnum) =~ s:ColonStart
+
+ let found = 0
+
+ while found < 1
+
+ if line =~ s:ColonStart
+ let found = found - 1
+ elseif line =~ s:ColonIndent || (line =~ s:ColonNonColonEndIndent && line !~ s:ColonEnd)
+ let found = found + 1
+ endif
+
+ if found < 1
+ let linenum = prevnonblank(linenum - 1)
+ if linenum > 0
+ let line = getline(linenum)
+ else
+ let found = 1
+ endif
+ endif
+
+ endwhile
+
+ if linenum > 0
+ let curindent = indent(linenum)
+ else
+ let colonline = getline(v:lnum)
+ let tabstr = ''
+ while strlen(tabstr) < &tabstop
+ let tabstr = ' ' . tabstr
+ endwhile
+ let colonline = substitute(colonline, '\t', tabstr, 'g')
+ let curindent = match(colonline, ':')
+ endif
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+ endif
+
+ if getline(v:lnum) =~ '^\s*:'
+ let colonline = getline(v:lnum)
+ let tabstr = ''
+ while strlen(tabstr) < &tabstop
+ let tabstr = ' ' . tabstr
+ endwhile
+ let colonline = substitute(colonline, '\t', tabstr, 'g')
+ let curindent = match(colonline, ':')
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+ endif
+
+ " Carriage return indenat
+ if line =~ s:FirstLevelIndent || (line =~ s:FirstLevelNonColonEndIndent && line !~ s:ColonEnd)
+ \ || (line !~ s:ColonStart && (prevline =~ s:SecondLevelIndent
+ \ || (prevline =~ s:SecondLevelNonColonEndIndent && prevline !~ s:ColonEnd)))
+ let curindent = curindent + &shiftwidth
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+ endif
+
+ " Commented line
+ if getline(prevnonblank(v:lnum - 1)) =~ s:CommentLine
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return indent(prevnonblank(v:lnum - 1))
+ endif
+
+ " Look for previous second level IF / ALT / PRI ALT
+ let found = 0
+
+ while !found
+
+ if indent(prevlinenum) == curindent - &shiftwidth
+ let found = 1
+ endif
+
+ if !found
+ let prevlinenum = prevnonblank(prevlinenum - 1)
+ while prevlinenum > 0 && getline(prevlinenum) =~ s:CommentLine
+ let prevlinenum = prevnonblank(prevlinenum - 1)
+ endwhile
+ if prevlinenum == 0
+ let found = 1
+ endif
+ endif
+
+ endwhile
+
+ if prevlinenum > 0
+ if getline(prevlinenum) =~ s:SecondLevelIndent
+ let curindent = curindent + &shiftwidth
+ endif
+ endif
+
+ " Restore magic
+ if !save_magic|setlocal nomagic|endif
+
+ return curindent
+
+endfunction
+"}}}
diff --git a/vim73/indent/pascal.vim b/vim73/indent/pascal.vim
new file mode 100644
index 0000000..b1a652d
--- /dev/null
+++ b/vim73/indent/pascal.vim
@@ -0,0 +1,173 @@
+" Vim indent file
+" Language: Pascal
+" Maintainer: Neil Carter <n.carter@swansea.ac.uk>
+" Created: 2004 Jul 13
+" Last Change: 2005 Jul 05
+
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetPascalIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==end;,==const,==type,==var,==begin,==repeat,==until,==for
+setlocal indentkeys+==program,==function,==procedure,==object,==private
+setlocal indentkeys+==record,==if,==else,==case
+
+if exists("*GetPascalIndent")
+ finish
+endif
+
+
+function! s:GetPrevNonCommentLineNum( line_num )
+
+ " Skip lines starting with a comment
+ let SKIP_LINES = '^\s*\(\((\*\)\|\(\*\ \)\|\(\*)\)\|{\|}\)'
+
+ let nline = a:line_num
+ while nline > 0
+ let nline = prevnonblank(nline-1)
+ if getline(nline) !~? SKIP_LINES
+ break
+ endif
+ endwhile
+
+ return nline
+endfunction
+
+
+function! GetPascalIndent( line_num )
+ " Line 0 always goes at column 0
+ if a:line_num == 0
+ return 0
+ endif
+
+ let this_codeline = getline( a:line_num )
+
+ " If in the middle of a three-part comment
+ if this_codeline =~ '^\s*\*'
+ return indent( a:line_num )
+ endif
+
+ let prev_codeline_num = s:GetPrevNonCommentLineNum( a:line_num )
+ let prev_codeline = getline( prev_codeline_num )
+ let indnt = indent( prev_codeline_num )
+
+ " Compiler directives should always go in column zero.
+ if this_codeline =~ '^\s*{\(\$IFDEF\|\$ELSE\|\$ENDIF\)'
+ return 0
+ endif
+
+ " These items have nothing before or after (not even a comment), and
+ " go on column 0. Make sure that the ^\s* is followed by \( to make
+ " ORs work properly, and not include the start of line (this must
+ " always appear).
+ " The bracketed expression with the underline is a routine
+ " separator. This is one case where we do indent comment lines.
+ if this_codeline =~ '^\s*\((\*\ _\+\ \*)\|\<\(const\|var\)\>\)$'
+ return 0
+ endif
+
+ " These items may have text after them, and go on column 0 (in most
+ " cases). The problem is that "function" and "procedure" keywords
+ " should be indented if within a class declaration.
+ if this_codeline =~ '^\s*\<\(program\|type\|uses\|procedure\|function\)\>'
+ return 0
+ endif
+
+ " BEGIN
+ " If the begin does not come after "if", "for", or "else", then it
+ " goes in column 0
+ if this_codeline =~ '^\s*begin\>' && prev_codeline !~ '^\s*\<\(if\|for\|else\)\>'
+ return 0
+ endif
+
+ " These keywords are indented once only.
+ if this_codeline =~ '^\s*\<\(private\)\>'
+ return &shiftwidth
+ endif
+
+ " If the PREVIOUS LINE contained these items, the current line is
+ " always indented once.
+ if prev_codeline =~ '^\s*\<\(type\|uses\)\>'
+ return &shiftwidth
+ endif
+
+ " These keywords are indented once only. Possibly surrounded by
+ " other chars.
+ if this_codeline =~ '^.\+\<\(object\|record\)\>'
+ return &shiftwidth
+ endif
+
+ " If the previous line was indenting...
+ if prev_codeline =~ '^\s*\<\(for\|if\|case\|else\|end\ else\)\>'
+ " then indent.
+ let indnt = indnt + &shiftwidth
+ " BUT... if this is the start of a multistatement block then we
+ " need to align the begin with the previous line.
+ if this_codeline =~ '^\s*begin\>'
+ return indnt - &shiftwidth
+ endif
+
+ " We also need to keep the indentation level constant if the
+ " whole if-then statement was on one line.
+ if prev_codeline =~ '\<then\>.\+'
+ let indnt = indnt - &shiftwidth
+ endif
+ endif
+
+ " PREVIOUS-LINE BEGIN
+ " If the previous line was an indenting keyword then indent once...
+ if prev_codeline =~ '^\s*\<\(const\|var\|begin\|repeat\|private\)\>'
+ " But only if this is another var in a list.
+ if this_codeline !~ '^\s*var\>'
+ return indnt + &shiftwidth
+ endif
+ endif
+
+ " PREVIOUS-LINE BEGIN
+ " Indent code after a case statement begin
+ if prev_codeline =~ '\:\ begin\>'
+ return indnt + &shiftwidth
+ endif
+
+ " These words may have text before them on the line (hence the .*)
+ " but are followed by nothing. Always indent once only.
+ if prev_codeline =~ '^\(.*\|\s*\)\<\(object\|record\)\>$'
+ return indnt + &shiftwidth
+ endif
+
+ " If we just closed a bracket that started on a previous line, then
+ " unindent. But don't return yet -- we need to check for further
+ " unindentation (for end/until/else)
+ if prev_codeline =~ '^[^(]*[^*])'
+ let indnt = indnt - &shiftwidth
+ endif
+
+ " At the end of a block, we have to unindent both the current line
+ " (the "end" for instance) and the newly-created line.
+ if this_codeline =~ '^\s*\<\(end\|until\|else\)\>'
+ return indnt - &shiftwidth
+ endif
+
+ " If we have opened a bracket and it continues over one line,
+ " then indent once.
+ "
+ " RE = an opening bracket followed by any amount of anything other
+ " than a closing bracket and then the end-of-line.
+ "
+ " If we didn't include the end of line, this RE would match even
+ " closed brackets, since it would match everything up to the closing
+ " bracket.
+ "
+ " This test isn't clever enough to handle brackets inside strings or
+ " comments.
+ if prev_codeline =~ '([^*]\=[^)]*$'
+ return indnt + &shiftwidth
+ endif
+
+ return indnt
+endfunction
+
diff --git a/vim73/indent/perl.vim b/vim73/indent/perl.vim
new file mode 100644
index 0000000..1fbc4de
--- /dev/null
+++ b/vim73/indent/perl.vim
@@ -0,0 +1,180 @@
+" Vim indent file
+" Language: Perl 5
+" Author: Andy Lester <andy@petdance.com>
+" URL: http://github.com/petdance/vim-perl/tree/master
+" Last Change: June 3, 2009
+
+" Suggestions and improvements by :
+" Aaron J. Sherman (use syntax for hints)
+" Artem Chuprina (play nice with folding)
+
+" TODO things that are not or not properly indented (yet) :
+" - Continued statements
+" print "foo",
+" "bar";
+" print "foo"
+" if bar();
+" - Multiline regular expressions (m//x)
+" (The following probably needs modifying the perl syntax file)
+" - qw() lists
+" - Heredocs with terminators that don't match \I\i*
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Is syntax highlighting active ?
+let b:indent_use_syntax = has("syntax")
+
+setlocal indentexpr=GetPerlIndent()
+setlocal indentkeys+=0=,0),0],0=or,0=and
+if !b:indent_use_syntax
+ setlocal indentkeys+=0=EO
+endif
+
+" Only define the function once.
+if exists("*GetPerlIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+function GetPerlIndent()
+
+ " Get the line to be indented
+ let cline = getline(v:lnum)
+
+ " Indent POD markers to column 0
+ if cline =~ '^\s*=\L\@!'
+ return 0
+ endif
+
+ " Don't reindent coments on first column
+ if cline =~ '^#.'
+ return 0
+ endif
+
+ " Get current syntax item at the line's first char
+ let csynid = ''
+ if b:indent_use_syntax
+ let csynid = synIDattr(synID(v:lnum,1,0),"name")
+ endif
+
+ " Don't reindent POD and heredocs
+ if csynid == "perlPOD" || csynid == "perlHereDoc" || csynid =~ "^pod"
+ return indent(v:lnum)
+ endif
+
+ " Indent end-of-heredocs markers to column 0
+ if b:indent_use_syntax
+ " Assumes that an end-of-heredoc marker matches \I\i* to avoid
+ " confusion with other types of strings
+ if csynid == "perlStringStartEnd" && cline =~ '^\I\i*$'
+ return 0
+ endif
+ else
+ " Without syntax hints, assume that end-of-heredocs markers begin with EO
+ if cline =~ '^\s*EO'
+ return 0
+ endif
+ endif
+
+ " Now get the indent of the previous perl line.
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ " Skip heredocs, POD, and comments on 1st column
+ if b:indent_use_syntax
+ let skippin = 2
+ while skippin
+ let synid = synIDattr(synID(lnum,1,0),"name")
+ if (synid == "perlStringStartEnd" && line =~ '^\I\i*$')
+ \ || (skippin != 2 && synid == "perlPOD")
+ \ || (skippin != 2 && synid == "perlHereDoc")
+ \ || synid == "perlComment"
+ \ || synid =~ "^pod"
+ let lnum = prevnonblank(lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ let skippin = 1
+ else
+ let skippin = 0
+ endif
+ endwhile
+ else
+ if line =~ "^EO"
+ let lnum = search("<<[\"']\\=EO", "bW")
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ endif
+ endif
+
+ " Indent blocks enclosed by {}, (), or []
+ if b:indent_use_syntax
+ " Find a real opening brace
+ let bracepos = match(line, '[(){}\[\]]', matchend(line, '^\s*[)}\]]'))
+ while bracepos != -1
+ let synid = synIDattr(synID(lnum, bracepos + 1, 0), "name")
+ " If the brace is highlighted in one of those groups, indent it.
+ " 'perlHereDoc' is here only to handle the case '&foo(<<EOF)'.
+ if synid == ""
+ \ || synid == "perlMatchStartEnd"
+ \ || synid == "perlHereDoc"
+ \ || synid =~ "^perlFiledescStatement"
+ \ || synid =~ '^perl\(Sub\|Block\)Fold'
+ let brace = strpart(line, bracepos, 1)
+ if brace == '(' || brace == '{' || brace == '['
+ let ind = ind + &sw
+ else
+ let ind = ind - &sw
+ endif
+ endif
+ let bracepos = match(line, '[(){}\[\]]', bracepos + 1)
+ endwhile
+ let bracepos = matchend(cline, '^\s*[)}\]]')
+ if bracepos != -1
+ let synid = synIDattr(synID(v:lnum, bracepos, 0), "name")
+ if synid == ""
+ \ || synid == "perlMatchStartEnd"
+ \ || synid =~ '^perl\(Sub\|Block\)Fold'
+ let ind = ind - &sw
+ endif
+ endif
+ else
+ if line =~ '[{\[(]\s*\(#[^)}\]]*\)\=$'
+ let ind = ind + &sw
+ endif
+ if cline =~ '^\s*[)}\]]'
+ let ind = ind - &sw
+ endif
+ endif
+
+ " Indent lines that begin with 'or' or 'and'
+ if cline =~ '^\s*\(or\|and\)\>'
+ if line !~ '^\s*\(or\|and\)\>'
+ let ind = ind + &sw
+ endif
+ elseif line =~ '^\s*\(or\|and\)\>'
+ let ind = ind - &sw
+ endif
+
+ return ind
+
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
diff --git a/vim73/indent/perl6.vim b/vim73/indent/perl6.vim
new file mode 100644
index 0000000..75159e3
--- /dev/null
+++ b/vim73/indent/perl6.vim
@@ -0,0 +1,136 @@
+" Vim indent file
+" Language: Perl 6
+" Maintainer: Andy Lester <andy@petdance.com>
+" URL: http://github.com/petdance/vim-perl/tree/master
+" Last Change: 2009-07-04
+" Contributors: Andy Lester <andy@petdance.com>
+" Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
+"
+" Adapted from Perl indent file by Rafael Garcia-Suarez <rgarciasuarez@free.fr>
+
+" Suggestions and improvements by :
+" Aaron J. Sherman (use syntax for hints)
+" Artem Chuprina (play nice with folding)
+" TODO:
+" This file still relies on stuff from the Perl 5 syntax file, which Perl 6
+" does not use.
+"
+" Things that are not or not properly indented (yet) :
+" - Continued statements
+" print "foo",
+" "bar";
+" print "foo"
+" if bar();
+" - Multiline regular expressions (m//x)
+" (The following probably needs modifying the perl syntax file)
+" - qw() lists
+" - Heredocs with terminators that don't match \I\i*
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Is syntax highlighting active ?
+let b:indent_use_syntax = has("syntax")
+
+setlocal indentexpr=GetPerl6Indent()
+
+" we reset it first because the Perl 5 indent file might have been loaded due
+" to a .pl/pm file extension, and indent files don't clean up afterwards
+setlocal indentkeys&
+
+setlocal indentkeys+=0=,0),0],0>,0»,0=or,0=and
+if !b:indent_use_syntax
+ setlocal indentkeys+=0=EO
+endif
+
+" Only define the function once.
+if exists("*GetPerl6Indent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo-=C
+
+function GetPerl6Indent()
+
+ " Get the line to be indented
+ let cline = getline(v:lnum)
+
+ " Indent POD markers to column 0
+ if cline =~ '^\s*=\L\@!'
+ return 0
+ endif
+
+ " Don't reindent coments on first column
+ if cline =~ '^#'
+ return 0
+ endif
+
+ " Get current syntax item at the line's first char
+ let csynid = ''
+ if b:indent_use_syntax
+ let csynid = synIDattr(synID(v:lnum,1,0),"name")
+ endif
+
+ " Don't reindent POD and heredocs
+ if csynid =~ "^p6Pod"
+ return indent(v:lnum)
+ endif
+
+
+ " Now get the indent of the previous perl line.
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ " Skip heredocs, POD, and comments on 1st column
+ if b:indent_use_syntax
+ let skippin = 2
+ while skippin
+ let synid = synIDattr(synID(lnum,1,0),"name")
+ if (synid =~ "^p6Pod" || synid =~ "p6Comment")
+ let lnum = prevnonblank(lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+ let line = getline(lnum)
+ let ind = indent(lnum)
+ let skippin = 1
+ else
+ let skippin = 0
+ endif
+ endwhile
+ endif
+
+ if line =~ '[<«\[{(]\s*\(#[^)}\]»>]*\)\=$'
+ let ind = ind + &sw
+ endif
+ if cline =~ '^\s*[)}\]»>]'
+ let ind = ind - &sw
+ endif
+
+ " Indent lines that begin with 'or' or 'and'
+ if cline =~ '^\s*\(or\|and\)\>'
+ if line !~ '^\s*\(or\|and\)\>'
+ let ind = ind + &sw
+ endif
+ elseif line =~ '^\s*\(or\|and\)\>'
+ let ind = ind - &sw
+ endif
+
+ return ind
+
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:ts=8:sts=4:sw=4:expandtab:ft=vim
diff --git a/vim73/indent/php.vim b/vim73/indent/php.vim
new file mode 100644
index 0000000..bc196ed
--- /dev/null
+++ b/vim73/indent/php.vim
@@ -0,0 +1,733 @@
+" Vim indent file
+" Language: PHP
+" Author: John Wellesz <John.wellesz (AT) teaser (DOT) fr>
+" URL: http://www.2072productions.com/vim/indent/php.vim
+" Last Change: 2010 Jully 26th
+" Newsletter: http://www.2072productions.com/?to=php-indent-for-vim-newsletter.php
+" Version: 1.33
+"
+"
+" If you find a bug, please report it on GitHub:
+" http://github.com/2072/PHP-Indenting-for-VIm/issues
+" with an example of code that breaks the algorithm.
+"
+"
+" Thanks a lot for using this script.
+"
+"
+" NOTE: This script must be used with PHP syntax ON and with the php syntax
+" script by Lutz Eymers (http://www.ipdienste.net/data/php.vim ) or with the
+" script by Peter Hodge (http://www.vim.org/scripts/script.php?script_id=1571 )
+" the later is bunbdled by default with Vim 7.
+"
+"
+" In the case you have syntax errors in your script such as HereDoc end
+" identifiers not at col 1 you'll have to indent your file 2 times (This
+" script will automatically put HereDoc end identifiers at col 1 if
+" they are followed by a ';').
+"
+"
+" NOTE: If you are editing files in Unix file format and that (by accident)
+" there are '\r' before new lines, this script won't be able to proceed
+" correctly and will make many mistakes because it won't be able to match
+" '\s*$' correctly.
+" So you have to remove those useless characters first with a command like:
+"
+" :%s /\r$//g
+"
+" or simply 'let' the option PHP_removeCRwhenUnix to 1 and the script will
+" silently remove them when VIM load this script (at each bufread).
+"
+" Options: See :help php-indent for available options.
+
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+
+let php_sync_method = 0
+
+
+if exists("PHP_default_indenting")
+ let b:PHP_default_indenting = PHP_default_indenting * &sw
+else
+ let b:PHP_default_indenting = 0
+endif
+
+if exists("PHP_BracesAtCodeLevel")
+ let b:PHP_BracesAtCodeLevel = PHP_BracesAtCodeLevel
+else
+ let b:PHP_BracesAtCodeLevel = 0
+endif
+
+
+if exists("PHP_autoformatcomment")
+ let b:PHP_autoformatcomment = PHP_autoformatcomment
+else
+ let b:PHP_autoformatcomment = 1
+endif
+
+if exists("PHP_outdentphpescape")
+ let b:PHP_outdentphpescape = PHP_outdentphpescape
+else
+ let b:PHP_outdentphpescape = 1
+endif
+
+
+if exists("PHP_vintage_case_default_indent") && PHP_vintage_case_default_indent
+ let b:PHP_vintage_case_default_indent = 1
+else
+ let b:PHP_vintage_case_default_indent = 0
+endif
+
+
+
+let b:PHP_lastindented = 0
+let b:PHP_indentbeforelast = 0
+let b:PHP_indentinghuge = 0
+let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+let b:PHP_LastIndentedWasComment = 0
+let b:PHP_InsideMultilineComment = 0
+let b:InPHPcode = 0
+let b:InPHPcode_checked = 0
+let b:InPHPcode_and_script = 0
+let b:InPHPcode_tofind = ""
+let b:PHP_oldchangetick = b:changedtick
+let b:UserIsTypingComment = 0
+let b:optionsset = 0
+
+setlocal nosmartindent
+setlocal noautoindent
+setlocal nocindent
+setlocal nolisp
+
+setlocal indentexpr=GetPhpIndent()
+setlocal indentkeys=0{,0},0),:,!^F,o,O,e,*<Return>,=?>,=<?,=*/
+
+
+
+let s:searchpairflags = 'bWr'
+
+if &fileformat == "unix" && exists("PHP_removeCRwhenUnix") && PHP_removeCRwhenUnix
+ silent! %s/\r$//g
+endif
+
+if exists("*GetPhpIndent")
+ call ResetPhpOptions()
+ finish
+endif
+
+let s:endline= '\s*\%(//.*\|#.*\|/\*.*\*/\s*\)\=$'
+let s:PHP_startindenttag = '<?\%(.*?>\)\@!\|<script[^>]*>\%(.*<\/script>\)\@!'
+
+
+function! GetLastRealCodeLNum(startline) " {{{
+
+ let lnum = a:startline
+
+ if b:GetLastRealCodeLNum_ADD && b:GetLastRealCodeLNum_ADD == lnum + 1
+ let lnum = b:GetLastRealCodeLNum_ADD
+ endif
+
+ let old_lnum = lnum
+
+ while lnum > 1
+ let lnum = prevnonblank(lnum)
+ let lastline = getline(lnum)
+
+ if b:InPHPcode_and_script && lastline =~ '?>\s*$'
+ let lnum = lnum - 1
+ elseif lastline =~ '^\s*?>.*<?\%(php\)\=\s*$'
+ let lnum = lnum - 1
+ elseif lastline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
+ let lnum = lnum - 1
+ elseif lastline =~ '\*/\s*$'
+ call cursor(lnum, 1)
+ if lastline !~ '^\*/'
+ call search('\*/', 'W')
+ endif
+ let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
+
+ let lastline = getline(lnum)
+ if lastline =~ '^\s*/\*'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+
+
+ elseif lastline =~? '\%(//\s*\|?>.*\)\@<!<?\%(php\)\=\s*$\|^\s*<script\>'
+
+ while lastline !~ '\(<?.*\)\@<!?>' && lnum > 1
+ let lnum = lnum - 1
+ let lastline = getline(lnum)
+ endwhile
+ if lastline =~ '^\s*?>'
+ let lnum = lnum - 1
+ else
+ break
+ endif
+
+
+ elseif lastline =~? '^\a\w*;\=$' && lastline !~? s:notPhpHereDoc
+ let tofind=substitute( lastline, '\(\a\w*\);\=', '<<<''\\=\1''\\=$', '')
+ while getline(lnum) !~? tofind && lnum > 1
+ let lnum = lnum - 1
+ endwhile
+ else
+ break
+ endif
+ endwhile
+
+ if lnum==1 && getline(lnum) !~ '<?'
+ let lnum=0
+ endif
+
+ if b:InPHPcode_and_script && !b:InPHPcode
+ let b:InPHPcode_and_script = 0
+ endif
+
+
+
+ return lnum
+endfunction " }}}
+
+function! Skippmatch2()
+
+ let line = getline(".")
+
+ if line =~ '\%(".*\)\@<=/\*\%(.*"\)\@=' || line =~ '\%(\%(//\|#\).*\)\@<=/\*'
+ return 1
+ else
+ return 0
+ endif
+endfun
+
+function! Skippmatch() " {{{
+ let synname = synIDattr(synID(line("."), col("."), 0), "name")
+ if synname == "Delimiter" || synname == "phpRegionDelimiter" || synname =~# "^phpParent" || synname == "phpArrayParens" || synname =~# '^php\%(Block\|Brace\)' || synname == "javaScriptBraces" || synname =~# "^phpComment" && b:UserIsTypingComment
+ return 0
+ else
+ return 1
+ endif
+endfun " }}}
+
+function! FindOpenBracket(lnum) " {{{
+ call cursor(a:lnum, 1)
+ return searchpair('{', '', '}', 'bW', 'Skippmatch()')
+endfun " }}}
+
+function! FindTheIfOfAnElse (lnum, StopAfterFirstPrevElse) " {{{
+
+ if getline(a:lnum) =~# '^\s*}\s*else\%(if\)\=\>'
+ let beforeelse = a:lnum
+ else
+ let beforeelse = GetLastRealCodeLNum(a:lnum - 1)
+ endif
+
+ if !s:level
+ let s:iftoskip = 0
+ endif
+
+ if getline(beforeelse) =~# '^\s*\%(}\s*\)\=else\%(\s*if\)\@!\>'
+ let s:iftoskip = s:iftoskip + 1
+ endif
+
+ if getline(beforeelse) =~ '^\s*}'
+ let beforeelse = FindOpenBracket(beforeelse)
+
+ if getline(beforeelse) =~ '^\s*{'
+ let beforeelse = GetLastRealCodeLNum(beforeelse - 1)
+ endif
+ endif
+
+
+ if !s:iftoskip && a:StopAfterFirstPrevElse && getline(beforeelse) =~# '^\s*\%([}]\s*\)\=else\%(if\)\=\>'
+ return beforeelse
+ endif
+
+ if getline(beforeelse) !~# '^\s*if\>' && beforeelse>1 || s:iftoskip && beforeelse>1
+
+ if s:iftoskip && getline(beforeelse) =~# '^\s*if\>'
+ let s:iftoskip = s:iftoskip - 1
+ endif
+
+ let s:level = s:level + 1
+ let beforeelse = FindTheIfOfAnElse(beforeelse, a:StopAfterFirstPrevElse)
+ endif
+
+ return beforeelse
+
+endfunction " }}}
+
+let s:defaultORcase = '^\s*\%(default\|case\).*:'
+
+function! FindTheSwitchIndent (lnum) " {{{
+
+
+ let test = GetLastRealCodeLNum(a:lnum - 1)
+
+ if test <= 1
+ return indent(1) - &sw * b:PHP_vintage_case_default_indent
+ end
+
+ if getline(test) =~ '^\s*}'
+ let test = FindOpenBracket(test)
+
+ if getline(test) =~ '^\s*{'
+ let test = GetLastRealCodeLNum(GetLastRealCodeLNum(test - 1) - 1)
+ endif
+ endif
+
+ if getline(test) =~# '^\s*switch\>'
+ return indent(test)
+ elseif getline(test) =~# s:defaultORcase
+ return indent(test) - &sw * b:PHP_vintage_case_default_indent
+ else
+ return FindTheSwitchIndent(test)
+ endif
+
+endfunction "}}}
+
+
+function! IslinePHP (lnum, tofind) " {{{
+ let cline = getline(a:lnum)
+
+ if a:tofind==""
+ let tofind = "^\\s*[\"']*\\s*\\zs\\S"
+ else
+ let tofind = a:tofind
+ endif
+
+ let tofind = tofind . '\c'
+
+ let coltotest = match (cline, tofind) + 1
+
+ let synname = synIDattr(synID(a:lnum, coltotest, 0), "name")
+
+ if synname =~ '^php' || synname=="Delimiter" || synname =~? '^javaScript'
+ return synname
+ else
+ return ""
+ endif
+endfunction " }}}
+
+let s:notPhpHereDoc = '\%(break\|return\|continue\|exit\|else\)'
+let s:blockstart = '\%(\%(\%(}\s*\)\=else\%(\s\+\)\=\)\=if\>\|else\>\|while\>\|switch\>\|case\>\|default\>\|for\%(each\)\=\>\|declare\>\|class\>\|interface\>\|abstract\>\|try\>\|catch\>\)'
+
+let s:autoresetoptions = 0
+if ! s:autoresetoptions
+ let s:autoresetoptions = 1
+endif
+
+function! ResetPhpOptions()
+ if ! b:optionsset && &filetype == "php"
+ if b:PHP_autoformatcomment
+
+ setlocal comments=s1:/*,mb:*,ex:*/,://,:#
+
+ setlocal formatoptions-=t
+ setlocal formatoptions+=q
+ setlocal formatoptions+=r
+ setlocal formatoptions+=o
+ setlocal formatoptions+=w
+ setlocal formatoptions+=c
+ setlocal formatoptions+=b
+ endif
+ let b:optionsset = 1
+ endif
+endfunc
+
+call ResetPhpOptions()
+
+function! GetPhpIndent()
+
+ let b:GetLastRealCodeLNum_ADD = 0
+
+ let UserIsEditing=0
+ if b:PHP_oldchangetick != b:changedtick
+ let b:PHP_oldchangetick = b:changedtick
+ let UserIsEditing=1
+ endif
+
+ if b:PHP_default_indenting
+ let b:PHP_default_indenting = g:PHP_default_indenting * &sw
+ endif
+
+ let cline = getline(v:lnum)
+
+ if !b:PHP_indentinghuge && b:PHP_lastindented > b:PHP_indentbeforelast
+ if b:PHP_indentbeforelast
+ let b:PHP_indentinghuge = 1
+ echom 'Large indenting detected, speed optimizations engaged (v1.33)'
+ endif
+ let b:PHP_indentbeforelast = b:PHP_lastindented
+ endif
+
+ if b:InPHPcode_checked && prevnonblank(v:lnum - 1) != b:PHP_lastindented
+ if b:PHP_indentinghuge
+ echom 'Large indenting deactivated'
+ let b:PHP_indentinghuge = 0
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+ endif
+ let b:PHP_lastindented = v:lnum
+ let b:PHP_LastIndentedWasComment=0
+ let b:PHP_InsideMultilineComment=0
+ let b:PHP_indentbeforelast = 0
+
+ let b:InPHPcode = 0
+ let b:InPHPcode_checked = 0
+ let b:InPHPcode_and_script = 0
+ let b:InPHPcode_tofind = ""
+
+ elseif v:lnum > b:PHP_lastindented
+ let real_PHP_lastindented = b:PHP_lastindented
+ let b:PHP_lastindented = v:lnum
+ endif
+
+
+ if !b:InPHPcode_checked " {{{ One time check
+ let b:InPHPcode_checked = 1
+
+ let synname = ""
+ if cline !~ '<?.*?>'
+ let synname = IslinePHP (prevnonblank(v:lnum), "")
+ endif
+
+ if synname!=""
+ if synname != "phpHereDoc" && synname != "phpHereDocDelimiter"
+ let b:InPHPcode = 1
+ let b:InPHPcode_tofind = ""
+
+ if synname =~# "^phpComment"
+ let b:UserIsTypingComment = 1
+ else
+ let b:UserIsTypingComment = 0
+ endif
+
+ if synname =~? '^javaScript'
+ let b:InPHPcode_and_script = 1
+ endif
+
+ else
+ let b:InPHPcode = 0
+ let b:UserIsTypingComment = 0
+
+ let lnum = v:lnum - 1
+ while getline(lnum) !~? '<<<''\=\a\w*''\=$' && lnum > 1
+ let lnum = lnum - 1
+ endwhile
+
+ let b:InPHPcode_tofind = substitute( getline(lnum), '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
+ endif
+ else
+ let b:InPHPcode = 0
+ let b:UserIsTypingComment = 0
+ let b:InPHPcode_tofind = '<?\%(.*?>\)\@!\|<script.*>'
+ endif
+ endif "!b:InPHPcode_checked }}}
+
+
+ " Test if we are indenting PHP code {{{
+ let lnum = prevnonblank(v:lnum - 1)
+ let last_line = getline(lnum)
+
+ if b:InPHPcode_tofind!=""
+ if cline =~? b:InPHPcode_tofind
+ let b:InPHPcode = 1
+ let b:InPHPcode_tofind = ""
+ let b:UserIsTypingComment = 0
+ if cline =~ '\*/'
+ call cursor(v:lnum, 1)
+ if cline !~ '^\*/'
+ call search('\*/', 'W')
+ endif
+ let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
+
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+
+ let b:PHP_LastIndentedWasComment = 0
+
+ if cline =~ '^\s*\*/'
+ return indent(lnum) + 1
+ else
+ return indent(lnum)
+ endif
+
+ elseif cline =~? '<script\>'
+ let b:InPHPcode_and_script = 1
+ let b:GetLastRealCodeLNum_ADD = v:lnum
+ endif
+ endif
+ endif
+
+ if b:InPHPcode
+
+ if !b:InPHPcode_and_script && last_line =~ '\%(<?.*\)\@<!?>\%(.*<?\)\@!' && IslinePHP(lnum, '?>')=~"Delimiter"
+ if cline !~? s:PHP_startindenttag
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = s:PHP_startindenttag
+ elseif cline =~? '<script\>'
+ let b:InPHPcode_and_script = 1
+ endif
+
+ elseif last_line =~? '<<<''\=\a\w*''\=$'
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = substitute( last_line, '^.*<<<''\=\(\a\w*\)''\=$', '^\\s*\1;\\=$', '')
+
+ elseif !UserIsEditing && cline =~ '^\s*/\*\%(.*\*/\)\@!' && getline(v:lnum + 1) !~ '^\s*\*'
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = '\*/'
+
+ elseif cline =~? '^\s*</script>'
+ let b:InPHPcode = 0
+ let b:InPHPcode_tofind = s:PHP_startindenttag
+ endif
+ endif " }}}
+
+
+ if !b:InPHPcode && !b:InPHPcode_and_script
+ return -1
+ endif
+
+ " Indent successive // or # comment the same way the first is {{{
+ if cline =~ '^\s*\%(//\|#\|/\*.*\*/\s*$\)'
+ if b:PHP_LastIndentedWasComment == 1
+ return indent(real_PHP_lastindented)
+ endif
+ let b:PHP_LastIndentedWasComment = 1
+ else
+ let b:PHP_LastIndentedWasComment = 0
+ endif " }}}
+
+ " Indent multiline /* comments correctly {{{
+
+ if b:PHP_InsideMultilineComment || b:UserIsTypingComment
+ if cline =~ '^\s*\*\%(\/\)\@!'
+ if last_line =~ '^\s*/\*'
+ return indent(lnum) + 1
+ else
+ return indent(lnum)
+ endif
+ else
+ let b:PHP_InsideMultilineComment = 0
+ endif
+ endif
+
+ if !b:PHP_InsideMultilineComment && cline =~ '^\s*/\*' && cline !~ '\*/\s*$'
+ if getline(v:lnum + 1) !~ '^\s*\*'
+ return -1
+ endif
+ let b:PHP_InsideMultilineComment = 1
+ endif " }}}
+
+
+ " Things always indented at col 1 (PHP delimiter: <?, ?>, Heredoc end) {{{
+ if cline =~# '^\s*<?' && cline !~ '?>' && b:PHP_outdentphpescape
+ return 0
+ endif
+
+ if cline =~ '^\s*?>' && cline !~# '<?' && b:PHP_outdentphpescape
+ return 0
+ endif
+
+ if cline =~? '^\s*\a\w*;$\|^\a\w*$' && cline !~? s:notPhpHereDoc
+ return 0
+ endif " }}}
+
+ let s:level = 0
+
+ let lnum = GetLastRealCodeLNum(v:lnum - 1)
+
+ let last_line = getline(lnum)
+ let ind = indent(lnum)
+ let endline= s:endline
+
+ if ind==0 && b:PHP_default_indenting
+ let ind = b:PHP_default_indenting
+ endif
+
+ if lnum == 0
+ return b:PHP_default_indenting
+ endif
+
+
+ if cline =~ '^\s*}\%(}}\)\@!'
+ let ind = indent(FindOpenBracket(v:lnum))
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+ return ind
+ endif
+
+ if cline =~ '^\s*\*/'
+ call cursor(v:lnum, 1)
+ if cline !~ '^\*/'
+ call search('\*/', 'W')
+ endif
+ let lnum = searchpair('/\*', '', '\*/', s:searchpairflags, 'Skippmatch2()')
+
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+
+ if cline =~ '^\s*\*/'
+ return indent(lnum) + 1
+ else
+ return indent(lnum)
+ endif
+ endif
+
+
+ if last_line =~ '[;}]'.endline && last_line !~ '^)' && last_line !~# s:defaultORcase
+ if ind==b:PHP_default_indenting
+ return b:PHP_default_indenting
+ elseif b:PHP_indentinghuge && ind==b:PHP_CurrentIndentLevel && cline !~# '^\s*\%(else\|\%(case\|default\).*:\|[})];\=\)' && last_line !~# '^\s*\%(\%(}\s*\)\=else\)' && getline(GetLastRealCodeLNum(lnum - 1))=~';'.endline
+ return b:PHP_CurrentIndentLevel
+ endif
+ endif
+
+ let LastLineClosed = 0
+
+ let terminated = '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\)'.endline
+
+ let unstated = '\%(^\s*'.s:blockstart.'.*)\|\%(//.*\)\@<!\<e'.'lse\>\)'.endline
+
+ if ind != b:PHP_default_indenting && cline =~# '^\s*else\%(if\)\=\>'
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+ return indent(FindTheIfOfAnElse(v:lnum, 1))
+ elseif cline =~# s:defaultORcase
+ return FindTheSwitchIndent(v:lnum) + &sw * b:PHP_vintage_case_default_indent
+ elseif cline =~ '^\s*)\=\s*{'
+ let previous_line = last_line
+ let last_line_num = lnum
+
+ while last_line_num > 1
+
+ if previous_line =~ '^\s*\%(' . s:blockstart . '\|\%([a-zA-Z]\s*\)*function\)'
+
+ let ind = indent(last_line_num)
+
+ if b:PHP_BracesAtCodeLevel
+ let ind = ind + &sw
+ endif
+
+ return ind
+ endif
+
+ let last_line_num = last_line_num - 1
+ let previous_line = getline(last_line_num)
+ endwhile
+
+ elseif last_line =~# unstated && cline !~ '^\s*);\='.endline
+ let ind = ind + &sw
+ return ind
+
+ elseif (ind != b:PHP_default_indenting || last_line =~ '^)' ) && last_line =~ terminated
+ let previous_line = last_line
+ let last_line_num = lnum
+ let LastLineClosed = 1
+
+ while 1
+ if previous_line =~ '^\s*}'
+ let last_line_num = FindOpenBracket(last_line_num)
+
+ if getline(last_line_num) =~ '^\s*{'
+ let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
+ endif
+
+ let previous_line = getline(last_line_num)
+
+ continue
+ else
+
+ if getline(last_line_num) =~# '^\s*else\%(if\)\=\>'
+ let last_line_num = FindTheIfOfAnElse(last_line_num, 0)
+ continue
+ endif
+
+
+ let last_match = last_line_num
+
+ let one_ahead_indent = indent(last_line_num)
+ let last_line_num = GetLastRealCodeLNum(last_line_num - 1)
+ let two_ahead_indent = indent(last_line_num)
+ let after_previous_line = previous_line
+ let previous_line = getline(last_line_num)
+
+
+ if previous_line =~# s:defaultORcase.'\|{'.endline
+ break
+ endif
+
+ if after_previous_line=~# '^\s*'.s:blockstart.'.*)'.endline && previous_line =~# '[;}]'.endline
+ break
+ endif
+
+ if one_ahead_indent == two_ahead_indent || last_line_num < 1
+ if previous_line =~# '\%(;\|^\s*}\)'.endline || last_line_num < 1
+ break
+ endif
+ endif
+ endif
+ endwhile
+
+ if indent(last_match) != ind
+ let ind = indent(last_match)
+ let b:PHP_CurrentIndentLevel = b:PHP_default_indenting
+
+ return ind
+ endif
+ endif
+
+ let plinnum = GetLastRealCodeLNum(lnum - 1)
+ let AntepenultimateLine = getline(plinnum)
+
+ let last_line = substitute(last_line,"\\(//\\|#\\)\\(\\(\\([^\"']*\\([\"']\\)[^\"']*\\5\\)\\+[^\"']*$\\)\\|\\([^\"']*$\\)\\)",'','')
+
+
+ if ind == b:PHP_default_indenting
+ if last_line =~ terminated
+ let LastLineClosed = 1
+ endif
+ endif
+
+ if !LastLineClosed
+
+
+ if last_line =~# '[{(]'.endline || last_line =~? '\h\w*\s*(.*,$' && AntepenultimateLine !~ '[,(]'.endline
+
+ if !b:PHP_BracesAtCodeLevel || last_line !~# '^\s*{'
+ let ind = ind + &sw
+ endif
+
+ if b:PHP_BracesAtCodeLevel || b:PHP_vintage_case_default_indent == 1
+ let b:PHP_CurrentIndentLevel = ind
+
+ return ind
+ endif
+
+ elseif last_line =~ '\S\+\s*),'.endline
+ call cursor(lnum, 1)
+ call search('),'.endline, 'W')
+ let openedparent = searchpair('(', '', ')', 'bW', 'Skippmatch()')
+ if openedparent != lnum
+ let ind = indent(openedparent)
+ endif
+
+ elseif last_line =~ '^\s*'.s:blockstart
+ let ind = ind + &sw
+
+
+
+ elseif AntepenultimateLine =~ '\%(;\%(\s*?>\)\=\|<<<''\=\a\w*''\=$\|^\s*}\|{\)'.endline . '\|' . s:defaultORcase
+ let ind = ind + &sw
+ endif
+
+ endif
+
+ if cline =~ '^\s*);\='
+ let ind = ind - &sw
+ endif
+
+ let b:PHP_CurrentIndentLevel = ind
+ return ind
+endfunction
diff --git a/vim73/indent/postscr.vim b/vim73/indent/postscr.vim
new file mode 100644
index 0000000..b0ff48e
--- /dev/null
+++ b/vim73/indent/postscr.vim
@@ -0,0 +1,68 @@
+" PostScript indent file
+" Language: PostScript
+" Maintainer: Mike Williams <mrw@netcomuk.co.uk>
+" Last Change: 2nd July 2001
+"
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=PostscrIndentGet(v:lnum)
+setlocal indentkeys+=0],0=>>,0=%%,0=end,0=restore,0=grestore indentkeys-=:,0#,e
+
+" Catch multiple instantiations
+if exists("*PostscrIndentGet")
+ finish
+endif
+
+function! PostscrIndentGet(lnum)
+ " Find a non-empty non-comment line above the current line.
+ " Note: ignores DSC comments as well!
+ let lnum = a:lnum - 1
+ while lnum != 0
+ let lnum = prevnonblank(lnum)
+ if getline(lnum) !~ '^\s*%.*$'
+ break
+ endif
+ let lnum = lnum - 1
+ endwhile
+
+ " Hit the start of the file, use user indent.
+ if lnum == 0
+ return -1
+ endif
+
+ " Start with the indent of the previous line
+ let ind = indent(lnum)
+ let pline = getline(lnum)
+
+ " Indent for dicts, arrays, and saves with possible trailing comment
+ if pline =~ '\(begin\|<<\|g\=save\|{\|[\)\s*\(%.*\)\=$'
+ let ind = ind + &sw
+ endif
+
+ " Remove indent for popped dicts, and restores.
+ if pline =~ '\(end\|g\=restore\)\s*$'
+ let ind = ind - &sw
+
+ " Else handle immediate dedents of dicts, restores, and arrays.
+ elseif getline(a:lnum) =~ '\(end\|>>\|g\=restore\|}\|]\)'
+ let ind = ind - &sw
+
+ " Else handle DSC comments - always start of line.
+ elseif getline(a:lnum) =~ '^\s*%%'
+ let ind = 0
+ endif
+
+ " For now catch excessive left indents if they occur.
+ if ind < 0
+ let ind = -1
+ endif
+
+ return ind
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/pov.vim b/vim73/indent/pov.vim
new file mode 100644
index 0000000..2b19763
--- /dev/null
+++ b/vim73/indent/pov.vim
@@ -0,0 +1,84 @@
+" Vim indent file
+" Language: PoV-Ray Scene Description Language
+" Maintainer: David Necas (Yeti) <yeti@physics.muni.cz>
+" Last Change: 2002-10-20
+" URI: http://trific.ath.cx/Ftp/vim/indent/pov.vim
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Some preliminary settings.
+setlocal nolisp " Make sure lisp indenting doesn't supersede us.
+
+setlocal indentexpr=GetPoVRayIndent()
+setlocal indentkeys+==else,=end,0]
+
+" Only define the function once.
+if exists("*GetPoVRayIndent")
+ finish
+endif
+
+" Counts matches of a regexp <rexp> in line number <line>.
+" Doesn't count matches inside strings and comments (as defined by current
+" syntax).
+function! s:MatchCount(line, rexp)
+ let str = getline(a:line)
+ let i = 0
+ let n = 0
+ while i >= 0
+ let i = matchend(str, a:rexp, i)
+ if i >= 0 && synIDattr(synID(a:line, i, 0), "name") !~? "string\|comment"
+ let n = n + 1
+ endif
+ endwhile
+ return n
+endfunction
+
+" The main function. Returns indent amount.
+function GetPoVRayIndent()
+ " If we are inside a comment (may be nested in obscure ways), give up
+ if synIDattr(synID(v:lnum, indent(v:lnum)+1, 0), "name") =~? "string\|comment"
+ return -1
+ endif
+
+ " Search backwards for the frist non-empty, non-comment line.
+ let plnum = prevnonblank(v:lnum - 1)
+ let plind = indent(plnum)
+ while plnum > 0 && synIDattr(synID(plnum, plind+1, 0), "name") =~? "comment"
+ let plnum = prevnonblank(plnum - 1)
+ let plind = indent(plnum)
+ endwhile
+
+ " Start indenting from zero
+ if plnum == 0
+ return 0
+ endif
+
+ " Analyse previous nonempty line.
+ let chg = 0
+ let chg = chg + s:MatchCount(plnum, '[[{(]')
+ let chg = chg + s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\|while\|macro\|else\)\>')
+ let chg = chg - s:MatchCount(plnum, '#\s*end\>')
+ let chg = chg - s:MatchCount(plnum, '[]})]')
+ " Dirty hack for people writing #if and #else on the same line.
+ let chg = chg - s:MatchCount(plnum, '#\s*\%(if\|ifdef\|ifndef\|switch\)\>.*#\s*else\>')
+ " When chg > 0, then we opened groups and we should indent more, but when
+ " chg < 0, we closed groups and this already affected the previous line,
+ " so we should not dedent. And when everything else fails, scream.
+ let chg = chg > 0 ? chg : 0
+
+ " Analyse current line
+ " FIXME: If we have to dedent, we should try to find the indentation of the
+ " opening line.
+ let cur = s:MatchCount(v:lnum, '^\s*\%(#\s*\%(end\|else\)\>\|[]})]\)')
+ if cur > 0
+ let final = plind + (chg - cur) * &sw
+ else
+ let final = plind + chg * &sw
+ endif
+
+ return final < 0 ? 0 : final
+endfunction
diff --git a/vim73/indent/prolog.vim b/vim73/indent/prolog.vim
new file mode 100644
index 0000000..afe448e
--- /dev/null
+++ b/vim73/indent/prolog.vim
@@ -0,0 +1,58 @@
+" vim: set sw=4 sts=4:
+" Maintainer : Gergely Kontra <kgergely@mcl.hu>
+" Revised on : 2002.02.18. 23:34:05
+" Language : Prolog
+
+" 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)
+
+" 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*%'
+ retu ind
+ endif
+ " Check for clause head on previous line
+ if pline =~ ':-\s*\(%.*\)\?$'
+ let ind = ind + &sw
+ " Check for end of clause on previous line
+ elseif pline =~ '\.\s*\(%.*\)\?$'
+ let ind = ind - &sw
+ endif
+ " Check for opening conditional on previous line
+ if pline =~ '^\s*\([(;]\|->\)'
+ let ind = ind + &sw
+ endif
+ " Check for closing an unclosed paren, or middle ; or ->
+ if line =~ '^\s*\([);]\|->\)'
+ let ind = ind - &sw
+ endif
+ return ind
+endfunction
diff --git a/vim73/indent/pyrex.vim b/vim73/indent/pyrex.vim
new file mode 100644
index 0000000..a1a1746
--- /dev/null
+++ b/vim73/indent/pyrex.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: Pyrex
+" Maintainer: Marco Barisione <marco.bari@people.it>
+" URL: http://marcobari.altervista.org/pyrex_vim.html
+" Last Change: 2005 Jun 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use Python formatting rules
+runtime! indent/python.vim
diff --git a/vim73/indent/python.vim b/vim73/indent/python.vim
new file mode 100644
index 0000000..0c04e81
--- /dev/null
+++ b/vim73/indent/python.vim
@@ -0,0 +1,193 @@
+" Vim indent file
+" Language: Python
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Original Author: David Bustos <bustos@caltech.edu>
+" Last Change: 2006 Jun 18
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" Some preliminary settings
+setlocal nolisp " Make sure lisp indenting doesn't supersede us
+setlocal autoindent " indentexpr isn't much help otherwise
+
+setlocal indentexpr=GetPythonIndent(v:lnum)
+setlocal indentkeys+=<:>,=elif,=except
+
+" Only define the function once.
+if exists("*GetPythonIndent")
+ finish
+endif
+
+" Come here when loading the script the first time.
+
+let s:maxoff = 50 " maximum number of lines to look backwards for ()
+
+function GetPythonIndent(lnum)
+
+ " If this line is explicitly joined: If the previous line was also joined,
+ " line it up with that one, otherwise add two 'shiftwidth'
+ if getline(a:lnum - 1) =~ '\\$'
+ if a:lnum > 1 && getline(a:lnum - 2) =~ '\\$'
+ return indent(a:lnum - 1)
+ endif
+ return indent(a:lnum - 1) + (exists("g:pyindent_continue") ? eval(g:pyindent_continue) : (&sw * 2))
+ endif
+
+ " If the start of the line is in a string don't change the indent.
+ if has('syntax_items')
+ \ && synIDattr(synID(a:lnum, 1, 1), "name") =~ "String$"
+ return -1
+ endif
+
+ " Search backwards for the previous non-empty line.
+ let plnum = prevnonblank(v:lnum - 1)
+
+ if plnum == 0
+ " This is the first non-empty line, use zero indent.
+ return 0
+ endif
+
+ " If the previous line is inside parenthesis, use the indent of the starting
+ " line.
+ " Trick: use the non-existing "dummy" variable to break out of the loop when
+ " going too far back.
+ call cursor(plnum, 1)
+ let parlnum = searchpair('(\|{\|\[', '', ')\|}\|\]', 'nbW',
+ \ "line('.') < " . (plnum - s:maxoff) . " ? dummy :"
+ \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+ \ . " =~ '\\(Comment\\|String\\)$'")
+ if parlnum > 0
+ let plindent = indent(parlnum)
+ let plnumstart = parlnum
+ else
+ let plindent = indent(plnum)
+ let plnumstart = plnum
+ endif
+
+
+ " When inside parenthesis: If at the first line below the parenthesis add
+ " two 'shiftwidth', otherwise same as previous line.
+ " i = (a
+ " + b
+ " + c)
+ call cursor(a:lnum, 1)
+ let p = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+ \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
+ \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+ \ . " =~ '\\(Comment\\|String\\)$'")
+ if p > 0
+ if p == plnum
+ " When the start is inside parenthesis, only indent one 'shiftwidth'.
+ let pp = searchpair('(\|{\|\[', '', ')\|}\|\]', 'bW',
+ \ "line('.') < " . (a:lnum - s:maxoff) . " ? dummy :"
+ \ . " synIDattr(synID(line('.'), col('.'), 1), 'name')"
+ \ . " =~ '\\(Comment\\|String\\)$'")
+ if pp > 0
+ return indent(plnum) + (exists("g:pyindent_nested_paren") ? eval(g:pyindent_nested_paren) : &sw)
+ endif
+ return indent(plnum) + (exists("g:pyindent_open_paren") ? eval(g:pyindent_open_paren) : (&sw * 2))
+ endif
+ if plnumstart == p
+ return indent(plnum)
+ endif
+ return plindent
+ endif
+
+
+ " Get the line and remove a trailing comment.
+ " Use syntax highlighting attributes when possible.
+ let pline = getline(plnum)
+ let pline_len = strlen(pline)
+ if has('syntax_items')
+ " If the last character in the line is a comment, do a binary search for
+ " the start of the comment. synID() is slow, a linear search would take
+ " too long on a long line.
+ if synIDattr(synID(plnum, pline_len, 1), "name") =~ "Comment$"
+ let min = 1
+ let max = pline_len
+ while min < max
+ let col = (min + max) / 2
+ if synIDattr(synID(plnum, col, 1), "name") =~ "Comment$"
+ let max = col
+ else
+ let min = col + 1
+ endif
+ endwhile
+ let pline = strpart(pline, 0, min - 1)
+ endif
+ else
+ let col = 0
+ while col < pline_len
+ if pline[col] == '#'
+ let pline = strpart(pline, 0, col)
+ break
+ endif
+ let col = col + 1
+ endwhile
+ endif
+
+ " If the previous line ended with a colon, indent this line
+ if pline =~ ':\s*$'
+ return plindent + &sw
+ endif
+
+ " If the previous line was a stop-execution statement...
+ if getline(plnum) =~ '^\s*\(break\|continue\|raise\|return\|pass\)\>'
+ " See if the user has already dedented
+ if indent(a:lnum) > indent(plnum) - &sw
+ " If not, recommend one dedent
+ return indent(plnum) - &sw
+ endif
+ " Otherwise, trust the user
+ return -1
+ endif
+
+ " If the current line begins with a keyword that lines up with "try"
+ if getline(a:lnum) =~ '^\s*\(except\|finally\)\>'
+ let lnum = a:lnum - 1
+ while lnum >= 1
+ if getline(lnum) =~ '^\s*\(try\|except\)\>'
+ let ind = indent(lnum)
+ if ind >= indent(a:lnum)
+ return -1 " indent is already less than this
+ endif
+ return ind " line up with previous try or except
+ endif
+ let lnum = lnum - 1
+ endwhile
+ return -1 " no matching "try"!
+ endif
+
+ " If the current line begins with a header keyword, dedent
+ if getline(a:lnum) =~ '^\s*\(elif\|else\)\>'
+
+ " Unless the previous line was a one-liner
+ if getline(plnumstart) =~ '^\s*\(for\|if\|try\)\>'
+ return plindent
+ endif
+
+ " Or the user has already dedented
+ if indent(a:lnum) <= plindent - &sw
+ return -1
+ endif
+
+ return plindent - &sw
+ endif
+
+ " When after a () construct we probably want to go back to the start line.
+ " a = (b
+ " + c)
+ " here
+ if parlnum > 0
+ return plindent
+ endif
+
+ return -1
+
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/readline.vim b/vim73/indent/readline.vim
new file mode 100644
index 0000000..6ac2185
--- /dev/null
+++ b/vim73/indent/readline.vim
@@ -0,0 +1,36 @@
+" Vim indent file
+" Language: readline configuration file
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetReadlineIndent()
+setlocal indentkeys=!^F,o,O,=$else,=$endif
+setlocal nosmartindent
+
+if exists("*GetReadlineIndent")
+ finish
+endif
+
+function GetReadlineIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~ '^\s*$\(if\|else\)\>'
+ let ind = ind + &sw
+ endif
+
+ if getline(v:lnum) =~ '^\s*$\(else\|endif\)\>'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/rpl.vim b/vim73/indent/rpl.vim
new file mode 100644
index 0000000..07bfd06
--- /dev/null
+++ b/vim73/indent/rpl.vim
@@ -0,0 +1,63 @@
+" Vim indent file
+" Language: RPL/2
+" Version: 0.2
+" Last Change: 2005 Mar 28
+" Maintainer: BERTRAND Joël <rpl2@free.fr>
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentkeys+==~end,=~case,=~if,=~then,=~else,=~do,=~until,=~while,=~repeat,=~select,=~default,=~for,=~start,=~next,=~step,<<>,<>>
+
+" Define the appropriate indent function but only once
+setlocal indentexpr=RplGetFreeIndent()
+if exists("*RplGetFreeIndent")
+ finish
+endif
+
+let b:undo_indent = "set ai< indentkeys< indentexpr<"
+
+function RplGetIndent(lnum)
+ let ind = indent(a:lnum)
+ let prevline=getline(a:lnum)
+ " Strip tail comment
+ let prevstat=substitute(prevline, '!.*$', '', '')
+
+ " Add a shiftwidth to statements following if, iferr, then, else, elseif,
+ " case, select, default, do, until, while, repeat, for, start
+ if prevstat =~? '\<\(if\|iferr\|do\|while\)\>' && prevstat =~? '\<end\>'
+ elseif prevstat =~? '\(^\|\s\+\)<<\($\|\s\+\)' && prevstat =~? '\s\+>>\($\|\s\+\)'
+ elseif prevstat =~? '\<\(if\|iferr\|then\|else\|elseif\|select\|case\|do\|until\|while\|repeat\|for\|start\|default\)\>' || prevstat =~? '\(^\|\s\+\)<<\($\|\s\+\)'
+ let ind = ind + &sw
+ endif
+
+ " Subtract a shiftwidth from then, else, elseif, end, until, repeat, next,
+ " step
+ let line = getline(v:lnum)
+ if line =~? '^\s*\(then\|else\|elseif\|until\|repeat\|next\|step\|default\|end\)\>'
+ let ind = ind - &sw
+ elseif line =~? '^\s*>>\($\|\s\+\)'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
+
+function RplGetFreeIndent()
+ " Find the previous non-blank line
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Use zero indent at the top of the file
+ if lnum == 0
+ return 0
+ endif
+
+ let ind=RplGetIndent(lnum)
+ return ind
+endfunction
+
+" vim:sw=2 tw=130
diff --git a/vim73/indent/rst.vim b/vim73/indent/rst.vim
new file mode 100644
index 0000000..f936c9b
--- /dev/null
+++ b/vim73/indent/rst.vim
@@ -0,0 +1,53 @@
+" Vim indent file
+" Language: reStructuredText Documentation Format
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetRSTIndent()
+setlocal indentkeys=!^F,o,O
+setlocal nosmartindent
+
+if exists("*GetRSTIndent")
+ finish
+endif
+
+function GetRSTIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let line = getline(lnum)
+
+ if line =~ '^\s*[-*+]\s'
+ let ind = ind + 2
+ elseif line =~ '^\s*\d\+.\s'
+ let ind = ind + matchend(substitute(line, '^\s*', '', ''), '\d\+.\s\+')
+ endif
+
+ let line = getline(v:lnum - 1)
+
+ if line =~ '^\s*$'
+ execute lnum
+ call search('^\s*\%([-*+]\s\|\d\+.\s\|\.\.\|$\)', 'bW')
+ let line = getline('.')
+ if line =~ '^\s*[-*+]'
+ let ind = ind - 2
+ elseif line =~ '^\s*\d\+\.\s'
+ let ind = ind - matchend(substitute(line, '^\s*', '', ''),
+ \ '\d\+\.\s\+')
+ elseif line =~ '^\s*\.\.'
+ let ind = ind - 3
+ else
+ let ind = ind
+ endif
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/ruby.vim b/vim73/indent/ruby.vim
new file mode 100644
index 0000000..04d1301
--- /dev/null
+++ b/vim73/indent/ruby.vim
@@ -0,0 +1,378 @@
+" Vim indent file
+" Language: Ruby
+" Maintainer: Nikolai Weibull <now at bitwi.se>
+" Last Change: 2009 Dec 17
+" URL: http://vim-ruby.rubyforge.org
+" Anon CVS: See above site
+" Release Coordinator: Doug Kearns <dougkearns@gmail.com>
+
+" 0. Initialization {{{1
+" =================
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal nosmartindent
+
+" Now, set up our indentation expression and keys that trigger it.
+setlocal indentexpr=GetRubyIndent()
+setlocal indentkeys=0{,0},0),0],!^F,o,O,e
+setlocal indentkeys+==end,=elsif,=when,=ensure,=rescue,==begin,==end
+
+" Only define the function once.
+if exists("*GetRubyIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+" 1. Variables {{{1
+" ============
+
+" Regex of syntax group names that are or delimit string or are comments.
+let s:syng_strcom = '\<ruby\%(String\|StringEscape\|ASCIICode' .
+ \ '\|Interpolation\|NoInterpolation\|Comment\|Documentation\)\>'
+
+" Regex of syntax group names that are strings.
+let s:syng_string =
+ \ '\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\)\>'
+
+" Regex of syntax group names that are strings or documentation.
+let s:syng_stringdoc =
+ \'\<ruby\%(String\|Interpolation\|NoInterpolation\|StringEscape\|Documentation\)\>'
+
+" Expression used to check whether we should skip a match with searchpair().
+let s:skip_expr =
+ \ "synIDattr(synID(line('.'),col('.'),1),'name') =~ '".s:syng_strcom."'"
+
+" Regex used for words that, at the start of a line, add a level of indent.
+let s:ruby_indent_keywords = '^\s*\zs\<\%(module\|class\|def\|if\|for' .
+ \ '\|while\|until\|else\|elsif\|case\|when\|unless\|begin\|ensure' .
+ \ '\|rescue\)\>' .
+ \ '\|\%([*+/,=-]\|<<\|>>\|:\s\)\s*\zs' .
+ \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\)\>'
+
+" Regex used for words that, at the start of a line, remove a level of indent.
+let s:ruby_deindent_keywords =
+ \ '^\s*\zs\<\%(ensure\|else\|rescue\|elsif\|when\|end\)\>'
+
+" Regex that defines the start-match for the 'end' keyword.
+"let s:end_start_regex = '\%(^\|[^.]\)\<\%(module\|class\|def\|if\|for\|while\|until\|case\|unless\|begin\|do\)\>'
+" TODO: the do here should be restricted somewhat (only at end of line)?
+let s:end_start_regex = '^\s*\zs\<\%(module\|class\|def\|if\|for' .
+ \ '\|while\|until\|case\|unless\|begin\)\>' .
+ \ '\|\%([*+/,=-]\|<<\|>>\|:\s\)\s*\zs' .
+ \ '\<\%(if\|for\|while\|until\|case\|unless\|begin\)\>' .
+ \ '\|\<do\>'
+
+" Regex that defines the middle-match for the 'end' keyword.
+let s:end_middle_regex = '\<\%(ensure\|else\|\%(\%(^\|;\)\s*\)\@<=\<rescue\>\|when\|elsif\)\>'
+
+" Regex that defines the end-match for the 'end' keyword.
+let s:end_end_regex = '\%(^\|[^.:@$]\)\@<=\<end\>'
+
+" Expression used for searchpair() call for finding match for 'end' keyword.
+let s:end_skip_expr = s:skip_expr .
+ \ ' || (expand("<cword>") == "do"' .
+ \ ' && getline(".") =~ "^\\s*\\<\\(while\\|until\\|for\\)\\>")'
+
+" Regex that defines continuation lines, not including (, {, or [.
+let s:continuation_regex = '\%([\\*+/.,:]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+
+" Regex that defines continuation lines.
+" TODO: this needs to deal with if ...: and so on
+let s:continuation_regex2 =
+ \ '\%([\\*+/.,:({[]\|\%(<%\)\@<![=-]\|\W[|&?]\|||\|&&\)\s*\%(#.*\)\=$'
+
+" Regex that defines blocks.
+let s:block_regex =
+ \ '\%(\<do\>\|{\)\s*\%(|\%([*@]\=\h\w*,\=\s*\)\%(,\s*[*@]\=\h\w*\)*|\)\=\s*\%(#.*\)\=$'
+
+" 2. Auxiliary Functions {{{1
+" ======================
+
+" Check if the character at lnum:col is inside a string, comment, or is ascii.
+function s:IsInStringOrComment(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_strcom
+endfunction
+
+" Check if the character at lnum:col is inside a string.
+function s:IsInString(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_string
+endfunction
+
+" Check if the character at lnum:col is inside a string or documentation.
+function s:IsInStringOrDocumentation(lnum, col)
+ return synIDattr(synID(a:lnum, a:col, 1), 'name') =~ s:syng_stringdoc
+endfunction
+
+" Find line above 'lnum' that isn't empty, in a comment, or in a string.
+function s:PrevNonBlankNonString(lnum)
+ let in_block = 0
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ " Go in and out of blocks comments as necessary.
+ " If the line isn't empty (with opt. comment) or in a string, end search.
+ let line = getline(lnum)
+ if line =~ '^=begin$'
+ if in_block
+ let in_block = 0
+ else
+ break
+ endif
+ elseif !in_block && line =~ '^=end$'
+ let in_block = 1
+ elseif !in_block && line !~ '^\s*#.*$' && !(s:IsInStringOrComment(lnum, 1)
+ \ && s:IsInStringOrComment(lnum, strlen(line)))
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+" Find line above 'lnum' that started the continuation 'lnum' may be part of.
+function s:GetMSL(lnum)
+ " Start on the line we're at and use its indent.
+ let msl = a:lnum
+ let lnum = s:PrevNonBlankNonString(a:lnum - 1)
+ while lnum > 0
+ " If we have a continuation line, or we're in a string, use line as MSL.
+ " Otherwise, terminate search as we have found our MSL already.
+ let line = getline(lnum)
+ let col = match(line, s:continuation_regex2) + 1
+ if (col > 0 && !s:IsInStringOrComment(lnum, col))
+ \ || s:IsInString(lnum, strlen(line))
+ let msl = lnum
+ else
+ break
+ endif
+ let lnum = s:PrevNonBlankNonString(lnum - 1)
+ endwhile
+ return msl
+endfunction
+
+" Check if line 'lnum' has more opening brackets than closing ones.
+function s:LineHasOpeningBrackets(lnum)
+ let open_0 = 0
+ let open_2 = 0
+ let open_4 = 0
+ let line = getline(a:lnum)
+ let pos = match(line, '[][(){}]', 0)
+ while pos != -1
+ if !s:IsInStringOrComment(a:lnum, pos + 1)
+ let idx = stridx('(){}[]', line[pos])
+ if idx % 2 == 0
+ let open_{idx} = open_{idx} + 1
+ else
+ let open_{idx - 1} = open_{idx - 1} - 1
+ endif
+ endif
+ let pos = match(line, '[][(){}]', pos + 1)
+ endwhile
+ return (open_0 > 0) . (open_2 > 0) . (open_4 > 0)
+endfunction
+
+function s:Match(lnum, regex)
+ let col = match(getline(a:lnum), '\C'.a:regex) + 1
+ return col > 0 && !s:IsInStringOrComment(a:lnum, col) ? col : 0
+endfunction
+
+function s:MatchLast(lnum, regex)
+ let line = getline(a:lnum)
+ let col = match(line, '.*\zs' . a:regex)
+ while col != -1 && s:IsInStringOrComment(a:lnum, col)
+ let line = strpart(line, 0, col)
+ let col = match(line, '.*' . a:regex)
+ endwhile
+ return col + 1
+endfunction
+
+" 3. GetRubyIndent Function {{{1
+" =========================
+
+function GetRubyIndent()
+ " 3.1. Setup {{{2
+ " ----------
+
+ " Set up variables for restoring position in file. Could use v:lnum here.
+ let vcol = col('.')
+
+ " 3.2. Work on the current line {{{2
+ " -----------------------------
+
+ " Get the current line.
+ let line = getline(v:lnum)
+ let ind = -1
+
+ " If we got a closing bracket on an empty line, find its match and indent
+ " according to it. For parentheses we indent to its column - 1, for the
+ " others we indent to the containing line's MSL's level. Return -1 if fail.
+ let col = matchend(line, '^\s*[]})]')
+ if col > 0 && !s:IsInStringOrComment(v:lnum, col)
+ call cursor(v:lnum, col)
+ let bs = strpart('(){}[]', stridx(')}]', line[col - 1]) * 2, 2)
+ if searchpair(escape(bs[0], '\['), '', bs[1], 'bW', s:skip_expr) > 0
+ if line[col-1]==')' && col('.') != col('$') - 1
+ let ind = virtcol('.')-1
+ else
+ let ind = indent(s:GetMSL(line('.')))
+ endif
+ endif
+ return ind
+ endif
+
+ " If we have a =begin or =end set indent to first column.
+ if match(line, '^\s*\%(=begin\|=end\)$') != -1
+ return 0
+ endif
+
+ " If we have a deindenting keyword, find its match and indent to its level.
+ " TODO: this is messy
+ if s:Match(v:lnum, s:ruby_deindent_keywords)
+ call cursor(v:lnum, 1)
+ if searchpair(s:end_start_regex, s:end_middle_regex, s:end_end_regex, 'bW',
+ \ s:end_skip_expr) > 0
+ let line = getline('.')
+ if strpart(line, 0, col('.') - 1) =~ '=\s*$' &&
+ \ strpart(line, col('.') - 1, 2) !~ 'do'
+ let ind = virtcol('.') - 1
+ else
+ let ind = indent('.')
+ endif
+ endif
+ return ind
+ endif
+
+ " If we are in a multi-line string or line-comment, don't do anything to it.
+ if s:IsInStringOrDocumentation(v:lnum, matchend(line, '^\s*') + 1)
+ return indent('.')
+ endif
+
+ " 3.3. Work on the previous line. {{{2
+ " -------------------------------
+
+ " Find a non-blank, non-multi-line string line above the current line.
+ let lnum = s:PrevNonBlankNonString(v:lnum - 1)
+
+ " If the line is empty and inside a string, use the previous line.
+ if line =~ '^\s*$' && lnum != prevnonblank(v:lnum - 1)
+ return indent(prevnonblank(v:lnum))
+ endif
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Set up variables for current line.
+ let line = getline(lnum)
+ let ind = indent(lnum)
+
+ " If the previous line ended with a block opening, add a level of indent.
+ if s:Match(lnum, s:block_regex)
+ return indent(s:GetMSL(lnum)) + &sw
+ endif
+
+ " If the previous line contained an opening bracket, and we are still in it,
+ " add indent depending on the bracket type.
+ if line =~ '[[({]'
+ let counts = s:LineHasOpeningBrackets(lnum)
+ if counts[0] == '1' && searchpair('(', '', ')', 'bW', s:skip_expr) > 0
+ if col('.') + 1 == col('$')
+ return ind + &sw
+ else
+ return virtcol('.')
+ endif
+ elseif counts[1] == '1' || counts[2] == '1'
+ return ind + &sw
+ else
+ call cursor(v:lnum, vcol)
+ end
+ endif
+
+ " If the previous line ended with an "end", match that "end"s beginning's
+ " indent.
+ let col = s:Match(lnum, '\%(^\|[^.:@$]\)\<end\>\s*\%(#.*\)\=$')
+ if col > 0
+ call cursor(lnum, col)
+ if searchpair(s:end_start_regex, '', s:end_end_regex, 'bW',
+ \ s:end_skip_expr) > 0
+ let n = line('.')
+ let ind = indent('.')
+ let msl = s:GetMSL(n)
+ if msl != n
+ let ind = indent(msl)
+ end
+ return ind
+ endif
+ end
+
+ let col = s:Match(lnum, s:ruby_indent_keywords)
+ if col > 0
+ call cursor(lnum, col)
+ let ind = virtcol('.') - 1 + &sw
+" let ind = indent(lnum) + &sw
+ " TODO: make this better (we need to count them) (or, if a searchpair
+ " fails, we know that something is lacking an end and thus we indent a
+ " level
+ if s:Match(lnum, s:end_end_regex)
+ let ind = indent('.')
+ endif
+ return ind
+ endif
+
+ " 3.4. Work on the MSL line. {{{2
+ " --------------------------
+
+ " Set up variables to use and search for MSL to the previous line.
+ let p_lnum = lnum
+ let lnum = s:GetMSL(lnum)
+
+ " If the previous line wasn't a MSL and is continuation return its indent.
+ " TODO: the || s:IsInString() thing worries me a bit.
+ if p_lnum != lnum
+ if s:Match(p_lnum,s:continuation_regex)||s:IsInString(p_lnum,strlen(line))
+ return ind
+ endif
+ endif
+
+ " Set up more variables, now that we know we wasn't continuation bound.
+ let line = getline(lnum)
+ let msl_ind = indent(lnum)
+
+ " If the MSL line had an indenting keyword in it, add a level of indent.
+ " TODO: this does not take into account contrived things such as
+ " module Foo; class Bar; end
+ if s:Match(lnum, s:ruby_indent_keywords)
+ let ind = msl_ind + &sw
+ if s:Match(lnum, s:end_end_regex)
+ let ind = ind - &sw
+ endif
+ return ind
+ endif
+
+ " If the previous line ended with [*+/.-=], indent one extra level.
+ if s:Match(lnum, s:continuation_regex)
+ if lnum == p_lnum
+ let ind = msl_ind + &sw
+ else
+ let ind = msl_ind
+ endif
+ endif
+
+ " }}}2
+
+ return ind
+endfunction
+
+" }}}1
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
+
+" vim:set sw=2 sts=2 ts=8 noet:
diff --git a/vim73/indent/sass.vim b/vim73/indent/sass.vim
new file mode 100644
index 0000000..4622f00
--- /dev/null
+++ b/vim73/indent/sass.vim
@@ -0,0 +1,39 @@
+" Vim indent file
+" Language: Sass
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 May 21
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent sw=2 et
+setlocal indentexpr=GetSassIndent()
+setlocal indentkeys=o,O,*<Return>,<:>,!^F
+
+" Only define the function once.
+if exists("*GetSassIndent")
+ finish
+endif
+
+let s:property = '^\s*:\|^\s*[[:alnum:]-]\+\%(:\|\s*=\)'
+
+function! GetSassIndent()
+ let lnum = prevnonblank(v:lnum-1)
+ let line = substitute(getline(lnum),'\s\+$','','')
+ let cline = substitute(substitute(getline(v:lnum),'\s\+$','',''),'^\s\+','','')
+ let lastcol = strlen(line)
+ let line = substitute(line,'^\s\+','','')
+ let indent = indent(lnum)
+ let cindent = indent(v:lnum)
+ if line !~ s:property && cline =~ s:property
+ return indent + &sw
+ "elseif line =~ s:property && cline !~ s:property
+ "return indent - &sw
+ else
+ return -1
+ endif
+endfunction
+
+" vim:set sw=2:
diff --git a/vim73/indent/scheme.vim b/vim73/indent/scheme.vim
new file mode 100644
index 0000000..a16f4f9
--- /dev/null
+++ b/vim73/indent/scheme.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: Scheme
+" Maintainer: Sergey Khorev <sergey.khorev@gmail.com>
+" Last Change: 2005 Jun 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/lisp.vim
diff --git a/vim73/indent/scss.vim b/vim73/indent/scss.vim
new file mode 100644
index 0000000..82bba49
--- /dev/null
+++ b/vim73/indent/scss.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: SCSS
+" Maintainer: Tim Pope <vimNOSPAM@tpope.org>
+" Last Change: 2010 Jul 26
+
+if exists("b:did_indent")
+ finish
+endif
+
+runtime! indent/css.vim
+
+" vim:set sw=2:
diff --git a/vim73/indent/sdl.vim b/vim73/indent/sdl.vim
new file mode 100644
index 0000000..9dde2c3
--- /dev/null
+++ b/vim73/indent/sdl.vim
@@ -0,0 +1,89 @@
+" Vim indent file
+" Language: SDL
+" Maintainer: Michael Piefel <piefel@informatik.hu-berlin.de>
+" Last Change: 2001 Sep 17
+
+" Shamelessly stolen from the Vim-Script indent file
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetSDLIndent()
+setlocal indentkeys+==~end,=~state,*<Return>
+
+" Only define the function once.
+if exists("*GetSDLIndent")
+" finish
+endif
+
+set cpo-=C
+
+function! GetSDLIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let virtuality = '^\s*\(\(virtual\|redefined\|finalized\)\s\+\)\=\s*'
+
+ " Add a single space to comments which use asterisks
+ if getline(lnum) =~ '^\s*\*'
+ let ind = ind - 1
+ endif
+ if getline(v:lnum) =~ '^\s*\*'
+ let ind = ind + 1
+ endif
+
+ " Add a 'shiftwidth' after states, different blocks, decision (and alternatives), inputs
+ if (getline(lnum) =~? '^\s*\(start\|state\|system\|package\|connection\|channel\|alternative\|macro\|operator\|newtype\|select\|substructure\|decision\|generator\|refinement\|service\|method\|exceptionhandler\|asntype\|syntype\|value\|(.*):\|\(priority\s\+\)\=input\|provided\)'
+ \ || getline(lnum) =~? virtuality . '\(process\|procedure\|block\|object\)')
+ \ && getline(lnum) !~? 'end[[:alpha:]]\+;$'
+ let ind = ind + &sw
+ endif
+
+ " Subtract a 'shiftwidth' after states
+ if getline(lnum) =~? '^\s*\(stop\|return\>\|nextstate\)'
+ let ind = ind - &sw
+ endif
+
+ " Subtract a 'shiftwidth' on on end (uncompleted line)
+ if getline(v:lnum) =~? '^\s*end\>'
+ let ind = ind - &sw
+ endif
+
+ " Put each alternatives where the corresponding decision was
+ if getline(v:lnum) =~? '^\s*\((.*)\|else\):'
+ normal k
+ let ind = indent(searchpair('^\s*decision', '', '^\s*enddecision', 'bW',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "sdlString"'))
+ endif
+
+ " Put each state where the preceding state was
+ if getline(v:lnum) =~? '^\s*state\>'
+ let ind = indent(search('^\s*start', 'bW'))
+ endif
+
+ " Systems and packages are always in column 0
+ if getline(v:lnum) =~? '^\s*\(\(end\)\=system\|\(end\)\=package\)'
+ return 0;
+ endif
+
+ " Put each end* where the corresponding begin was
+ if getline(v:lnum) =~? '^\s*end[[:alpha:]]'
+ normal k
+ let partner=matchstr(getline(v:lnum), '\(' . virtuality . 'end\)\@<=[[:alpha:]]\+')
+ let ind = indent(searchpair(virtuality . partner, '', '^\s*end' . partner, 'bW',
+ \ 'synIDattr(synID(line("."), col("."), 0), "name") =~? "sdlString"'))
+ endif
+
+ return ind
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/sh.vim b/vim73/indent/sh.vim
new file mode 100644
index 0000000..49146c7
--- /dev/null
+++ b/vim73/indent/sh.vim
@@ -0,0 +1,158 @@
+" Vim indent file
+" Language: Shell Script
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2010-01-06
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetShIndent()
+setlocal indentkeys+=0=then,0=do,0=else,0=elif,0=fi,0=esac,0=done,),0=;;,0=;&
+setlocal indentkeys+=0=fin,0=fil,0=fip,0=fir,0=fix
+setlocal indentkeys-=:,0#
+setlocal nosmartindent
+
+if exists("*GetShIndent")
+ finish
+endif
+
+let s:cpo_save = &cpo
+set cpo&vim
+
+function s:buffer_shiftwidth()
+ return &shiftwidth
+endfunction
+
+let s:sh_indent_defaults = {
+ \ 'default': function('s:buffer_shiftwidth'),
+ \ 'continuation-line': function('s:buffer_shiftwidth'),
+ \ 'case-labels': function('s:buffer_shiftwidth'),
+ \ 'case-statements': function('s:buffer_shiftwidth'),
+ \ 'case-breaks': 0 }
+
+function! s:indent_value(option)
+ let Value = exists('b:sh_indent_options')
+ \ && has_key(b:sh_indent_options, a:option) ?
+ \ b:sh_indent_options[a:option] :
+ \ s:sh_indent_defaults[a:option]
+ if type(Value) == type(function('type'))
+ return Value()
+ endif
+ return Value
+endfunction
+
+function! GetShIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+ if lnum == 0
+ return 0
+ endif
+
+ let pnum = prevnonblank(lnum - 1)
+
+ let ind = indent(lnum)
+ let line = getline(lnum)
+ if line =~ '^\s*\%(if\|then\|do\|else\|elif\|case\|while\|until\|for\|select\)\>'
+ if line !~ '\<\%(fi\|esac\|done\)\>\s*\%(#.*\)\=$'
+ let ind += s:indent_value('default')
+ endif
+ elseif s:is_case_label(line, pnum)
+ if !s:is_case_ended(line)
+ let ind += s:indent_value('case-statements')
+ endif
+ elseif line =~ '^\s*\<\k\+\>\s*()\s*{' || line =~ '^\s*{'
+ if line !~ '}\s*\%(#.*\)\=$'
+ let ind += s:indent_value('default')
+ endif
+ elseif s:is_continuation_line(line)
+ if pnum == 0 || !s:is_continuation_line(getline(pnum))
+ let ind += s:indent_value('continuation-line')
+ endif
+ elseif pnum != 0 && s:is_continuation_line(getline(pnum))
+ let ind = indent(s:find_continued_lnum(pnum))
+ endif
+
+ let pine = line
+ let line = getline(v:lnum)
+ if line =~ '^\s*\%(then\|do\|else\|elif\|fi\|done\)\>' || line =~ '^\s*}'
+ let ind -= s:indent_value('default')
+ elseif line =~ '^\s*esac\>'
+ let ind -= (s:is_case_label(pine, lnum) && s:is_case_ended(pine) ?
+ \ 0 : s:indent_value('case-statements')) +
+ \ s:indent_value('case-labels')
+ if s:is_case_break(pine)
+ let ind += s:indent_value('case-breaks')
+ endif
+ elseif s:is_case_label(line, lnum)
+ if s:is_case(pine)
+ let ind = indent(lnum) + s:indent_value('case-labels')
+ else
+ let ind -= s:indent_value('case-statements') - s:indent_value('case-breaks')
+ endif
+ elseif s:is_case_break(line)
+ let ind -= s:indent_value('case-breaks')
+ endif
+
+ return ind
+endfunction
+
+function! s:is_continuation_line(line)
+ return a:line =~ '\%(\%(^\|[^\\]\)\\\|&&\|||\)$'
+endfunction
+
+function! s:find_continued_lnum(lnum)
+ let i = a:lnum
+ while i > 1 && s:is_continuation_line(getline(i - 1))
+ let i -= 1
+ endwhile
+ return i
+endfunction
+
+function! s:is_case_label(line, pnum)
+ if a:line !~ '^\s*(\=.*)'
+ return 0
+ endif
+
+ if a:pnum > 0
+ let pine = getline(a:pnum)
+ if !(s:is_case(pine) || s:is_case_ended(pine))
+ return 0
+ endif
+ endif
+
+ let suffix = substitute(a:line, '^\s*(\=', "", "")
+ let nesting = 0
+ let i = 0
+ let n = strlen(suffix)
+ while i < n
+ let c = suffix[i]
+ let i += 1
+ if c == '\\'
+ let i += 1
+ elseif c == '('
+ let nesting += 1
+ elseif c == ')'
+ if nesting == 0
+ return 1
+ endif
+ let nesting -= 1
+ endif
+ endwhile
+ return 0
+endfunction
+
+function! s:is_case(line)
+ return a:line =~ '^\s*case\>'
+endfunction
+
+function! s:is_case_break(line)
+ return a:line =~ '^\s*;[;&]'
+endfunction
+
+function! s:is_case_ended(line)
+ return s:is_case_break(a:line) || a:line =~ ';[;&]\s*\%(#.*\)\=$'
+endfunction
+
+let &cpo = s:cpo_save
+unlet s:cpo_save
diff --git a/vim73/indent/sml.vim b/vim73/indent/sml.vim
new file mode 100644
index 0000000..fbbb15e
--- /dev/null
+++ b/vim73/indent/sml.vim
@@ -0,0 +1,217 @@
+" Vim indent file
+" Language: SML
+" Maintainer: Saikat Guha <sg266@cornell.edu>
+" Hubert Chao <hc85@cornell.edu>
+" Original OCaml Version:
+" Jean-Francois Yuen <jfyuen@ifrance.com>
+" Mike Leary <leary@nwlink.com>
+" Markus Mottl <markus@oefai.at>
+" OCaml URL: http://www.oefai.at/~markus/vim/indent/ocaml.vim
+" Last Change: 2003 Jan 04 - Adapted to SML
+" 2002 Nov 06 - Some fixes (JY)
+" 2002 Oct 28 - Fixed bug with indentation of ']' (MM)
+" 2002 Oct 22 - Major rewrite (JY)
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal expandtab
+setlocal indentexpr=GetSMLIndent()
+setlocal indentkeys+=0=and,0=else,0=end,0=handle,0=if,0=in,0=let,0=then,0=val,0=fun,0=\|,0=*),0)
+setlocal nolisp
+setlocal nosmartindent
+setlocal textwidth=80
+setlocal shiftwidth=2
+
+" Comment formatting
+if (has("comments"))
+ set comments=sr:(*,mb:*,ex:*)
+ set fo=cqort
+endif
+
+" Only define the function once.
+"if exists("*GetSMLIndent")
+"finish
+"endif
+
+" Define some patterns:
+let s:beflet = '^\s*\(initializer\|method\|try\)\|\(\<\(begin\|do\|else\|in\|then\|try\)\|->\|;\)\s*$'
+let s:letpat = '^\s*\(let\|type\|module\|class\|open\|exception\|val\|include\|external\)\>'
+let s:letlim = '\(\<\(sig\|struct\)\|;;\)\s*$'
+let s:lim = '^\s*\(exception\|external\|include\|let\|module\|open\|type\|val\)\>'
+let s:module = '\<\%(let\|sig\|struct\)\>'
+let s:obj = '^\s*\(constraint\|inherit\|initializer\|method\|val\)\>\|\<\(object\|object\s*(.*)\)\s*$'
+let s:type = '^\s*\%(let\|type\)\>.*='
+let s:val = '^\s*\(val\|external\)\>.*:'
+
+" Skipping pattern, for comments
+function! s:SkipPattern(lnum, pat)
+ let def = prevnonblank(a:lnum - 1)
+ while def > 0 && getline(def) =~ a:pat
+ let def = prevnonblank(def - 1)
+ endwhile
+ return def
+endfunction
+
+" Indent for ';;' to match multiple 'let'
+function! s:GetInd(lnum, pat, lim)
+ let llet = search(a:pat, 'bW')
+ let old = indent(a:lnum)
+ while llet > 0
+ let old = indent(llet)
+ let nb = s:SkipPattern(llet, '^\s*(\*.*\*)\s*$')
+ if getline(nb) =~ a:lim
+ return old
+ endif
+ let llet = search(a:pat, 'bW')
+ endwhile
+ return old
+endfunction
+
+" Indent pairs
+function! s:FindPair(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+ let lno = searchpair(a:pstart, a:pmid, a:pend, 'bW', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')
+ if lno == -1
+ return indent(lno)
+ else
+ return col(".") - 1
+ endif
+endfunction
+
+function! s:FindLet(pstart, pmid, pend)
+ call search(a:pend, 'bW')
+" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+ let lno = searchpair(a:pstart, a:pmid, a:pend, 'bW', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"')
+ let moduleLine = getline(lno)
+ if lno == -1 || moduleLine =~ '^\s*\(fun\|structure\|signature\)\>'
+ return indent(lno)
+ else
+ return col(".") - 1
+ endif
+endfunction
+
+" Indent 'let'
+"function! s:FindLet(pstart, pmid, pend)
+" call search(a:pend, 'bW')
+" return indent(searchpair(a:pstart, a:pmid, a:pend, 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment" || getline(".") =~ "^\\s*let\\>.*=.*\\<in\\s*$" || getline(prevnonblank(".") - 1) =~ "^\\s*let\\>.*=\\s*$\\|" . s:beflet'))
+"endfunction
+
+function! GetSMLIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let lline = getline(lnum)
+
+ " Return double 'shiftwidth' after lines matching:
+ if lline =~ '^\s*|.*=>\s*$'
+ return ind + &sw + &sw
+ elseif lline =~ '^\s*val\>.*=\s*$'
+ return ind + &sw
+ endif
+
+ let line = getline(v:lnum)
+
+ " Indent lines starting with 'end' to matching module
+ if line =~ '^\s*end\>'
+ return s:FindLet(s:module, '', '\<end\>')
+
+ " Match 'else' with 'if'
+ elseif line =~ '^\s*else\>'
+ if lline !~ '^\s*\(if\|else\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ else
+ return ind
+ endif
+
+ " Match 'then' with 'if'
+ elseif line =~ '^\s*then\>'
+ if lline !~ '^\s*\(if\|else\|then\)\>'
+ return s:FindPair('\<if\>', '', '\<then\>')
+ else
+ return ind
+ endif
+
+ " Indent if current line begins with ']'
+ elseif line =~ '^\s*\]'
+ return s:FindPair('\[','','\]')
+
+ " Indent current line starting with 'in' to last matching 'let'
+ elseif line =~ '^\s*in\>'
+ let ind = s:FindLet('\<let\>','','\<in\>')
+
+ " Indent from last matching module if line matches:
+ elseif line =~ '^\s*\(fun\|val\|open\|structure\|and\|datatype\|type\|exception\)\>'
+ cursor(lnum,1)
+ let lastModule = indent(searchpair(s:module, '', '\<end\>', 'bWn', 'synIDattr(synID(line("."), col("."), 0), "name") =~? "string\\|comment"'))
+ if lastModule == -1
+ return 0
+ else
+ return lastModule + &sw
+ endif
+
+ " Indent lines starting with '|' from matching 'case', 'handle'
+ elseif line =~ '^\s*|'
+ " cursor(lnum,1)
+ let lastSwitch = search('\<\(case\|handle\|fun\|datatype\)\>','bW')
+ let switchLine = getline(lastSwitch)
+ let switchLineIndent = indent(lastSwitch)
+ if lline =~ '^\s*|'
+ return ind
+ endif
+ if switchLine =~ '\<case\>'
+ return col(".") + 2
+ elseif switchLine =~ '\<handle\>'
+ return switchLineIndent + &sw
+ elseif switchLine =~ '\<datatype\>'
+ call search('=')
+ return col(".") - 1
+ else
+ return switchLineIndent + 2
+ endif
+
+
+ " Indent if last line ends with 'sig', 'struct', 'let', 'then', 'else',
+ " 'in'
+ elseif lline =~ '\<\(sig\|struct\|let\|in\|then\|else\)\s*$'
+ let ind = ind + &sw
+
+ " Indent if last line ends with 'of', align from 'case'
+ elseif lline =~ '\<\(of\)\s*$'
+ call search('\<case\>',"bW")
+ let ind = col(".")+4
+
+ " Indent if current line starts with 'of'
+ elseif line =~ '^\s*of\>'
+ call search('\<case\>',"bW")
+ let ind = col(".")+1
+
+
+ " Indent if last line starts with 'fun', 'case', 'fn'
+ elseif lline =~ '^\s*\(fun\|fn\|case\)\>'
+ let ind = ind + &sw
+
+ endif
+
+ " Don't indent 'let' if last line started with 'fun', 'fn'
+ if line =~ '^\s*let\>'
+ if lline =~ '^\s*\(fun\|fn\)'
+ let ind = ind - &sw
+ endif
+ endif
+
+ return ind
+
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/sql.vim b/vim73/indent/sql.vim
new file mode 100644
index 0000000..4f82b96
--- /dev/null
+++ b/vim73/indent/sql.vim
@@ -0,0 +1,39 @@
+" Vim indent file loader
+" Language: SQL
+" Maintainer: David Fishburn <fishburn at ianywhere dot com>
+" Last Change: Thu Sep 15 2005 10:27:51 AM
+" Version: 1.0
+" Download: http://vim.sourceforge.net/script.php?script_id=495
+
+" Description: Checks for a:
+" buffer local variable,
+" global variable,
+" If the above exist, it will source the type specified.
+" If none exist, it will source the default sqlanywhere.vim file.
+
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Default to the standard Vim distribution file
+let filename = 'sqlanywhere'
+
+" Check for overrides. Buffer variables have the highest priority.
+if exists("b:sql_type_override")
+ " Check the runtimepath to see if the file exists
+ if globpath(&runtimepath, 'indent/'.b:sql_type_override.'.vim') != ''
+ let filename = b:sql_type_override
+ endif
+elseif exists("g:sql_type_default")
+ if globpath(&runtimepath, 'indent/'.g:sql_type_default.'.vim') != ''
+ let filename = g:sql_type_default
+ endif
+endif
+
+" Source the appropriate file
+exec 'runtime indent/'.filename.'.vim'
+
+
+" vim:sw=4:
diff --git a/vim73/indent/sqlanywhere.vim b/vim73/indent/sqlanywhere.vim
new file mode 100644
index 0000000..fdafb62
--- /dev/null
+++ b/vim73/indent/sqlanywhere.vim
@@ -0,0 +1,385 @@
+" Vim indent file
+" Language: SQL
+" Maintainer: David Fishburn <fishburn at ianywhere dot com>
+" Last Change: Mon Apr 02 2007 9:13:47 AM
+" Version: 1.5
+" Download: http://vim.sourceforge.net/script.php?script_id=495
+
+" Notes:
+" Indenting keywords are based on Oracle and Sybase Adaptive Server
+" Anywhere (ASA). Test indenting was done with ASA stored procedures and
+" fuctions and Oracle packages which contain stored procedures and
+" functions.
+" This has not been tested against Microsoft SQL Server or
+" Sybase Adaptive Server Enterprise (ASE) which use the Transact-SQL
+" syntax. That syntax does not have end tags for IF's, which makes
+" indenting more difficult.
+"
+" Known Issues:
+" The Oracle MERGE statement does not have an end tag associated with
+" it, this can leave the indent hanging to the right one too many.
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+let b:current_indent = "sqlanywhere"
+
+setlocal indentkeys-=0{
+setlocal indentkeys-=0}
+setlocal indentkeys-=:
+setlocal indentkeys-=0#
+setlocal indentkeys-=e
+
+" This indicates formatting should take place when one of these
+" expressions is used. These expressions would normally be something
+" you would type at the BEGINNING of a line
+" SQL is generally case insensitive, so this files assumes that
+" These keywords are something that would trigger an indent LEFT, not
+" an indent right, since the SQLBlockStart is used for those keywords
+setlocal indentkeys+==~end,=~else,=~elseif,=~elsif,0=~when,0=)
+
+" GetSQLIndent is executed whenever one of the expressions
+" in the indentkeys is typed
+setlocal indentexpr=GetSQLIndent()
+
+" Only define the functions once.
+if exists("*GetSQLIndent")
+ finish
+endif
+
+" List of all the statements that start a new block.
+" These are typically words that start a line.
+" IS is excluded, since it is difficult to determine when the
+" ending block is (especially for procedures/functions).
+let s:SQLBlockStart = '^\s*\%('.
+ \ 'if\|else\|elseif\|elsif\|'.
+ \ 'while\|loop\|do\|'.
+ \ 'begin\|'.
+ \ 'case\|when\|merge\|exception'.
+ \ '\)\>'
+let s:SQLBlockEnd = '^\s*\(end\)\>'
+
+" The indent level is also based on unmatched paranethesis
+" If a line has an extra "(" increase the indent
+" If a line has an extra ")" decrease the indent
+function s:CountUnbalancedParan( line, paran_to_check )
+ let l = a:line
+ let lp = substitute(l, '[^(]', '', 'g')
+ let l = a:line
+ let rp = substitute(l, '[^)]', '', 'g')
+
+ if a:paran_to_check =~ ')'
+ " echom 'CountUnbalancedParan ) returning: ' .
+ " \ (strlen(rp) - strlen(lp))
+ return (strlen(rp) - strlen(lp))
+ elseif a:paran_to_check =~ '('
+ " echom 'CountUnbalancedParan ( returning: ' .
+ " \ (strlen(lp) - strlen(rp))
+ return (strlen(lp) - strlen(rp))
+ else
+ " echom 'CountUnbalancedParan unknown paran to check: ' .
+ " \ a:paran_to_check
+ return 0
+ endif
+endfunction
+
+" Unindent commands based on previous indent level
+function s:CheckToIgnoreRightParan( prev_lnum, num_levels )
+ let lnum = a:prev_lnum
+ let line = getline(lnum)
+ let ends = 0
+ let num_right_paran = a:num_levels
+ let ignore_paran = 0
+ let vircol = 1
+
+ while num_right_paran > 0
+ silent! exec 'norm! '.lnum."G\<bar>".vircol."\<bar>"
+ let right_paran = search( ')', 'W' )
+ if right_paran != lnum
+ " This should not happen since there should be at least
+ " num_right_paran matches for this line
+ break
+ endif
+ let vircol = virtcol(".")
+
+ " if getline(".") =~ '^)'
+ let matching_paran = searchpair('(', '', ')', 'bW',
+ \ 's:IsColComment(line("."), col("."))')
+
+ if matching_paran < 1
+ " No match found
+ " echom 'CTIRP - no match found, ignoring'
+ break
+ endif
+
+ if matching_paran == lnum
+ " This was not an unmatched parantenses, start the search again
+ " again after this column
+ " echom 'CTIRP - same line match, ignoring'
+ continue
+ endif
+
+ " echom 'CTIRP - match: ' . line(".") . ' ' . getline(".")
+
+ if getline(matching_paran) =~? '\(if\|while\)\>'
+ " echom 'CTIRP - if/while ignored: ' . line(".") . ' ' . getline(".")
+ let ignore_paran = ignore_paran + 1
+ endif
+
+ " One match found, decrease and check for further matches
+ let num_right_paran = num_right_paran - 1
+
+ endwhile
+
+ " Fallback - just move back one
+ " return a:prev_indent - &sw
+ return ignore_paran
+endfunction
+
+" Based on the keyword provided, loop through previous non empty
+" non comment lines to find the statement that initated the keyword.
+" Return its indent level
+" CASE ..
+" WHEN ...
+" Should return indent level of CASE
+" EXCEPTION ..
+" WHEN ...
+" something;
+" WHEN ...
+" Should return indent level of exception.
+function s:GetStmtStarterIndent( keyword, curr_lnum )
+ let lnum = a:curr_lnum
+
+ " Default - reduce indent by 1
+ let ind = indent(a:curr_lnum) - &sw
+
+ if a:keyword =~? 'end'
+ exec 'normal! ^'
+ let stmts = '^\s*\%('.
+ \ '\<begin\>\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<loop\>\)\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<case\>\)\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<for\>\)\|' .
+ \ '\%(\%(\<end\s\+\)\@<!\<if\>\)'.
+ \ '\)'
+ let matching_lnum = searchpair(stmts, '', '\<end\>\zs', 'bW',
+ \ 's:IsColComment(line("."), col(".")) == 1')
+ exec 'normal! $'
+ if matching_lnum > 0 && matching_lnum < a:curr_lnum
+ let ind = indent(matching_lnum)
+ endif
+ elseif a:keyword =~? 'when'
+ exec 'normal! ^'
+ let matching_lnum = searchpair(
+ \ '\%(\<end\s\+\)\@<!\<case\>\|\<exception\>\|\<merge\>',
+ \ '',
+ \ '\%(\%(\<when\s\+others\>\)\|\%(\<end\s\+case\>\)\)',
+ \ 'bW',
+ \ 's:IsColComment(line("."), col(".")) == 1')
+ exec 'normal! $'
+ if matching_lnum > 0 && matching_lnum < a:curr_lnum
+ let ind = indent(matching_lnum)
+ else
+ let ind = indent(a:curr_lnum)
+ endif
+ endif
+
+ return ind
+endfunction
+
+
+" Check if the line is a comment
+function s:IsLineComment(lnum)
+ let rc = synIDattr(
+ \ synID(a:lnum,
+ \ match(getline(a:lnum), '\S')+1, 0)
+ \ , "name")
+ \ =~? "comment"
+
+ return rc
+endfunction
+
+
+" Check if the column is a comment
+function s:IsColComment(lnum, cnum)
+ let rc = synIDattr(synID(a:lnum, a:cnum, 0), "name")
+ \ =~? "comment"
+
+ return rc
+endfunction
+
+
+" Instead of returning a column position, return
+" an appropriate value as a factor of shiftwidth.
+function s:ModuloIndent(ind)
+ let ind = a:ind
+
+ if ind > 0
+ let modulo = ind % &shiftwidth
+
+ if modulo > 0
+ let ind = ind - modulo
+ endif
+ endif
+
+ return ind
+endfunction
+
+
+" Find correct indent of a new line based upon the previous line
+function GetSQLIndent()
+ let lnum = v:lnum
+ let ind = indent(lnum)
+
+ " If the current line is a comment, leave the indent as is
+ " Comment out this additional check since it affects the
+ " indenting of =, and will not reindent comments as it should
+ " if s:IsLineComment(lnum) == 1
+ " return ind
+ " endif
+
+ " while 1
+ " Get previous non-blank line
+ let prevlnum = prevnonblank(lnum - 1)
+ if prevlnum <= 0
+ return ind
+ endif
+
+ if s:IsLineComment(prevlnum) == 1
+ if getline(v:lnum) =~ '^\s*\*'
+ let ind = s:ModuloIndent(indent(prevlnum))
+ return ind + 1
+ endif
+ " If the previous line is a comment, then return -1
+ " to tell Vim to use the formatoptions setting to determine
+ " the indent to use
+ " But only if the next line is blank. This would be true if
+ " the user is typing, but it would not be true if the user
+ " is reindenting the file
+ if getline(v:lnum) =~ '^\s*$'
+ return -1
+ endif
+ endif
+
+ " let prevline = getline(prevlnum)
+ " if prevline !~ '^\s*$'
+ " " echom 'previous non blank - break: ' . prevline
+ " break
+ " endif
+ " endwhile
+
+ " echom 'PREVIOUS INDENT: ' . indent(prevlnum) . ' LINE: ' . getline(prevlnum)
+
+ " This is the line you just hit return on, it is not the current line
+ " which is new and empty
+ " Based on this line, we can determine how much to indent the new
+ " line
+
+ " Get default indent (from prev. line)
+ let ind = indent(prevlnum)
+ let prevline = getline(prevlnum)
+
+ " Now check what's on the previous line to determine if the indent
+ " should be changed, for example IF, BEGIN, should increase the indent
+ " where END IF, END, should decrease the indent.
+ if prevline =~? s:SQLBlockStart
+ " Move indent in
+ let ind = ind + &sw
+ " echom 'prevl - SQLBlockStart - indent ' . ind . ' line: ' . prevline
+ elseif prevline =~ '[()]'
+ if prevline =~ '('
+ let num_unmatched_left = s:CountUnbalancedParan( prevline, '(' )
+ else
+ let num_unmatched_left = 0
+ endif
+ if prevline =~ ')'
+ let num_unmatched_right = s:CountUnbalancedParan( prevline, ')' )
+ else
+ let num_unmatched_right = 0
+ " let num_unmatched_right = s:CountUnbalancedParan( prevline, ')' )
+ endif
+ if num_unmatched_left > 0
+ " There is a open left paranethesis
+ " increase indent
+ let ind = ind + ( &sw * num_unmatched_left )
+ elseif num_unmatched_right > 0
+ " if it is an unbalanced paranethesis only unindent if
+ " it was part of a command (ie create table(..) )
+ " instead of part of an if (ie if (....) then) which should
+ " maintain the indent level
+ let ignore = s:CheckToIgnoreRightParan( prevlnum, num_unmatched_right )
+ " echom 'prevl - ) unbalanced - CTIRP - ignore: ' . ignore
+
+ if prevline =~ '^\s*)'
+ let ignore = ignore + 1
+ " echom 'prevl - begins ) unbalanced ignore: ' . ignore
+ endif
+
+ if (num_unmatched_right - ignore) > 0
+ let ind = ind - ( &sw * (num_unmatched_right - ignore) )
+ endif
+
+ endif
+ endif
+
+
+ " echom 'CURRENT INDENT: ' . ind . ' LINE: ' . getline(v:lnum)
+
+ " This is a new blank line since we just typed a carriage return
+ " Check current line; search for simplistic matching start-of-block
+ let line = getline(v:lnum)
+
+ if line =~? '^\s*els'
+ " Any line when you type else will automatically back up one
+ " ident level (ie else, elseif, elsif)
+ let ind = ind - &sw
+ " echom 'curr - else - indent ' . ind
+ elseif line =~? '^\s*end\>'
+ let ind = s:GetStmtStarterIndent('end', v:lnum)
+ " General case for end
+ " let ind = ind - &sw
+ " echom 'curr - end - indent ' . ind
+ elseif line =~? '^\s*when\>'
+ let ind = s:GetStmtStarterIndent('when', v:lnum)
+ " If the WHEN clause is used with a MERGE or EXCEPTION
+ " clause, do not change the indent level, since these
+ " statements do not have a corresponding END statement.
+ " if stmt_starter =~? 'case'
+ " let ind = ind - &sw
+ " endif
+ " elseif line =~ '^\s*)\s*;\?\s*$'
+ " elseif line =~ '^\s*)'
+ elseif line =~ '^\s*)'
+ let num_unmatched_right = s:CountUnbalancedParan( line, ')' )
+ let ignore = s:CheckToIgnoreRightParan( v:lnum, num_unmatched_right )
+ " If the line ends in a ), then reduce the indent
+ " This catches items like:
+ " CREATE TABLE T1(
+ " c1 int,
+ " c2 int
+ " );
+ " But we do not want to unindent a line like:
+ " IF ( c1 = 1
+ " AND c2 = 3 ) THEN
+ " let num_unmatched_right = s:CountUnbalancedParan( line, ')' )
+ " if num_unmatched_right > 0
+ " elseif strpart( line, strlen(line)-1, 1 ) =~ ')'
+ " let ind = ind - &sw
+ if line =~ '^\s*)'
+ " let ignore = ignore + 1
+ " echom 'curr - begins ) unbalanced ignore: ' . ignore
+ endif
+
+ if (num_unmatched_right - ignore) > 0
+ let ind = ind - ( &sw * (num_unmatched_right - ignore) )
+ endif
+ " endif
+ endif
+
+ " echom 'final - indent ' . ind
+ return s:ModuloIndent(ind)
+endfunction
+
+" vim:sw=4:
diff --git a/vim73/indent/tcl.vim b/vim73/indent/tcl.vim
new file mode 100644
index 0000000..a92f57d
--- /dev/null
+++ b/vim73/indent/tcl.vim
@@ -0,0 +1,75 @@
+" Vim indent file
+" Language: Tcl
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetTclIndent()
+setlocal indentkeys=0{,0},!^F,o,O,0]
+setlocal nosmartindent
+
+if exists("*GetTclIndent")
+ finish
+endif
+
+function s:prevnonblanknoncomment(lnum)
+ let lnum = prevnonblank(a:lnum)
+ while lnum > 0
+ let line = getline(lnum)
+ if line !~ '^\s*\(#\|$\)'
+ break
+ endif
+ let lnum = prevnonblank(lnum - 1)
+ endwhile
+ return lnum
+endfunction
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'tcl\%(Comment\|String\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetTclIndent()
+ let line = getline(v:lnum)
+ if line =~ '^\s*\*'
+ return cindent(v:lnum)
+ elseif line =~ '^\s*}'
+ return indent(v:lnum) - &sw
+ endif
+
+ let pnum = s:prevnonblanknoncomment(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ let ind = indent(pnum) + s:count_braces(pnum, 1) * &sw
+
+ let pline = getline(pnum)
+ if pline =~ '}\s*$'
+ let ind -= (s:count_braces(pnum, 0) - (pline =~ '^\s*}' ? 1 : 0)) * &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/tcsh.vim b/vim73/indent/tcsh.vim
new file mode 100644
index 0000000..cd18f06
--- /dev/null
+++ b/vim73/indent/tcsh.vim
@@ -0,0 +1,51 @@
+" Vim indent file
+" Language: C-shell (tcsh)
+" Maintainer: Gautam Iyer <gautam@math.uchicago.edu>
+" Last Modified: Sat 16 Jun 2007 04:27:45 PM PDT
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=TcshGetIndent()
+setlocal indentkeys+=e,0=end,0=endsw indentkeys-=0{,0},0),:,0#
+
+" Only define the function once.
+if exists("*TcshGetIndent")
+ finish
+endif
+
+set cpoptions-=C
+
+function TcshGetIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Add indent if previous line begins with while or foreach
+ " OR line ends with case <str>:, default:, else, then or \
+ let ind = indent(lnum)
+ let line = getline(lnum)
+ if line =~ '\v^\s*%(while|foreach)>|^\s*%(case\s.*:|default:|else)\s*$|%(<then|\\)$'
+ let ind = ind + &sw
+ endif
+
+ if line =~ '\v^\s*breaksw>'
+ let ind = ind - &sw
+ endif
+
+ " Subtract indent if current line has on end, endif, case commands
+ let line = getline(v:lnum)
+ if line =~ '\v^\s*%(else|end|endif)\s*$'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/tf.vim b/vim73/indent/tf.vim
new file mode 100644
index 0000000..1759773
--- /dev/null
+++ b/vim73/indent/tf.vim
@@ -0,0 +1,72 @@
+" Vim indent file
+" Language: tf (TinyFugue)
+" Maintainer: Christian J. Robinson <heptite@gmail.com>
+" URL: http://christianrobinson.name/vim/indent/tf.vim
+" Last Change: 2002 May 29
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetTFIndent()
+setlocal indentkeys-=0{,0} indentkeys-=0# indentkeys-=:
+setlocal indentkeys+==/endif,=/then,=/else,=/done,0;
+
+" Only define the function once:
+if exists("*GetTFIndent")
+ finish
+endif
+
+function GetTFIndent()
+ " Find a non-blank line above the current line:
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " No indent for the start of the file:
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+ let line = getline(lnum)
+
+ " No indentation if the previous line didn't end with "\":
+ " (Could be annoying, but it lets you know if you made a mistake.)
+ if line !~ '\\$'
+ return 0
+ endif
+
+ if line =~ '\(/def.*\\\|/for.*\(%;\s*\)\@\<!\\\)$'
+ let ind = ind + &sw
+ elseif line =~ '\(/if\|/else\|/then\)'
+ if line !~ '/endif'
+ let ind = ind + &sw
+ endif
+ elseif line =~ '/while'
+ if line !~ '/done'
+ let ind = ind + &sw
+ endif
+ endif
+
+ let line = getline(v:lnum)
+
+ if line =~ '\(/else\|/endif\|/then\)'
+ if line !~ '/if'
+ let ind = ind - &sw
+ endif
+ elseif line =~ '/done'
+ if line !~ '/while'
+ let ind = ind - &sw
+ endif
+ endif
+
+ " Comments at the beginning of a line:
+ if line =~ '^\s*;'
+ let ind = 0
+ endif
+
+
+ return ind
+
+endfunction
diff --git a/vim73/indent/tilde.vim b/vim73/indent/tilde.vim
new file mode 100644
index 0000000..5fdcfe0
--- /dev/null
+++ b/vim73/indent/tilde.vim
@@ -0,0 +1,36 @@
+"Description: Indent scheme for the tilde weblanguage
+"Author: Tobias Rundström <tobi@tobi.nu>
+"URL: http://tilde.tildesoftware.net
+"Last Change: May 8 09:15:09 CEST 2002
+
+if exists ("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=GetTildeIndent(v:lnum)
+setlocal indentkeys=o,O,)
+
+if exists("*GetTildeIndent")
+ finish
+endif
+
+function GetTildeIndent(lnum)
+ let plnum = prevnonblank(v:lnum-1)
+
+ if plnum == 0
+ return 0
+ endif
+
+ if getline(v:lnum) =~ '^\s*\~\(endif\|else\|elseif\|end\)\>'
+ return indent(v:lnum) - &sw
+ endif
+
+ if getline(plnum) =~ '^\s*\~\(if\|foreach\|foreach_row\|xml_loop\|file_loop\|file_write\|file_append\|imap_loopsections\|imap_index\|imap_list\|ldap_search\|post_loopall\|post_loop\|file_loop\|sql_loop_num\|sql_dbmsselect\|search\|sql_loop\|post\|for\|function_define\|silent\|while\|setvalbig\|mail_create\|systempipe\|mail_send\|dual\|elseif\|else\)\>'
+ return indent(plnum) + &sw
+ else
+ return -1
+ endif
+endfunction
diff --git a/vim73/indent/vb.vim b/vim73/indent/vb.vim
new file mode 100644
index 0000000..55a8ea3
--- /dev/null
+++ b/vim73/indent/vb.vim
@@ -0,0 +1,78 @@
+" Vim indent file
+" Language: VisualBasic (ft=vb) / Basic (ft=basic) / SaxBasic (ft=vb)
+" Author: Johannes Zellner <johannes@zellner.org>
+" Last Change: Fri, 18 Jun 2004 07:22:42 CEST
+" Small update 2010 Jul 28 by Maxim Kim
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal autoindent
+setlocal indentexpr=VbGetIndent(v:lnum)
+setlocal indentkeys&
+setlocal indentkeys+==~else,=~elseif,=~end,=~wend,=~case,=~next,=~select,=~loop,<:>
+
+let b:undo_indent = "set ai< indentexpr< indentkeys<"
+
+" Only define the function once.
+if exists("*VbGetIndent")
+ finish
+endif
+
+fun! VbGetIndent(lnum)
+ " labels and preprocessor get zero indent immediately
+ let this_line = getline(a:lnum)
+ let LABELS_OR_PREPROC = '^\s*\(\<\k\+\>:\s*$\|#.*\)'
+ if this_line =~? LABELS_OR_PREPROC
+ return 0
+ endif
+
+ " Find a non-blank line above the current line.
+ " Skip over labels and preprocessor directives.
+ let lnum = a:lnum
+ while lnum > 0
+ let lnum = prevnonblank(lnum - 1)
+ let previous_line = getline(lnum)
+ if previous_line !~? LABELS_OR_PREPROC
+ break
+ endif
+ endwhile
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ " Add
+ if previous_line =~? '^\s*\<\(begin\|\%(\%(private\|public\|friend\)\s\+\)\=\%(function\|sub\|property\)\|select\|case\|default\|if\|else\|elseif\|do\|for\|while\|enum\|with\)\>'
+ let ind = ind + &sw
+ endif
+
+ " Subtract
+ if this_line =~? '^\s*\<end\>\s\+\<select\>'
+ if previous_line !~? '^\s*\<select\>'
+ let ind = ind - 2 * &sw
+ else
+ " this case is for an empty 'select' -- 'end select'
+ " (w/o any case statements) like:
+ "
+ " select case readwrite
+ " end select
+ let ind = ind - &sw
+ endif
+ elseif this_line =~? '^\s*\<\(end\|else\|elseif\|until\|loop\|next\|wend\)\>'
+ let ind = ind - &sw
+ elseif this_line =~? '^\s*\<\(case\|default\)\>'
+ if previous_line !~? '^\s*\<select\>'
+ let ind = ind - &sw
+ endif
+ endif
+
+ return ind
+endfun
+
+" vim:sw=4
diff --git a/vim73/indent/verilog.vim b/vim73/indent/verilog.vim
new file mode 100644
index 0000000..74c8c5f
--- /dev/null
+++ b/vim73/indent/verilog.vim
@@ -0,0 +1,219 @@
+" Language: Verilog HDL
+" Maintainer: Chih-Tsun Huang <cthuang@larc.ee.nthu.edu.tw>
+" Last Change: Wed Oct 31 16:13:11 CST 2001
+" URL: http://larc.ee.nthu.edu.tw/~cthuang/vim/indent/verilog.vim
+"
+" Credits:
+" Suggestions for improvement, bug reports by
+" Leo Butlero <lbutler@brocade.com>
+"
+" Buffer Variables:
+" b:verilog_indent_modules : indenting after the declaration
+" of module blocks
+" b:verilog_indent_width : indenting width
+" b:verilog_indent_verbose : verbose to each indenting
+"
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetVerilogIndent()
+setlocal indentkeys=!^F,o,O,0),=begin,=end,=join,=endcase
+setlocal indentkeys+==endmodule,=endfunction,=endtask,=endspecify
+setlocal indentkeys+==`else,=`endif
+
+" Only define the function once.
+if exists("*GetVerilogIndent")
+ finish
+endif
+
+set cpo-=C
+
+function GetVerilogIndent()
+
+ if exists('b:verilog_indent_width')
+ let offset = b:verilog_indent_width
+ else
+ let offset = &sw
+ endif
+ if exists('b:verilog_indent_modules')
+ let indent_modules = offset
+ else
+ let indent_modules = 0
+ endif
+
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ let lnum2 = prevnonblank(lnum - 1)
+ let curr_line = getline(v:lnum)
+ let last_line = getline(lnum)
+ let last_line2 = getline(lnum2)
+ let ind = indent(lnum)
+ let ind2 = indent(lnum - 1)
+ let offset_comment1 = 1
+ " Define the condition of an open statement
+ " Exclude the match of //, /* or */
+ let vlog_openstat = '\(\<or\>\|\([*/]\)\@<![*(,{><+-/%^&|!=?:]\([*/]\)\@!\)'
+ " Define the condition when the statement ends with a one-line comment
+ let vlog_comment = '\(//.*\|/\*.*\*/\s*\)'
+ if exists('b:verilog_indent_verbose')
+ let vverb_str = 'INDENT VERBOSE:'
+ let vverb = 1
+ else
+ let vverb = 0
+ endif
+
+ " Indent accoding to last line
+ " End of multiple-line comment
+ if last_line =~ '\*/\s*$' && last_line !~ '/\*.\{-}\*/'
+ let ind = ind - offset_comment1
+ if vverb
+ echo vverb_str "De-indent after a multiple-line comment."
+ endif
+
+ " Indent after if/else/for/case/always/initial/specify/fork blocks
+ elseif last_line =~ '`\@<!\<\(if\|else\)\>' ||
+ \ last_line =~ '^\s*\<\(for\|case\%[[zx]]\)\>' ||
+ \ last_line =~ '^\s*\<\(always\|initial\)\>' ||
+ \ last_line =~ '^\s*\<\(specify\|fork\)\>'
+ if last_line !~ '\(;\|\<end\>\)\s*' . vlog_comment . '*$' ||
+ \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'
+ let ind = ind + offset
+ if vverb | echo vverb_str "Indent after a block statement." | endif
+ endif
+ " Indent after function/task blocks
+ elseif last_line =~ '^\s*\<\(function\|task\)\>'
+ if last_line !~ '\<end\>\s*' . vlog_comment . '*$' ||
+ \ last_line =~ '\(//\|/\*\).*\(;\|\<end\>\)\s*' . vlog_comment . '*$'
+ let ind = ind + offset
+ if vverb
+ echo vverb_str "Indent after function/task block statement."
+ endif
+ endif
+
+ " Indent after module/function/task/specify/fork blocks
+ elseif last_line =~ '^\s*\<module\>'
+ let ind = ind + indent_modules
+ if vverb && indent_modules
+ echo vverb_str "Indent after module statement."
+ endif
+ if last_line =~ '[(,]\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*[(,]\s*' . vlog_comment . '*$'
+ let ind = ind + offset
+ if vverb
+ echo vverb_str "Indent after a multiple-line module statement."
+ endif
+ endif
+
+ " Indent after a 'begin' statement
+ elseif last_line =~ '\(\<begin\>\)\(\s*:\s*\w\+\)*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*\(\<begin\>\)' &&
+ \ ( last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' ||
+ \ last_line2 =~ '^\s*[^=!]\+\s*:\s*' . vlog_comment . '*$' )
+ let ind = ind + offset
+ if vverb | echo vverb_str "Indent after begin statement." | endif
+
+ " De-indent for the end of one-line block
+ elseif ( last_line !~ '\<begin\>' ||
+ \ last_line =~ '\(//\|/\*\).*\<begin\>' ) &&
+ \ last_line2 =~ '\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>.*' .
+ \ vlog_comment . '*$' &&
+ \ last_line2 !~
+ \ '\(//\|/\*\).*\<\(`\@<!if\|`\@<!else\|for\|always\|initial\)\>' &&
+ \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ ( last_line2 !~ '\<begin\>' ||
+ \ last_line2 =~ '\(//\|/\*\).*\<begin\>' )
+ let ind = ind - offset
+ if vverb
+ echo vverb_str "De-indent after the end of one-line statement."
+ endif
+
+ " Multiple-line statement (including case statement)
+ " Open statement
+ " Ident the first open line
+ elseif last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*' . vlog_openstat . '\s*$' &&
+ \ last_line2 !~ vlog_openstat . '\s*' . vlog_comment . '*$'
+ let ind = ind + offset
+ if vverb | echo vverb_str "Indent after an open statement." | endif
+
+ " Close statement
+ " De-indent for an optional close parenthesis and a semicolon, and only
+ " if there exists precedent non-whitespace char
+ elseif last_line =~ ')*\s*;\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '^\s*)*\s*;\s*' . vlog_comment . '*$' &&
+ \ last_line !~ '\(//\|/\*\).*\S)*\s*;\s*' . vlog_comment . '*$' &&
+ \ ( last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ last_line2 !~ ';\s*//.*$') &&
+ \ last_line2 !~ '^\s*' . vlog_comment . '$'
+ let ind = ind - offset
+ if vverb | echo vverb_str "De-indent after a close statement." | endif
+
+ " `ifdef and `else
+ elseif last_line =~ '^\s*`\<\(ifdef\|else\)\>'
+ let ind = ind + offset
+ if vverb
+ echo vverb_str "Indent after a `ifdef or `else statement."
+ endif
+
+ endif
+
+ " Re-indent current line
+
+ " De-indent on the end of the block
+ " join/end/endcase/endfunction/endtask/endspecify
+ if curr_line =~ '^\s*\<\(join\|end\|endcase\)\>' ||
+ \ curr_line =~ '^\s*\<\(endfunction\|endtask\|endspecify\)\>'
+ let ind = ind - offset
+ if vverb | echo vverb_str "De-indent the end of a block." | endif
+ elseif curr_line =~ '^\s*\<endmodule\>'
+ let ind = ind - indent_modules
+ if vverb && indent_modules
+ echo vverb_str "De-indent the end of a module."
+ endif
+
+ " De-indent on a stand-alone 'begin'
+ elseif curr_line =~ '^\s*\<begin\>'
+ if last_line !~ '^\s*\<\(function\|task\|specify\|module\)\>' &&
+ \ last_line !~ '^\s*\()*\s*;\|)\+\)\s*' . vlog_comment . '*$' &&
+ \ ( last_line =~
+ \ '\<\(`\@<!if\|`\@<!else\|for\|case\%[[zx]]\|always\|initial\)\>' ||
+ \ last_line =~ ')\s*' . vlog_comment . '*$' ||
+ \ last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' )
+ let ind = ind - offset
+ if vverb
+ echo vverb_str "De-indent a stand alone begin statement."
+ endif
+ endif
+
+ " De-indent after the end of multiple-line statement
+ elseif curr_line =~ '^\s*)' &&
+ \ ( last_line =~ vlog_openstat . '\s*' . vlog_comment . '*$' ||
+ \ last_line !~ vlog_openstat . '\s*' . vlog_comment . '*$' &&
+ \ last_line2 =~ vlog_openstat . '\s*' . vlog_comment . '*$' )
+ let ind = ind - offset
+ if vverb
+ echo vverb_str "De-indent the end of a multiple statement."
+ endif
+
+ " De-indent `else and `endif
+ elseif curr_line =~ '^\s*`\<\(else\|endif\)\>'
+ let ind = ind - offset
+ if vverb | echo vverb_str "De-indent `else and `endif statement." | endif
+
+ endif
+
+ " Return the indention
+ return ind
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/vhdl.vim b/vim73/indent/vhdl.vim
new file mode 100644
index 0000000..717857f
--- /dev/null
+++ b/vim73/indent/vhdl.vim
@@ -0,0 +1,406 @@
+" VHDL indent ('93 syntax)
+" Language: VHDL
+" Maintainer: Gerald Lai <laigera+vim?gmail.com>
+" Version: 1.56
+" Last Change: 2010 Jun 29
+" URL: http://www.vim.org/scripts/script.php?script_id=1450
+
+" only load this indent file when no other was loaded
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" setup indent options for local VHDL buffer
+setlocal indentexpr=GetVHDLindent()
+setlocal indentkeys=!^F,o,O,0(,0)
+setlocal indentkeys+==~begin,=~end\ ,=~end\ ,=~is,=~select,=~when
+setlocal indentkeys+==~if,=~then,=~elsif,=~else
+setlocal indentkeys+==~case,=~loop,=~for,=~generate,=~record,=~units,=~process,=~block,=~function,=~component,=~procedure
+setlocal indentkeys+==~architecture,=~configuration,=~entity,=~package
+
+" constants
+" not a comment
+let s:NC = '\%(--.*\)\@<!'
+" end of string
+let s:ES = '\s*\%(--.*\)\=$'
+" no "end" keyword in front
+let s:NE = '\%(\<end\s\+\)\@<!'
+
+" option to disable alignment of generic/port mappings
+if !exists("g:vhdl_indent_genportmap")
+ let g:vhdl_indent_genportmap = 1
+endif
+
+" option to disable alignment of right-hand side assignment "<=" statements
+if !exists("g:vhdl_indent_rhsassign")
+ let g:vhdl_indent_rhsassign = 1
+endif
+
+" only define indent function once
+if exists("*GetVHDLindent")
+ finish
+endif
+
+function GetVHDLindent()
+ " store current line & string
+ let curn = v:lnum
+ let curs = getline(curn)
+
+ " find previous line that is not a comment
+ let prevn = prevnonblank(curn - 1)
+ let prevs = getline(prevn)
+ while prevn > 0 && prevs =~ '^\s*--'
+ let prevn = prevnonblank(prevn - 1)
+ let prevs = getline(prevn)
+ endwhile
+ let prevs_noi = substitute(prevs, '^\s*', '', '')
+
+ " default indent starts as previous non-comment line's indent
+ let ind = prevn > 0 ? indent(prevn) : 0
+ " backup default
+ let ind2 = ind
+
+ " indent: special; kill string so it would not affect other filters
+ " keywords: "report" + string
+ " where: anywhere in current or previous line
+ let s0 = s:NC.'\<report\>\s*".*"'
+ if curs =~? s0
+ let curs = ""
+ endif
+ if prevs =~? s0
+ let prevs = ""
+ endif
+
+ " indent: previous line's comment position, otherwise follow next non-comment line if possible
+ " keyword: "--"
+ " where: start of current line
+ if curs =~ '^\s*--'
+ let pn = curn - 1
+ let ps = getline(pn)
+ if curs =~ '^\s*--\s' && ps =~ '--'
+ return indent(pn) + stridx(substitute(ps, '^\s*', '', ''), '--')
+ else
+ " find nextnonblank line that is not a comment
+ let nn = nextnonblank(curn + 1)
+ let ns = getline(nn)
+ while nn > 0 && ns =~ '^\s*--'
+ let nn = nextnonblank(nn + 1)
+ let ns = getline(nn)
+ endwhile
+ let n = indent(nn)
+ return n != -1 ? n : ind
+ endif
+ endif
+
+ " ****************************************************************************************
+ " indent: align generic variables & port names
+ " keywords: "generic", "map", "port" + "(", provided current line is part of mapping
+ " where: anywhere in previous 2 lines
+ " find following previous non-comment line
+ let pn = prevnonblank(prevn - 1)
+ let ps = getline(pn)
+ while pn > 0 && ps =~ '^\s*--'
+ let pn = prevnonblank(pn - 1)
+ let ps = getline(pn)
+ endwhile
+ if (curs =~ '^\s*)' || curs =~? '^\s*\%(\<\%(generic\|map\|port\)\>.*\)\@<!\S\+\s*\%(=>\s*\S\+\|:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\w\+\s\+:=\)\)') && (prevs =~? s:NC.'\<\%(generic\|map\|port\)\s*(\%(\s*\w\)\=' || (ps =~? s:NC.'\<\%(generic\|map\|port\)'.s:ES && prevs =~ '^\s*('))
+ " align closing ")" with opening "("
+ if curs =~ '^\s*)'
+ return ind2 + stridx(prevs_noi, '(')
+ endif
+ let m = matchend(prevs_noi, '(\s*\ze\w')
+ if m != -1
+ return ind2 + m
+ else
+ if g:vhdl_indent_genportmap
+ return ind2 + stridx(prevs_noi, '(') + &sw
+ else
+ return ind2 + &sw
+ endif
+ endif
+ endif
+
+ " indent: align conditional/select statement
+ " keywords: variable + "<=" without ";" ending
+ " where: start of previous line
+ if prevs =~? '^\s*\S\+\s*<=[^;]*'.s:ES
+ if g:vhdl_indent_rhsassign
+ return ind2 + matchend(prevs_noi, '<=\s*\ze.')
+ else
+ return ind2 + &sw
+ endif
+ endif
+
+ " indent: backtrace previous non-comment lines for next smaller or equal size indent
+ " keywords: "end" + "record", "units"
+ " where: start of previous line
+ " keyword: ")"
+ " where: start of previous line
+ " keyword: without "<=" + ";" ending
+ " where: anywhere in previous line
+ " keyword: "=>" + ")" ending, provided current line does not begin with ")"
+ " where: anywhere in previous line
+ " _note_: indent allowed to leave this filter
+ let m = 0
+ if prevs =~? '^\s*end\s\+\%(record\|units\)\>'
+ let m = 3
+ elseif prevs =~ '^\s*)'
+ let m = 1
+ elseif prevs =~ s:NC.'\%(<=.*\)\@<!;'.s:ES || (curs !~ '^\s*)' && prevs =~ s:NC.'=>.*'.s:NC.')'.s:ES)
+ let m = 2
+ endif
+
+ if m > 0
+ let pn = prevnonblank(prevn - 1)
+ let ps = getline(pn)
+ while pn > 0
+ let t = indent(pn)
+ if ps !~ '^\s*--' && (t < ind || (t == ind && m == 3))
+ " make sure one of these is true
+ " keywords: variable + "<=" without ";" ending
+ " where: start of previous non-comment line
+ " keywords: "generic", "map", "port"
+ " where: anywhere in previous non-comment line
+ " keyword: "("
+ " where: start of previous non-comment line
+ if m < 3 && ps !~? '^\s*\S\+\s*<=[^;]*'.s:ES
+ if ps =~? s:NC.'\<\%(generic\|map\|port\)\>' || ps =~ '^\s*('
+ let ind = t
+ endif
+ break
+ endif
+ let ind = t
+ if m > 1
+ " find following previous non-comment line
+ let ppn = prevnonblank(pn - 1)
+ let pps = getline(ppn)
+ while ppn > 0 && pps =~ '^\s*--'
+ let ppn = prevnonblank(ppn - 1)
+ let pps = getline(ppn)
+ endwhile
+ " indent: follow
+ " keyword: "select"
+ " where: end of following previous non-comment line
+ " keyword: "type"
+ " where: start of following previous non-comment line
+ if m == 2
+ let s1 = s:NC.'\<select'.s:ES
+ if ps !~? s1 && pps =~? s1
+ let ind = indent(ppn)
+ endif
+ elseif m == 3
+ let s1 = '^\s*type\>'
+ if ps !~? s1 && pps =~? s1
+ let ind = indent(ppn)
+ endif
+ endif
+ endif
+ break
+ endif
+ let pn = prevnonblank(pn - 1)
+ let ps = getline(pn)
+ endwhile
+ endif
+
+ " indent: follow indent of previous opening statement, otherwise -sw
+ " keyword: "begin"
+ " where: anywhere in current line
+ if curs =~? s:NC.'\<begin\>'
+ let ind = ind - &sw
+ " find previous opening statement of
+ " keywords: "architecture", "block", "entity", "function", "generate", "procedure", "process"
+ let s2 = s:NC.s:NE.'\<\%(architecture\|block\|entity\|function\|generate\|procedure\|process\)\>'
+ if (curs !~? s2.'.*'.s:NC.'\<begin\>.*'.s:ES && prevs =~? s2) || m == 1
+ let ind = ind + &sw
+ endif
+ return ind
+ endif
+
+ " indent: +sw if previous line is previous opening statement
+ " keywords: "record", "units"
+ " where: anywhere in current line
+ if curs =~? s:NC.s:NE.'\<\%(record\|units\)\>'
+ " find previous opening statement of
+ " keyword: "type"
+ let s3 = s:NC.s:NE.'\<type\>'
+ if curs !~? s3.'.*'.s:NC.'\<\%(record\|units\)\>.*'.s:ES && prevs =~? s3
+ let ind = ind + &sw
+ endif
+ return ind
+ endif
+
+ " ****************************************************************************************
+ " indent: 0
+ " keywords: "architecture", "configuration", "entity", "library", "package"
+ " where: start of current line
+ if curs =~? '^\s*\%(architecture\|configuration\|entity\|library\|package\)\>'
+ return 0
+ endif
+
+ " indent: maintain indent of previous opening statement
+ " keyword: "is"
+ " where: start of current line
+ " find previous opening statement of
+ " keywords: "architecture", "block", "configuration", "entity", "function", "package", "procedure", "process", "type"
+ if curs =~? '^\s*\<is\>' && prevs =~? s:NC.s:NE.'\<\%(architecture\|block\|configuration\|entity\|function\|package\|procedure\|process\|type\)\>'
+ return ind2
+ endif
+
+ " indent: maintain indent of previous opening statement
+ " keyword: "then"
+ " where: start of current line
+ " find previous opening statement of
+ " keywords: "elsif", "if"
+ if curs =~? '^\s*\<then\>' && prevs =~? s:NC.'\%(\<elsif\>\|'.s:NE.'\<if\>\)'
+ return ind2
+ endif
+
+ " indent: maintain indent of previous opening statement
+ " keyword: "generate"
+ " where: start of current line
+ " find previous opening statement of
+ " keywords: "for", "if"
+ if curs =~? '^\s*\<generate\>' && prevs =~? s:NC.s:NE.'\%(\%(\<wait\s\+\)\@<!\<for\|\<if\)\>'
+ return ind2
+ endif
+
+ " indent: +sw
+ " keywords: "block", "process"
+ " removed: "begin", "case", "elsif", "if", "loop", "record", "units", "while"
+ " where: anywhere in previous line
+ if prevs =~? s:NC.s:NE.'\<\%(block\|process\)\>'
+ return ind + &sw
+ endif
+
+ " indent: +sw
+ " keywords: "architecture", "configuration", "entity", "package"
+ " removed: "component", "for", "when", "with"
+ " where: start of previous line
+ if prevs =~? '^\s*\%(architecture\|configuration\|entity\|package\)\>'
+ return ind + &sw
+ endif
+
+ " indent: +sw
+ " keyword: "select"
+ " removed: "generate", "is", "=>"
+ " where: end of previous line
+ if prevs =~? s:NC.'\<select'.s:ES
+ return ind + &sw
+ endif
+
+ " indent: +sw
+ " keyword: "begin", "loop", "record", "units"
+ " where: anywhere in previous line
+ " keyword: "component", "else", "for"
+ " where: start of previous line
+ " keyword: "generate", "is", "then", "=>"
+ " where: end of previous line
+ " _note_: indent allowed to leave this filter
+ if prevs =~? s:NC.'\%(\<begin\>\|'.s:NE.'\<\%(loop\|record\|units\)\>\)' || prevs =~? '^\s*\%(component\|else\|for\)\>' || prevs =~? s:NC.'\%('.s:NE.'\<generate\|\<\%(is\|then\)\|=>\)'.s:ES
+ let ind = ind + &sw
+ endif
+
+ " ****************************************************************************************
+ " indent: -sw
+ " keywords: "when", provided previous line does not begin with "when", does not end with "is"
+ " where: start of current line
+ let s4 = '^\s*when\>'
+ if curs =~? s4
+ if prevs =~? s:NC.'\<is'.s:ES
+ return ind
+ elseif prevs !~? s4
+ return ind - &sw
+ else
+ return ind2
+ endif
+ endif
+
+ " indent: -sw
+ " keywords: "else", "elsif", "end" + "block", "for", "function", "generate", "if", "loop", "procedure", "process", "record", "units"
+ " where: start of current line
+ if curs =~? '^\s*\%(else\|elsif\|end\s\+\%(block\|for\|function\|generate\|if\|loop\|procedure\|process\|record\|units\)\)\>'
+ return ind - &sw
+ endif
+
+ " indent: backtrace previous non-comment lines
+ " keyword: "end" + "case", "component"
+ " where: start of current line
+ let m = 0
+ if curs =~? '^\s*end\s\+case\>'
+ let m = 1
+ elseif curs =~? '^\s*end\s\+component\>'
+ let m = 2
+ endif
+
+ if m > 0
+ " find following previous non-comment line
+ let pn = prevn
+ let ps = getline(pn)
+ while pn > 0
+ if ps !~ '^\s*--'
+ "indent: -2sw
+ "keywords: "end" + "case"
+ "where: start of previous non-comment line
+ "indent: -sw
+ "keywords: "when"
+ "where: start of previous non-comment line
+ "indent: follow
+ "keywords: "case"
+ "where: start of previous non-comment line
+ if m == 1
+ if ps =~? '^\s*end\s\+case\>'
+ return indent(pn) - 2 * &sw
+ elseif ps =~? '^\s*when\>'
+ return indent(pn) - &sw
+ elseif ps =~? '^\s*case\>'
+ return indent(pn)
+ endif
+ "indent: follow
+ "keyword: "component"
+ "where: start of previous non-comment line
+ elseif m == 2
+ if ps =~? '^\s*component\>'
+ return indent(pn)
+ endif
+ endif
+ endif
+ let pn = prevnonblank(pn - 1)
+ let ps = getline(pn)
+ endwhile
+ return ind - &sw
+ endif
+
+ " indent: -sw
+ " keyword: ")"
+ " where: start of current line
+ if curs =~ '^\s*)'
+ return ind - &sw
+ endif
+
+ " indent: 0
+ " keywords: "end" + "architecture", "configuration", "entity", "package"
+ " where: start of current line
+ if curs =~? '^\s*end\s\+\%(architecture\|configuration\|entity\|package\)\>'
+ return 0
+ endif
+
+ " indent: -sw
+ " keywords: "end" + identifier, ";"
+ " where: start of current line
+ "if curs =~? '^\s*end\s\+\w\+\>'
+ if curs =~? '^\s*end\%(\s\|;'.s:ES.'\)'
+ return ind - &sw
+ endif
+
+ " ****************************************************************************************
+ " indent: maintain indent of previous opening statement
+ " keywords: without "generic", "map", "port" + ":" but not ":=" + "in", "out", "inout", "buffer", "linkage", variable & ":="
+ " where: start of current line
+ if curs =~? '^\s*\%(\<\%(generic\|map\|port\)\>.*\)\@<!\S\+\s*:[^=]\@=\s*\%(\%(in\|out\|inout\|buffer\|linkage\)\>\|\w\+\s\+:=\)'
+ return ind2
+ endif
+
+ " return leftover filtered indent
+ return ind
+endfunction
diff --git a/vim73/indent/vim.vim b/vim73/indent/vim.vim
new file mode 100644
index 0000000..0a6dbc1
--- /dev/null
+++ b/vim73/indent/vim.vim
@@ -0,0 +1,74 @@
+" Vim indent file
+" Language: Vim script
+" Maintainer: Bram Moolenaar <Bram@vim.org>
+" Last Change: 2005 Jul 06
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetVimIndent()
+setlocal indentkeys+==end,=else,=cat,=fina,=END,0\\
+
+" Only define the function once.
+if exists("*GetVimIndent")
+ finish
+endif
+
+function GetVimIndent()
+ " Find a non-blank line above the current line.
+ let lnum = prevnonblank(v:lnum - 1)
+
+ " If the current line doesn't start with '\' and below a line that starts
+ " with '\', use the indent of the line above it.
+ if getline(v:lnum) !~ '^\s*\\'
+ while lnum > 0 && getline(lnum) =~ '^\s*\\'
+ let lnum = lnum - 1
+ endwhile
+ endif
+
+ " At the start of the file use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ " Add a 'shiftwidth' after :if, :while, :try, :catch, :finally, :function
+ " and :else. Add it three times for a line that starts with '\' after
+ " a line that doesn't (or g:vim_indent_cont if it exists).
+ let ind = indent(lnum)
+ if getline(v:lnum) =~ '^\s*\\' && v:lnum > 1 && getline(lnum) !~ '^\s*\\'
+ if exists("g:vim_indent_cont")
+ let ind = ind + g:vim_indent_cont
+ else
+ let ind = ind + &sw * 3
+ endif
+ elseif getline(lnum) =~ '\(^\||\)\s*\(if\|wh\%[ile]\|for\|try\|cat\%[ch]\|fina\%[lly]\|fu\%[nction]\|el\%[seif]\)\>'
+ let ind = ind + &sw
+ elseif getline(lnum) =~ '^\s*aug\%[roup]' && getline(lnum) !~ '^\s*aug\%[roup]\s*!\=\s\+END'
+ let ind = ind + &sw
+ endif
+
+ " If the previous line contains an "end" after a pipe, but not in an ":au"
+ " command. And not when there is a backslash before the pipe.
+ " And when syntax HL is enabled avoid a match inside a string.
+ let line = getline(lnum)
+ let i = match(line, '[^\\]|\s*\(ene\@!\)')
+ if i > 0 && line !~ '^\s*au\%[tocmd]'
+ if !has('syntax_items') || synIDattr(synID(lnum, i + 2, 1), "name") !~ '\(Comment\|String\)$'
+ let ind = ind - &sw
+ endif
+ endif
+
+
+ " Subtract a 'shiftwidth' on a :endif, :endwhile, :catch, :finally, :endtry,
+ " :endfun, :else and :augroup END.
+ if getline(v:lnum) =~ '^\s*\(ene\@!\|cat\|fina\|el\|aug\%[roup]\s*!\=\s\+END\)'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
+
+" vim:sw=2
diff --git a/vim73/indent/xf86conf.vim b/vim73/indent/xf86conf.vim
new file mode 100644
index 0000000..4174a24
--- /dev/null
+++ b/vim73/indent/xf86conf.vim
@@ -0,0 +1,37 @@
+" Vim indent file
+" Language: XFree86 Configuration File
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetXF86ConfIndent()
+setlocal indentkeys=!^F,o,O,=End
+setlocal nosmartindent
+
+if exists("*GetXF86ConfIndent")
+ finish
+endif
+
+function GetXF86ConfIndent()
+ let lnum = prevnonblank(v:lnum - 1)
+
+ if lnum == 0
+ return 0
+ endif
+
+ let ind = indent(lnum)
+
+ if getline(lnum) =~? '^\s*\(Sub\)\=Section\>'
+ let ind = ind + &sw
+ endif
+
+ if getline(v:lnum) =~? '^\s*End\(Sub\)\=Section\>'
+ let ind = ind - &sw
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/xhtml.vim b/vim73/indent/xhtml.vim
new file mode 100644
index 0000000..2197b79
--- /dev/null
+++ b/vim73/indent/xhtml.vim
@@ -0,0 +1,12 @@
+" Vim indent file
+" Language: XHTML
+" Maintainer: Bram Moolenaar <Bram@vim.org> (for now)
+" Last Change: 2005 Jun 24
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Handled like HTML for now.
+runtime! indent/html.vim
diff --git a/vim73/indent/xinetd.vim b/vim73/indent/xinetd.vim
new file mode 100644
index 0000000..f7a5341
--- /dev/null
+++ b/vim73/indent/xinetd.vim
@@ -0,0 +1,50 @@
+" Vim indent file
+" Language: xinetd.conf(5) configuration file
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+setlocal indentexpr=GetXinetdIndent()
+setlocal indentkeys=0{,0},!^F,o,O
+setlocal nosmartindent
+
+if exists("*GetXinetdIndent")
+ finish
+endif
+
+function s:count_braces(lnum, count_open)
+ let n_open = 0
+ let n_close = 0
+ let line = getline(a:lnum)
+ let pattern = '[{}]'
+ let i = match(line, pattern)
+ while i != -1
+ if synIDattr(synID(a:lnum, i + 1, 0), 'name') !~ 'ld\%(Comment\|String\)'
+ if line[i] == '{'
+ let n_open += 1
+ elseif line[i] == '}'
+ if n_open > 0
+ let n_open -= 1
+ else
+ let n_close += 1
+ endif
+ endif
+ endif
+ let i = match(line, pattern, i + 1)
+ endwhile
+ return a:count_open ? n_open : n_close
+endfunction
+
+function GetXinetdIndent()
+ let pnum = prevnonblank(v:lnum - 1)
+ if pnum == 0
+ return 0
+ endif
+
+ return indent(pnum) + s:count_braces(pnum, 1) * &sw
+ \ - s:count_braces(v:lnum, 0) * &sw
+endfunction
diff --git a/vim73/indent/xml.vim b/vim73/indent/xml.vim
new file mode 100644
index 0000000..4ac35b6
--- /dev/null
+++ b/vim73/indent/xml.vim
@@ -0,0 +1,96 @@
+" Language: xml
+" Maintainer: Johannes Zellner <johannes@zellner.org>
+" Last Change: 2009-05-26 00:17:25
+" Notes: 1) does not indent pure non-xml code (e.g. embedded scripts)
+" 2) will be confused by unbalanced tags in comments
+" or CDATA sections.
+" 2009-05-26 patch by Nikolai Weibull
+" TODO: implement pre-like tags, see xml_indent_open / xml_indent_close
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+let b:did_indent = 1
+
+" [-- local settings (must come before aborting the script) --]
+setlocal indentexpr=XmlIndentGet(v:lnum,1)
+setlocal indentkeys=o,O,*<Return>,<>>,<<>,/,{,}
+
+set cpo-=C
+
+if !exists('b:xml_indent_open')
+ let b:xml_indent_open = '.\{-}<\a'
+ " pre tag, e.g. <address>
+ " let b:xml_indent_open = '.\{-}<[/]\@!\(address\)\@!'
+endif
+
+if !exists('b:xml_indent_close')
+ let b:xml_indent_close = '.\{-}</'
+ " end pre tag, e.g. </address>
+ " let b:xml_indent_close = '.\{-}</\(address\)\@!'
+endif
+
+" [-- finish, if the function already exists --]
+if exists('*XmlIndentGet') | finish | endif
+
+fun! <SID>XmlIndentWithPattern(line, pat)
+ let s = substitute('x'.a:line, a:pat, "\1", 'g')
+ return strlen(substitute(s, "[^\1].*$", '', ''))
+endfun
+
+" [-- check if it's xml --]
+fun! <SID>XmlIndentSynCheck(lnum)
+ if '' != &syntax
+ let syn1 = synIDattr(synID(a:lnum, 1, 1), 'name')
+ let syn2 = synIDattr(synID(a:lnum, strlen(getline(a:lnum)) - 1, 1), 'name')
+ if '' != syn1 && syn1 !~ 'xml' && '' != syn2 && syn2 !~ 'xml'
+ " don't indent pure non-xml code
+ return 0
+ elseif syn1 =~ '^xmlComment' && syn2 =~ '^xmlComment'
+ " indent comments specially
+ return -1
+ endif
+ endif
+ return 1
+endfun
+
+" [-- return the sum of indents of a:lnum --]
+fun! <SID>XmlIndentSum(lnum, style, add)
+ let line = getline(a:lnum)
+ if a:style == match(line, '^\s*</')
+ return (&sw *
+ \ (<SID>XmlIndentWithPattern(line, b:xml_indent_open)
+ \ - <SID>XmlIndentWithPattern(line, b:xml_indent_close)
+ \ - <SID>XmlIndentWithPattern(line, '.\{-}/>'))) + a:add
+ else
+ return a:add
+ endif
+endfun
+
+fun! XmlIndentGet(lnum, use_syntax_check)
+ " Find a non-empty line above the current line.
+ let lnum = prevnonblank(a:lnum - 1)
+
+ " Hit the start of the file, use zero indent.
+ if lnum == 0
+ return 0
+ endif
+
+ if a:use_syntax_check
+ let check_lnum = <SID>XmlIndentSynCheck(lnum)
+ let check_alnum = <SID>XmlIndentSynCheck(a:lnum)
+ if 0 == check_lnum || 0 == check_alnum
+ return indent(a:lnum)
+ elseif -1 == check_lnum || -1 == check_alnum
+ return -1
+ endif
+ endif
+
+ let ind = <SID>XmlIndentSum(lnum, -1, indent(lnum))
+ let ind = <SID>XmlIndentSum(a:lnum, 0, ind)
+
+ return ind
+endfun
+
+" vim:ts=8
diff --git a/vim73/indent/xsd.vim b/vim73/indent/xsd.vim
new file mode 100644
index 0000000..59e0b60
--- /dev/null
+++ b/vim73/indent/xsd.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: .xsd files (XML Schema)
+" Maintainer: Nobody
+" Last Change: 2005 Jun 09
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use XML formatting rules
+runtime! indent/xml.vim
+
diff --git a/vim73/indent/xslt.vim b/vim73/indent/xslt.vim
new file mode 100644
index 0000000..ff93d69
--- /dev/null
+++ b/vim73/indent/xslt.vim
@@ -0,0 +1,13 @@
+" Vim indent file
+" Language: XSLT .xslt files
+" Maintainer: David Fishburn <fishburn@ianywhere.com>
+" Last Change: Wed May 14 2003 8:48:41 PM
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+" Use XML formatting rules
+runtime! indent/xml.vim
+
diff --git a/vim73/indent/yacc.vim b/vim73/indent/yacc.vim
new file mode 100644
index 0000000..2ab7d7b
--- /dev/null
+++ b/vim73/indent/yacc.vim
@@ -0,0 +1,41 @@
+" Vim indent file
+" Language: YACC input file
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-12-20
+
+" Only load this indent file when no other was loaded.
+if exists("b:did_indent")
+ finish
+endif
+
+let b:did_indent = 1
+
+setlocal indentexpr=GetYaccIndent()
+setlocal indentkeys=!^F,o,O
+setlocal nosmartindent
+
+" Only define the function once.
+if exists("*GetYaccIndent")
+ finish
+endif
+
+function GetYaccIndent()
+ if v:lnum == 1
+ return 0
+ endif
+
+ let ind = indent(v:lnum - 1)
+ let line = getline(v:lnum - 1)
+
+ if line == ''
+ let ind = 0
+ elseif line =~ '^\w\+\s*:'
+ let ind = ind + matchend(line, '^\w\+\s*')
+ elseif line =~ '^\s*;'
+ let ind = 0
+ else
+ let ind = indent(v:lnum)
+ endif
+
+ return ind
+endfunction
diff --git a/vim73/indent/zsh.vim b/vim73/indent/zsh.vim
new file mode 100644
index 0000000..c5580a1
--- /dev/null
+++ b/vim73/indent/zsh.vim
@@ -0,0 +1,11 @@
+" Vim indent file
+" Language: Zsh Shell Script
+" Maintainer: Nikolai Weibull <now@bitwi.se>
+" Latest Revision: 2006-04-19
+
+if exists("b:did_indent")
+ finish
+endif
+
+" Same as sh indenting for now.
+runtime! indent/sh.vim