From 641d3a514ad71a4536a1e607005244fffc69c81c Mon Sep 17 00:00:00 2001 From: "Kenneth Benzie (Benie)" <benie@infektor.net> Date: Thu, 8 Sep 2016 22:57:01 +0100 Subject: [PATCH] Improve custom vim fold expression --- after/ftplugin/vim.vim | 59 ++++++++++++++++-------------------------- 1 file changed, 22 insertions(+), 37 deletions(-) diff --git a/after/ftplugin/vim.vim b/after/ftplugin/vim.vim index 96667a8..45f8943 100644 --- a/after/ftplugin/vim.vim +++ b/after/ftplugin/vim.vim @@ -1,47 +1,32 @@ " Mapping for Vim help of the word under cursor. nnoremap K :help <C-r><C-w><CR> +" Set custom fold expression setlocal foldmethod=expr -setlocal foldexpr=GetVimFold(v:lnum) +setlocal foldexpr=VimFold(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) +" Custom fold expresson folds control flow keywords and fold markers +function! VimFold(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' + if l:line =~ '^\s*fun\(c\(tion\)\=\)\=!\=\s\+.*#\=\w*(.*).*$' + \ || l:line =~ '^\s*if\s*.*$' + \ || l:line =~ '^\s*el\(se\)\=\s*.*$' + \ || l:line =~ '^\s*elseif\=\s*.*$' + \ || l:line =~ '^\s*wh\(ile\)\=\s*.*$' + \ || l:line =~ '^\s*for\s*.*$' + \ || l:line =~ '^\s*try\s*$' + \ || l:line =~ '^\s*cat\(ch\)\=\s*.*$' + \ || l:line =~ '^\s*fina\(lly\)\=\s*$' + \ || l:line =~ '\s*".*{{{\s*$' + return '>'.string((indent(a:lnum) / &shiftwidth) + 1) + elseif l:line =~ '^\s*endfun\(c\(tion\)\=\)\=\s*$' + \ || l:line =~ '^\s*en\(dif\)\=\s*$' + \ || l:line =~ '^\s*endw\(hile\)\=\s*$' + \ || l:line =~ '^\s*endfor\=\s*$' + \ || l:line =~ '^\s*endt\(ry\)\=\s*$' + \ || l:line =~ '\s*".*}}}\s*$' + return '<'.string((indent(a:lnum) / &shiftwidth) + 1) endif return '='