diff options
Diffstat (limited to 'runtime/ftplugin/erlang.vim')
-rw-r--r-- | runtime/ftplugin/erlang.vim | 144 |
1 files changed, 36 insertions, 108 deletions
diff --git a/runtime/ftplugin/erlang.vim b/runtime/ftplugin/erlang.vim index 4899020f85..af4e910b25 100644 --- a/runtime/ftplugin/erlang.vim +++ b/runtime/ftplugin/erlang.vim @@ -1,10 +1,10 @@ " Vim ftplugin file " Language: Erlang -" Author: Oscar Hellström <oscar@oscarh.net> -" Contributors: Ricardo Catalinas Jiménez <jimenezrick@gmail.com> +" 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 +" Version: 2012/01/25 if exists('b:did_ftplugin') finish @@ -27,13 +27,10 @@ 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 +let s:erlang_fun_begin = '^\a\w*(.*$' +let s:erlang_fun_end = '^[^%]*\.\s*\(%.*\)\?$' +function s:SetErlangOptions() if g:erlang_folding setlocal foldmethod=expr setlocal foldexpr=GetErlangFold(v:lnum) @@ -47,104 +44,35 @@ function s:SetErlangOptions() 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 +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 + +function ErlangFoldText() + let line = getline(v:foldstart) + let foldlen = v:foldend - v:foldstart + 1 + let lines = ' ' . foldlen . ' lines: ' . substitute(line, "[\ \t]*", '', '') + if foldlen < 10 + let lines = ' ' . lines + endif + let retval = '+' . v:folddashes . lines + + return retval +endfunction call s:SetErlangOptions() |