diff --git a/after/ftplugin/vim.vim b/after/ftplugin/vim.vim index bf9b6c6..96667a8 100644 --- a/after/ftplugin/vim.vim +++ b/after/ftplugin/vim.vim @@ -1,3 +1,48 @@ -setlocal foldmethod=marker " Mapping for Vim help of the word under cursor. nnoremap K :help <C-r><C-w><CR> + +setlocal foldmethod=expr +setlocal foldexpr=GetVimFold(v:lnum) + +" Regex for vim script blocks & markers {{{ +let s:vim_funciton_start = '^\s*fun\(c\(tion\)\=\)\=!\=\s\+.*#\=\w*(.*).*$' +let s:vim_function_end = '^\s*endfun\(c\(tion\)\=\)\=\s*$' + +let s:vim_if_start = '^\s*if\s*.*$' +let s:vim_if_end = '\s*en\(dif\)\=\s*$' + +let s:vim_while_start = '^\s*wh\(ile)\=\s*.*$' +let s:vim_while_end = '\s*endw\(hile\)\=\s*$' + +let s:vim_for_start = '^\s*for\s*.*$' +let s:vim_for_end = '\s*endfo\(r\)\=\s*$' + +let s:vim_try_start = '^\s*try\s*.*$' +let s:vim_try_end = '\s*endt\(ry\)\=\s*$' + +let s:vim_augroup_start = '^\s*aug\(roup\)\=\s*.*\(END\)\@<!$' +let s:vim_augroup_end = '^\s*aug\(roup\)\=\s*END\s*$' + +let s:vim_marker_start = '\s*".*{{{\s*$' +let s:vim_marker_end = '\s*".*}}}\s*$' +" }}} + +function! GetVimFold(lnum) + let l:line = getline(a:lnum) + + if l:line =~ s:vim_function_end || l:line =~ s:vim_if_end || + \ l:line =~ s:vim_while_end || l:line =~ s:vim_for_end || + \ l:line =~ s:vim_try_end || l:line =~ s:vim_augroup_end || + \ l:line =~ s:vim_marker_end + return "s1" + endif + + if l:line =~ s:vim_funciton_start || l:line =~ s:vim_if_start || + \ l:line =~ s:vim_while_start || l:line =~ s:vim_for_start || + \ l:line =~ s:vim_try_start || l:line =~ s:vim_augroup_start || + \ l:line =~ s:vim_marker_start + return 'a1' + endif + + return '=' +endfunction