Update runtime files.
diff --git a/runtime/indent/erlang.vim b/runtime/indent/erlang.vim
index 5ce3f82..930f5d1 100644
--- a/runtime/indent/erlang.vim
+++ b/runtime/indent/erlang.vim
@@ -1,128 +1,144 @@
" 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
+" Author: Csaba Hoch <csaba.hoch@gmail.com>
+" Contributors: Edwin Fine <efine145_nospam01 at usa dot net>
+" Pawel 'kTT' Salata <rockplayer.pl@gmail.com>
+" Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
+" License: Vim license
+" Version: 2011/09/06
-" Only load this indent file when no other was loaded.
+" Only load this indent file when no other was loaded
if exists("b:did_indent")
- finish
+ finish
+else
+ let b:did_indent = 1
endif
-let b:did_indent = 1
setlocal indentexpr=ErlangIndent()
setlocal indentkeys+==after,=end,=catch,=),=],=}
-" Only define the functions once.
+" Only define the functions once
if exists("*ErlangIndent")
- finish
+ 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
+" The function goes through the whole line, analyses it and returns the
+" indentation level.
+"
+" line: the line to be examined
+" return: the indentation level of the examined line
+function s:ErlangIndentAfterLine(line)
+ let linelen = strlen(a:line) " the length of the line
+ let i = 0 " the index of the current character in 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'
+ let last_fun = 0 " the last token was a 'fun'
+ let last_receive = 0 " the last token was a 'receive'; needed for 'after'
+ let last_hash_sym = 0 " the last token was a '#'
- while 0<= i && i < length
+ " Ignore comments
+ if a:line =~# '^\s*%'
+ return 0
+ endif
+ " Partial function head where the guard is missing
+ if a:line =~# "\\(^\\l[[:alnum:]_]*\\)\\|\\(^'[^']\\+'\\)(" && a:line !~# '->'
+ return 2
+ endif
+
+ " The missing guard from the split function head
+ if a:line =~# '^\s*when\s\+.*->'
+ return -1
+ endif
+
+ while 0<=i && i<linelen
" 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
+ if a:line[i] == '"'
+ let m = matchend(a:line,'"\%([^"\\]\|\\.\)*"',i)
+ let last_receive = 0
+ elseif a:line[i] == "'"
+ let m = matchend(a:line,"'[^']*'",i)
+ let last_receive = 0
+ elseif a:line[i] =~# "[a-z]"
+ let m = matchend(a:line,".[[:alnum:]_]*",i)
+ if last_fun
let ind = ind - 1
- let lastFun = 0
- let lastReceive = 0
- elseif a:l[(i):(m-1)] =~# '^\%(case\|if\|try\)$'
+ let last_fun = 0
+ let last_receive = 0
+ elseif a:line[(i):(m-1)] =~# '^\%(case\|if\|try\)$'
let ind = ind + 1
- elseif a:l[(i):(m-1)] =~# '^receive$'
+ elseif a:line[(i):(m-1)] =~# '^receive$'
let ind = ind + 1
- let lastReceive = 1
- elseif a:l[(i):(m-1)] =~# '^begin$'
+ let last_receive = 1
+ elseif a:line[(i):(m-1)] =~# '^begin$'
let ind = ind + 2
- let lastReceive = 0
- elseif a:l[(i):(m-1)] =~# '^end$'
+ let last_receive = 0
+ elseif a:line[(i):(m-1)] =~# '^end$'
let ind = ind - 2
- let lastReceive = 0
- elseif a:l[(i):(m-1)] =~# '^after$'
- if lastReceive == 0
+ let last_receive = 0
+ elseif a:line[(i):(m-1)] =~# '^after$'
+ if last_receive == 0
let ind = ind - 1
else
let ind = ind + 0
- end
- let lastReceive = 0
- elseif a:l[(i):(m-1)] =~# '^fun$'
+ endif
+ let last_receive = 0
+ elseif a:line[(i):(m-1)] =~# '^fun$'
let ind = ind + 1
- let lastFun = 1
- let lastReceive = 0
+ let last_fun = 1
+ let last_receive = 0
endif
- elseif a:l[i] =~# "[A-Z_]"
- let m = matchend(a:l,".[[:alnum:]_]*",i)
- let lastReceive = 0
- elseif a:l[i] == '$'
+ elseif a:line[i] =~# "[A-Z_]"
+ let m = matchend(a:line,".[[:alnum:]_]*",i)
+ let last_receive = 0
+ elseif a:line[i] == '$'
let m = i+2
- let lastReceive = 0
- elseif a:l[i] == "." && (i+1>=length || a:l[i+1]!~ "[0-9]")
+ let last_receive = 0
+ elseif a:line[i] == "." && (i+1>=linelen || a:line[i+1]!~ "[0-9]")
let m = i+1
- if lastHashMark
- let lastHashMark = 0
+ if last_hash_sym
+ let last_hash_sym = 0
else
let ind = ind - 1
- end
- let lastReceive = 0
- elseif a:l[i] == '-' && (i+1<length && a:l[i+1]=='>')
+ endif
+ let last_receive = 0
+ elseif a:line[i] == '-' && (i+1<linelen && a:line[i+1]=='>')
let m = i+2
let ind = ind + 1
- let lastReceive = 0
- elseif a:l[i] == ';'
+ let last_receive = 0
+ elseif a:line[i] == ';' && a:line[(i):(linelen)] !~# '.*->.*'
let m = i+1
let ind = ind - 1
- let lastReceive = 0
- elseif a:l[i] == '#'
+ let last_receive = 0
+ elseif a:line[i] == '#'
let m = i+1
- let lastHashMark = 1
- elseif a:l[i] =~# '[({[]'
+ let last_hash_sym = 1
+ elseif a:line[i] =~# '[({[]'
let m = i+1
let ind = ind + 1
- let lastFun = 0
- let lastReceive = 0
- let lastHashMark = 0
- elseif a:l[i] =~# '[)}\]]'
+ let last_fun = 0
+ let last_receive = 0
+ let last_hash_sym = 0
+ elseif a:line[i] =~# '[)}\]]'
let m = i+1
let ind = ind - 1
- let lastReceive = 0
+ let last_receive = 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 '%'
+ " Continue to search above if the current line begins with a '%'
while line =~# '^\s*%.*$'
let lnum = prevnonblank(lnum - 1)
if 0 == lnum
@@ -133,12 +149,20 @@
return lnum
endfunction
-function ErlangIndent()
+" The function returns the indentation level of the line adjusted to a mutiple
+" of 'shiftwidth' option.
+"
+" lnum: line number
+" return: the indentation level of the line
+function s:GetLineIndent(lnum)
+ return (indent(a:lnum) / &sw) * &sw
+endfunction
- " Find a non-blank line above the current line.
+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.
+ " Hit the start of the file, use zero indent
if lnum == 0
return 0
endif
@@ -146,9 +170,14 @@
let prevline = getline(lnum)
let currline = getline(v:lnum)
- let ind = indent(lnum) + &sw * s:ErlangIndentAtferLine(prevline)
+ let ind_after = s:ErlangIndentAfterLine(prevline)
+ if ind_after != 0
+ let ind = s:GetLineIndent(lnum) + ind_after * &sw
+ else
+ let ind = indent(lnum) + ind_after * &sw
+ endif
- " special cases:
+ " Special cases:
if prevline =~# '^\s*\%(after\|end\)\>'
let ind = ind + 2*&sw
endif
@@ -158,8 +187,8 @@
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'
+ let ind = ind - 1*&sw
else
let ind = ind - 2*&sw
endif
@@ -181,26 +210,4 @@
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/runtime/indent/java.vim b/runtime/indent/java.vim
index facbdbf..3c48d3e 100644
--- a/runtime/indent/java.vim
+++ b/runtime/indent/java.vim
@@ -1,7 +1,12 @@
" Vim indent file
" Language: Java
-" Maintainer: Toby Allsopp <toby.allsopp@peace.com> (resigned)
-" Last Change: 2005 Mar 28
+" Previous Maintainer: Toby Allsopp <toby.allsopp@peace.com>
+" Current Maintainer: Hong Xu <xuhdev@gmail.com>
+" Last Change: 2012 Jan 20
+" Version: 1.0
+" License: Same as Vim.
+" Copyright (c) 2012 Hong Xu
+" Before 2012, this file is maintained by Toby Allsopp.
" Only load this indent file when no other was loaded.
if exists("b:did_indent")
@@ -60,6 +65,13 @@
" find start of previous line, in case it was a continuation line
let lnum = SkipJavaBlanksAndComments(v:lnum - 1)
+
+ " If the previous line starts with '@', we should have the same indent as
+ " the previous one
+ if getline(lnum) =~ '^\s*@\S\+\s*$'
+ return indent(lnum)
+ endif
+
let prev = lnum
while prev > 1
let next_prev = SkipJavaBlanksAndComments(prev - 1)