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 '='