diff --git a/runtime/indent/clojure.vim b/runtime/indent/clojure.vim
index 9a00fb3..7d0c2aa 100644
--- a/runtime/indent/clojure.vim
+++ b/runtime/indent/clojure.vim
@@ -1,16 +1,20 @@
 " Vim indent file
-" Language:     Clojure
-" Author:       Meikel Brandmeyer <mb@kotka.de>
-" URL:          http://kotka.de/projects/clojure/vimclojure.html
+" Language:	Clojure
+" Author:	Meikel Brandmeyer <mb@kotka.de>
+" URL:		http://kotka.de/projects/clojure/vimclojure.html
 "
-" Maintainer:   Sung Pae <self@sungpae.com>
-" URL:          https://github.com/guns/vim-clojure-static
-" License:      Same as Vim
-" Last Change:  30 January 2013
+" Maintainer:	Sung Pae <self@sungpae.com>
+" URL:		https://github.com/guns/vim-clojure-static
+" License:	Same as Vim
+" Last Change:	08 September 2013
 
-" Only load this indent file when no other was loaded.
+" TODO: Indenting after multibyte characters is broken:
+"       (let [Δ (if foo
+"                bar    ; Indent error
+"                baz)])
+
 if exists("b:did_indent")
-    finish
+	finish
 endif
 let b:did_indent = 1
 
@@ -25,290 +29,277 @@
 
 if exists("*searchpairpos")
 
-    if !exists('g:clojure_maxlines')
-        let g:clojure_maxlines = 100
-    endif
+	if !exists('g:clojure_maxlines')
+		let g:clojure_maxlines = 100
+	endif
 
-    if !exists('g:clojure_fuzzy_indent')
-        let g:clojure_fuzzy_indent = 1
-    endif
+	if !exists('g:clojure_fuzzy_indent')
+		let g:clojure_fuzzy_indent = 1
+	endif
 
-    if !exists('g:clojure_fuzzy_indent_patterns')
-        let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let']
-    endif
+	if !exists('g:clojure_fuzzy_indent_patterns')
+		let g:clojure_fuzzy_indent_patterns = ['^with', '^def', '^let']
+	endif
 
-    if !exists('g:clojure_fuzzy_indent_blacklist')
-        let g:clojure_fuzzy_indent_blacklist = ['-fn$', '\v^with-%(meta|out-str|loading-context)$']
-    endif
+	if !exists('g:clojure_fuzzy_indent_blacklist')
+		let g:clojure_fuzzy_indent_blacklist = ['-fn$', '\v^with-%(meta|out-str|loading-context)$']
+	endif
 
-    if !exists('g:clojure_special_indent_words')
-        let g:clojure_special_indent_words = 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
-    endif
+	if !exists('g:clojure_special_indent_words')
+		let g:clojure_special_indent_words = 'deftype,defrecord,reify,proxy,extend-type,extend-protocol,letfn'
+	endif
 
-    if !exists('g:clojure_align_multiline_strings')
-        let g:clojure_align_multiline_strings = 0
-    endif
+	if !exists('g:clojure_align_multiline_strings')
+		let g:clojure_align_multiline_strings = 0
+	endif
 
-    function! s:SynIdName()
-        return synIDattr(synID(line("."), col("."), 0), "name")
-    endfunction
+	function! s:SynIdName()
+		return synIDattr(synID(line("."), col("."), 0), "name")
+	endfunction
 
-    function! s:CurrentChar()
-        return getline('.')[col('.')-1]
-    endfunction
+	function! s:CurrentChar()
+		return getline('.')[col('.')-1]
+	endfunction
 
-    function! s:CurrentWord()
-        return getline('.')[col('.')-1 : searchpos('\v>', 'n', line('.'))[1]-2]
-    endfunction
+	function! s:CurrentWord()
+		return getline('.')[col('.')-1 : searchpos('\v>', 'n', line('.'))[1]-2]
+	endfunction
 
-    function! s:IsParen()
-        return s:CurrentChar() =~ '\v[\(\)\[\]\{\}]' &&
-             \ s:SynIdName() !~? '\vstring|comment'
-    endfunction
+	function! s:IsParen()
+		return s:CurrentChar() =~ '\v[\(\)\[\]\{\}]' &&
+		     \ s:SynIdName() !~? '\vstring|regex|comment|character'
+	endfunction
 
-    " Returns 1 if string matches a pattern in 'patterns', which may be a
-    " list of patterns, or a comma-delimited string of implicitly anchored
-    " patterns.
-    function! s:MatchesOne(patterns, string)
-        let list = type(a:patterns) == type([])
-                   \ ? a:patterns
-                   \ : map(split(a:patterns, ','), '"^" . v:val . "$"')
-        for pat in list
-            if a:string =~ pat | return 1 | endif
-        endfor
-    endfunction
+	" Returns 1 if string matches a pattern in 'patterns', which may be a
+	" list of patterns, or a comma-delimited string of implicitly anchored
+	" patterns.
+	function! s:MatchesOne(patterns, string)
+		let list = type(a:patterns) == type([])
+			   \ ? a:patterns
+			   \ : map(split(a:patterns, ','), '"^" . v:val . "$"')
+		for pat in list
+			if a:string =~ pat | return 1 | endif
+		endfor
+	endfunction
 
-    function! s:SavePosition()
-        let [ _b, l, c, _o ] = getpos(".")
-        let b = bufnr("%")
-        return [b, l, c]
-    endfunction
+	function! s:MatchPairs(open, close, stopat)
+		" Stop only on vector and map [ resp. {. Ignore the ones in strings and
+		" comments.
+		if a:stopat == 0
+			let stopat = max([line(".") - g:clojure_maxlines, 0])
+		else
+			let stopat = a:stopat
+		endif
 
-    function! s:RestorePosition(value)
-        let [b, l, c] = a:value
-        if bufnr("%") != b
-            execute b "buffer!"
-        endif
-        call setpos(".", [0, l, c, 0])
-    endfunction
+		let pos = searchpairpos(a:open, '', a:close, 'bWn', "!s:IsParen()", stopat)
+		return [pos[0], virtcol(pos)]
+	endfunction
 
-    function! s:MatchPairs(open, close, stopat)
-        " Stop only on vector and map [ resp. {. Ignore the ones in strings and
-        " comments.
-        if a:stopat == 0
-            let stopat = max([line(".") - g:clojure_maxlines, 0])
-        else
-            let stopat = a:stopat
-        endif
+	function! s:ClojureCheckForStringWorker()
+		" Check whether there is the last character of the previous line is
+		" highlighted as a string. If so, we check whether it's a ". In this
+		" case we have to check also the previous character. The " might be the
+		" closing one. In case the we are still in the string, we search for the
+		" opening ". If this is not found we take the indent of the line.
+		let nb = prevnonblank(v:lnum - 1)
 
-        let pos = searchpairpos(a:open, '', a:close, 'bWn', "!s:IsParen()", stopat)
-        return [pos[0], virtcol(pos)]
-    endfunction
+		if nb == 0
+			return -1
+		endif
 
-    function! s:ClojureCheckForStringWorker()
-        " Check whether there is the last character of the previous line is
-        " highlighted as a string. If so, we check whether it's a ". In this
-        " case we have to check also the previous character. The " might be the
-        " closing one. In case the we are still in the string, we search for the
-        " opening ". If this is not found we take the indent of the line.
-        let nb = prevnonblank(v:lnum - 1)
+		call cursor(nb, 0)
+		call cursor(0, col("$") - 1)
+		if s:SynIdName() !~? "string"
+			return -1
+		endif
 
-        if nb == 0
-            return -1
-        endif
+		" This will not work for a " in the first column...
+		if s:CurrentChar() == '"'
+			call cursor(0, col("$") - 2)
+			if s:SynIdName() !~? "string"
+				return -1
+			endif
+			if s:CurrentChar() != '\\'
+				return -1
+			endif
+			call cursor(0, col("$") - 1)
+		endif
 
-        call cursor(nb, 0)
-        call cursor(0, col("$") - 1)
-        if s:SynIdName() !~? "string"
-            return -1
-        endif
+		let p = searchpos('\(^\|[^\\]\)\zs"', 'bW')
 
-        " This will not work for a " in the first column...
-        if s:CurrentChar() == '"'
-            call cursor(0, col("$") - 2)
-            if s:SynIdName() !~? "string"
-                return -1
-            endif
-            if s:CurrentChar() != '\\'
-                return -1
-            endif
-            call cursor(0, col("$") - 1)
-        endif
+		if p != [0, 0]
+			return p[1] - 1
+		endif
 
-        let p = searchpos('\(^\|[^\\]\)\zs"', 'bW')
+		return indent(".")
+	endfunction
 
-        if p != [0, 0]
-            return p[1] - 1
-        endif
+	function! s:CheckForString()
+		let pos = getpos('.')
+		try
+			let val = s:ClojureCheckForStringWorker()
+		finally
+			call setpos('.', pos)
+		endtry
+		return val
+	endfunction
 
-        return indent(".")
-    endfunction
+	function! s:ClojureIsMethodSpecialCaseWorker(position)
+		" Find the next enclosing form.
+		call search('\S', 'Wb')
 
-    function! s:CheckForString()
-        let pos = s:SavePosition()
-        try
-            let val = s:ClojureCheckForStringWorker()
-        finally
-            call s:RestorePosition(pos)
-        endtry
-        return val
-    endfunction
+		" Special case: we are at a '(('.
+		if s:CurrentChar() == '('
+			return 0
+		endif
+		call cursor(a:position)
 
-    function! s:ClojureIsMethodSpecialCaseWorker(position)
-        " Find the next enclosing form.
-        call search('\S', 'Wb')
+		let nextParen = s:MatchPairs('(', ')', 0)
 
-        " Special case: we are at a '(('.
-        if s:CurrentChar() == '('
-            return 0
-        endif
-        call cursor(a:position)
+		" Special case: we are now at toplevel.
+		if nextParen == [0, 0]
+			return 0
+		endif
+		call cursor(nextParen)
 
-        let nextParen = s:MatchPairs('(', ')', 0)
+		call search('\S', 'W')
+		if g:clojure_special_indent_words =~ '\<' . s:CurrentWord() . '\>'
+			return 1
+		endif
 
-        " Special case: we are now at toplevel.
-        if nextParen == [0, 0]
-            return 0
-        endif
-        call cursor(nextParen)
+		return 0
+	endfunction
 
-        call search('\S', 'W')
-        if g:clojure_special_indent_words =~ '\<' . s:CurrentWord() . '\>'
-            return 1
-        endif
+	function! s:IsMethodSpecialCase(position)
+		let pos = getpos('.')
+		try
+			let val = s:ClojureIsMethodSpecialCaseWorker(a:position)
+		finally
+			call setpos('.', pos)
+		endtry
+		return val
+	endfunction
 
-        return 0
-    endfunction
+	function! GetClojureIndent()
+		" Get rid of special case.
+		if line(".") == 1
+			return 0
+		endif
 
-    function! s:IsMethodSpecialCase(position)
-        let pos = s:SavePosition()
-        try
-            let val = s:ClojureIsMethodSpecialCaseWorker(a:position)
-        finally
-            call s:RestorePosition(pos)
-        endtry
-        return val
-    endfunction
+		" We have to apply some heuristics here to figure out, whether to use
+		" normal lisp indenting or not.
+		let i = s:CheckForString()
+		if i > -1
+			return i + !!g:clojure_align_multiline_strings
+		endif
 
-    function! GetClojureIndent()
-        " Get rid of special case.
-        if line(".") == 1
-            return 0
-        endif
+		call cursor(0, 1)
 
-        " We have to apply some heuristics here to figure out, whether to use
-        " normal lisp indenting or not.
-        let i = s:CheckForString()
-        if i > -1
-            return i + !!g:clojure_align_multiline_strings
-        endif
+		" Find the next enclosing [ or {. We can limit the second search
+		" to the line, where the [ was found. If no [ was there this is
+		" zero and we search for an enclosing {.
+		let paren = s:MatchPairs('(', ')', 0)
+		let bracket = s:MatchPairs('\[', '\]', paren[0])
+		let curly = s:MatchPairs('{', '}', bracket[0])
 
-        call cursor(0, 1)
+		" In case the curly brace is on a line later then the [ or - in
+		" case they are on the same line - in a higher column, we take the
+		" curly indent.
+		if curly[0] > bracket[0] || curly[1] > bracket[1]
+			if curly[0] > paren[0] || curly[1] > paren[1]
+				return curly[1]
+			endif
+		endif
 
-        " Find the next enclosing [ or {. We can limit the second search
-        " to the line, where the [ was found. If no [ was there this is
-        " zero and we search for an enclosing {.
-        let paren = s:MatchPairs('(', ')', 0)
-        let bracket = s:MatchPairs('\[', '\]', paren[0])
-        let curly = s:MatchPairs('{', '}', bracket[0])
+		" If the curly was not chosen, we take the bracket indent - if
+		" there was one.
+		if bracket[0] > paren[0] || bracket[1] > paren[1]
+			return bracket[1]
+		endif
 
-        " In case the curly brace is on a line later then the [ or - in
-        " case they are on the same line - in a higher column, we take the
-        " curly indent.
-        if curly[0] > bracket[0] || curly[1] > bracket[1]
-            if curly[0] > paren[0] || curly[1] > paren[1]
-                return curly[1]
-            endif
-        endif
+		" There are neither { nor [ nor (, ie. we are at the toplevel.
+		if paren == [0, 0]
+			return 0
+		endif
 
-        " If the curly was not chosen, we take the bracket indent - if
-        " there was one.
-        if bracket[0] > paren[0] || bracket[1] > paren[1]
-            return bracket[1]
-        endif
+		" Now we have to reimplement lispindent. This is surprisingly easy, as
+		" soon as one has access to syntax items.
+		"
+		" - Check whether we are in a special position after a word in
+		"   g:clojure_special_indent_words. These are special cases.
+		" - Get the next keyword after the (.
+		" - If its first character is also a (, we have another sexp and align
+		"   one column to the right of the unmatched (.
+		" - In case it is in lispwords, we indent the next line to the column of
+		"   the ( + sw.
+		" - If not, we check whether it is last word in the line. In that case
+		"   we again use ( + sw for indent.
+		" - In any other case we use the column of the end of the word + 2.
+		call cursor(paren)
 
-        " There are neither { nor [ nor (, ie. we are at the toplevel.
-        if paren == [0, 0]
-            return 0
-        endif
+		if s:IsMethodSpecialCase(paren)
+			return paren[1] + &shiftwidth - 1
+		endif
 
-        " Now we have to reimplement lispindent. This is surprisingly easy, as
-        " soon as one has access to syntax items.
-        "
-        " - Check whether we are in a special position after a word in
-        "   g:clojure_special_indent_words. These are special cases.
-        " - Get the next keyword after the (.
-        " - If its first character is also a (, we have another sexp and align
-        "   one column to the right of the unmatched (.
-        " - In case it is in lispwords, we indent the next line to the column of
-        "   the ( + sw.
-        " - If not, we check whether it is last word in the line. In that case
-        "   we again use ( + sw for indent.
-        " - In any other case we use the column of the end of the word + 2.
-        call cursor(paren)
+		" In case we are at the last character, we use the paren position.
+		if col("$") - 1 == paren[1]
+			return paren[1]
+		endif
 
-        if s:IsMethodSpecialCase(paren)
-            return paren[1] + &shiftwidth - 1
-        endif
+		" In case after the paren is a whitespace, we search for the next word.
+		call cursor(0, col('.') + 1)
+		if s:CurrentChar() == ' '
+			call search('\v\S', 'W')
+		endif
 
-        " In case we are at the last character, we use the paren position.
-        if col("$") - 1 == paren[1]
-            return paren[1]
-        endif
+		" If we moved to another line, there is no word after the (. We
+		" use the ( position for indent.
+		if line(".") > paren[0]
+			return paren[1]
+		endif
 
-        " In case after the paren is a whitespace, we search for the next word.
-        normal! l
-        if s:CurrentChar() == ' '
-            normal! w
-        endif
+		" We still have to check, whether the keyword starts with a (, [ or {.
+		" In that case we use the ( position for indent.
+		let w = s:CurrentWord()
+		if stridx('([{', w[0]) > -1
+			return paren[1]
+		endif
 
-        " If we moved to another line, there is no word after the (. We
-        " use the ( position for indent.
-        if line(".") > paren[0]
-            return paren[1]
-        endif
+		" Test words without namespace qualifiers and leading reader macro
+		" metacharacters.
+		"
+		" e.g. clojure.core/defn and #'defn should both indent like defn.
+		let ww = substitute(w, "\\v%(.*/|[#'`~@^,]*)(.*)", '\1', '')
 
-        " We still have to check, whether the keyword starts with a (, [ or {.
-        " In that case we use the ( position for indent.
-        let w = s:CurrentWord()
-        if stridx('([{', w[0]) > -1
-            return paren[1]
-        endif
+		if &lispwords =~ '\V\<' . ww . '\>'
+			return paren[1] + &shiftwidth - 1
+		endif
 
-        " Test words without namespace qualifiers and leading reader macro
-        " metacharacters.
-        "
-        " e.g. clojure.core/defn and #'defn should both indent like defn.
-        let ww = substitute(w, "\\v%(.*/|[#'`~@^,]*)(.*)", '\1', '')
+		if g:clojure_fuzzy_indent
+			\ && !s:MatchesOne(g:clojure_fuzzy_indent_blacklist, ww)
+			\ && s:MatchesOne(g:clojure_fuzzy_indent_patterns, ww)
+			return paren[1] + &shiftwidth - 1
+		endif
 
-        if &lispwords =~ '\V\<' . ww . '\>'
-            return paren[1] + &shiftwidth - 1
-        endif
+		call search('\v\_s', 'cW')
+		call search('\v\S', 'W')
+		if paren[0] < line(".")
+			return paren[1] + &shiftwidth - 1
+		endif
 
-        if g:clojure_fuzzy_indent
-            \ && !s:MatchesOne(g:clojure_fuzzy_indent_blacklist, ww)
-            \ && s:MatchesOne(g:clojure_fuzzy_indent_patterns, ww)
-            return paren[1] + &shiftwidth - 1
-        endif
+		call search('\v\S', 'bW')
+		return virtcol(".") + 1
+	endfunction
 
-        normal! W
-        if paren[0] < line(".")
-            return paren[1] + &shiftwidth - 1
-        endif
-
-        normal! ge
-        return virtcol(".") + 1
-    endfunction
-
-    setlocal indentexpr=GetClojureIndent()
+	setlocal indentexpr=GetClojureIndent()
 
 else
 
-    " In case we have searchpairpos not available we fall back to
-    " normal lisp indenting.
-    setlocal indentexpr=
-    setlocal lisp
-    let b:undo_indent .= '| setlocal lisp<'
+	" In case we have searchpairpos not available we fall back to
+	" normal lisp indenting.
+	setlocal indentexpr=
+	setlocal lisp
+	let b:undo_indent .= '| setlocal lisp<'
 
 endif
 
@@ -390,9 +381,8 @@
 
 " Exception handling
 setlocal lispwords+=catch
-setlocal lispwords+=try " For aesthetics when enclosing single line
 
 let &cpo = s:save_cpo
 unlet! s:save_cpo
 
-" vim:sts=4 sw=4 et:
+" vim:sts=8:sw=8:ts=8:noet
