summaryrefslogtreecommitdiffstats
path: root/runtime/ftplugin/erlang.vim
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2012-01-20 21:08:56 +0100
committerBram Moolenaar <Bram@vim.org>2012-01-20 21:08:56 +0100
commit6be7f8733f34333ed75f6e39425d73a6b2644379 (patch)
tree59ae0f289e6bfaaf3ed2e8ac5dcedb69e5656c01 /runtime/ftplugin/erlang.vim
parent90b280059fd51790105ff2e433303be58d58c430 (diff)
Update runtime files.
Diffstat (limited to 'runtime/ftplugin/erlang.vim')
-rw-r--r--runtime/ftplugin/erlang.vim150
1 files changed, 150 insertions, 0 deletions
diff --git a/runtime/ftplugin/erlang.vim b/runtime/ftplugin/erlang.vim
new file mode 100644
index 0000000000..4899020f85
--- /dev/null
+++ b/runtime/ftplugin/erlang.vim
@@ -0,0 +1,150 @@
+" Vim ftplugin file
+" Language: Erlang
+" Author: Oscar Hellström <oscar@oscarh.net>
+" Contributors: Ricardo Catalinas Jiménez <jimenezrick@gmail.com>
+" Eduardo Lopez (http://github.com/tapichu)
+" License: Vim license
+" Version: 2011/11/21
+
+if exists('b:did_ftplugin')
+ finish
+else
+ let b:did_ftplugin = 1
+endif
+
+if exists('s:did_function_definitions')
+ call s:SetErlangOptions()
+ finish
+else
+ let s:did_function_definitions = 1
+endif
+
+if !exists('g:erlang_keywordprg')
+ let g:erlang_keywordprg = 'erl -man'
+endif
+
+if !exists('g:erlang_folding')
+ let g:erlang_folding = 0
+endif
+
+" Local settings
+function s:SetErlangOptions()
+ compiler erlang
+ if version >= 700
+ setlocal omnifunc=erlang_complete#Complete
+ endif
+
+ if g:erlang_folding
+ setlocal foldmethod=expr
+ setlocal foldexpr=GetErlangFold(v:lnum)
+ setlocal foldtext=ErlangFoldText()
+ endif
+
+ setlocal comments=:%%%,:%%,:%
+ setlocal commentstring=%%s
+
+ setlocal formatoptions+=ro
+ let &l:keywordprg = g:erlang_keywordprg
+endfunction
+
+" Define folding functions
+if !exists('*GetErlangFold')
+ " Folding params
+ let s:erlang_fun_begin = '^\a\w*(.*$'
+ let s:erlang_fun_end = '^[^%]*\.\s*\(%.*\)\?$'
+ let s:erlang_blank_line = '^\s*\(%.*\)\?$'
+
+ " Auxiliary fold functions
+ function s:GetNextNonBlank(lnum)
+ let lnum = nextnonblank(a:lnum + 1)
+ let line = getline(lnum)
+ while line =~ s:erlang_blank_line && 0 != lnum
+ let lnum = nextnonblank(lnum + 1)
+ let line = getline(lnum)
+ endwhile
+ return lnum
+ endfunction
+
+ function s:GetFunName(str)
+ return matchstr(a:str, '^\a\w*(\@=')
+ endfunction
+
+ function s:GetFunArgs(str, lnum)
+ let str = a:str
+ let lnum = a:lnum
+ while str !~ '->\s*\(%.*\)\?$'
+ let lnum = s:GetNextNonBlank(lnum)
+ if 0 == lnum " EOF
+ return ''
+ endif
+ let str .= getline(lnum)
+ endwhile
+ return matchstr(str,
+ \ '\(^(\s*\)\@<=.*\(\s*)\(\s\+when\s\+.*\)\?\s\+->\s*\(%.*\)\?$\)\@=')
+ endfunction
+
+ function s:CountFunArgs(arguments)
+ let pos = 0
+ let ac = 0 " arg count
+ let arguments = a:arguments
+
+ " Change list / tuples into just one A(rgument)
+ let erlang_tuple = '{\([A-Za-z_,|=\-\[\]]\|\s\)*}'
+ let erlang_list = '\[\([A-Za-z_,|=\-{}]\|\s\)*\]'
+
+ " FIXME: Use searchpair?
+ while arguments =~ erlang_tuple
+ let arguments = substitute(arguments, erlang_tuple, 'A', 'g')
+ endwhile
+ " FIXME: Use searchpair?
+ while arguments =~ erlang_list
+ let arguments = substitute(arguments, erlang_list, 'A', 'g')
+ endwhile
+
+ let len = strlen(arguments)
+ while pos < len && pos > -1
+ let ac += 1
+ let pos = matchend(arguments, ',\s*', pos)
+ endwhile
+ return ac
+ endfunction
+
+ " Main fold function
+ function GetErlangFold(lnum)
+ let lnum = a:lnum
+ let line = getline(lnum)
+
+ if line =~ s:erlang_fun_end
+ return '<1'
+ endif
+
+ if line =~ s:erlang_fun_begin && foldlevel(lnum - 1) == 1
+ return '1'
+ endif
+
+ if line =~ s:erlang_fun_begin
+ return '>1'
+ endif
+
+ return '='
+ endfunction
+
+ " Erlang fold description (foldtext function)
+ function ErlangFoldText()
+ let foldlen = v:foldend - v:foldstart
+ if 1 < foldlen
+ let lines = 'lines'
+ else
+ let lines = 'line'
+ endif
+ let line = getline(v:foldstart)
+ let name = s:GetFunName(line)
+ let arguments = s:GetFunArgs(strpart(line, strlen(name)), v:foldstart)
+ let argcount = s:CountFunArgs(arguments)
+ let retval = '+' . v:folddashes . ' ' . name . '/' . argcount
+ let retval .= ' (' . foldlen . ' ' . lines . ')'
+ return retval
+ endfunction
+endif
+
+call s:SetErlangOptions()