summaryrefslogtreecommitdiffstats
path: root/ftplugin/cryptol/folding.vim
diff options
context:
space:
mode:
Diffstat (limited to 'ftplugin/cryptol/folding.vim')
-rw-r--r--ftplugin/cryptol/folding.vim50
1 files changed, 50 insertions, 0 deletions
diff --git a/ftplugin/cryptol/folding.vim b/ftplugin/cryptol/folding.vim
new file mode 100644
index 00000000..2b8ee5a3
--- /dev/null
+++ b/ftplugin/cryptol/folding.vim
@@ -0,0 +1,50 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'cryptol') == -1
+
+" Copyright © 2013 Edward O'Callaghan. All Rights Reserved.
+
+"setlocal foldmethod=indent
+"setlocal foldignore=
+
+setlocal foldmethod=expr
+setlocal foldexpr=GetPotionFold(v:lnum)
+
+" Helper function: To tackle non-blank lines,
+" wish to know their indentation level
+function! IndentLevel(lnum)
+ return indent(a:lnum) / &shiftwidth
+endfunction
+
+" Helper function: .
+function! NextNonBlankLine(lnum)
+ let numlines = line('$')
+ let current = a:lnum + 1
+
+ while current <= numlines
+ if getline(current) =~? '\v\S'
+ return current
+ endif
+
+ let current += 1
+ endwhile
+
+ return -2
+endfunction
+
+function! GetPotionFold(lnum)
+ if getline(a:lnum) =~? '\v^\s*$'
+ return '-1'
+ endif
+
+ let this_indent = IndentLevel(a:lnum)
+ let next_indent = IndentLevel(NextNonBlankLine(a:lnum))
+
+ if next_indent == this_indent
+ return this_indent
+ elseif next_indent < this_indent
+ return this_indent
+ elseif next_indent > this_indent
+ return '>' . next_indent
+ endif
+endfunction
+
+endif