diff options
author | Bram Moolenaar <Bram@vim.org> | 2012-01-20 21:08:56 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2012-01-20 21:08:56 +0100 |
commit | 6be7f8733f34333ed75f6e39425d73a6b2644379 (patch) | |
tree | 59ae0f289e6bfaaf3ed2e8ac5dcedb69e5656c01 /runtime/ftplugin/erlang.vim | |
parent | 90b280059fd51790105ff2e433303be58d58c430 (diff) |
Update runtime files.
Diffstat (limited to 'runtime/ftplugin/erlang.vim')
-rw-r--r-- | runtime/ftplugin/erlang.vim | 150 |
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() |