summaryrefslogtreecommitdiffstats
path: root/indent
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--indent/org.vim137
1 files changed, 137 insertions, 0 deletions
diff --git a/indent/org.vim b/indent/org.vim
new file mode 100644
index 00000000..9eacb3a2
--- /dev/null
+++ b/indent/org.vim
@@ -0,0 +1,137 @@
+if !exists('g:polyglot_disabled') || index(g:polyglot_disabled, 'org') == -1
+
+" Delete the next line to avoid the special indention of items
+if !exists("g:org_indent")
+ let g:org_indent = 0
+endif
+
+setlocal foldtext=GetOrgFoldtext()
+setlocal fillchars-=fold:-
+setlocal fillchars+=fold:\
+setlocal foldexpr=GetOrgFolding()
+setlocal foldmethod=expr
+setlocal indentexpr=GetOrgIndent()
+setlocal nolisp
+setlocal nosmartindent
+setlocal autoindent
+
+if has('python3')
+ let s:py_env = 'python3 << EOF'
+else
+ let s:py_env = 'python << EOF'
+endif
+
+function! GetOrgIndent()
+ if g:org_indent == 0
+ return -1
+ endif
+
+exe s:py_env
+from orgmode._vim import indent_orgmode
+indent_orgmode()
+EOF
+
+ if exists('b:indent_level')
+ let l:tmp = b:indent_level
+ unlet b:indent_level
+ return l:tmp
+ else
+ return -1
+ endif
+endfunction
+
+function! GetOrgFolding()
+ let l:mode = mode()
+ if l:mode == 'i'
+ " the cache size is limited to 3, because vim queries the current and
+ " both surrounding lines when the user is typing in insert mode. The
+ " cache is shared between GetOrgFolding and GetOrgFoldtext
+ if ! exists('b:org_folding_cache')
+ let b:org_folding_cache = {}
+ endif
+
+ if has_key(b:org_folding_cache, v:lnum)
+ if match(b:org_folding_cache[v:lnum], '^>') == 0 &&
+ \ match(getline(v:lnum), '^\*\+\s') != 0
+ " when the user pastes text or presses enter, it happens that
+ " the cache starts to confuse vim's folding abilities
+ " these entries can safely be removed
+ unlet b:org_folding_cache[v:lnum]
+
+ " the fold text cache is probably also damaged, delete it as
+ " well
+ unlet! b:org_foldtext_cache
+ else
+ return b:org_folding_cache[v:lnum]
+ endif
+ endif
+
+ exe s:py_env
+from orgmode._vim import fold_orgmode
+fold_orgmode(allow_dirty=True)
+EOF
+ else
+
+ exe s:py_env
+from orgmode._vim import fold_orgmode
+fold_orgmode()
+EOF
+ endif
+
+ if exists('b:fold_expr')
+ let l:tmp = b:fold_expr
+ unlet b:fold_expr
+ if l:mode == 'i'
+ if ! has_key(b:org_folding_cache, v:lnum)
+ if len(b:org_folding_cache) > 3
+ let b:org_folding_cache = {}
+ endif
+ let b:org_folding_cache[v:lnum] = l:tmp
+ endif
+ endif
+ return l:tmp
+ else
+ return -1
+ endif
+endfunction
+
+function! SetOrgFoldtext(text)
+ let b:foldtext = a:text
+endfunction
+
+function! GetOrgFoldtext()
+ let l:mode = mode()
+ if l:mode == 'i'
+ " add a separate cache for fold text
+ if ! exists('b:org_foldtext_cache') ||
+ \ ! has_key(b:org_foldtext_cache, 'timestamp') ||
+ \ b:org_foldtext_cache['timestamp'] > (localtime() + 10)
+ let b:org_foldtext_cache = {'timestamp': localtime()}
+ endif
+
+ if has_key(b:org_foldtext_cache, v:foldstart)
+ return b:org_foldtext_cache[v:foldstart]
+ endif
+ exe s:py_env
+from orgmode._vim import fold_text
+fold_text(allow_dirty=True)
+EOF
+ else
+ unlet! b:org_foldtext_cache
+ exec s:py_env
+from orgmode._vim import fold_text
+fold_text()
+EOF
+ endif
+
+ if exists('b:foldtext')
+ let l:tmp = b:foldtext
+ unlet b:foldtext
+ if l:mode == 'i'
+ let b:org_foldtext_cache[v:foldstart] = l:tmp
+ endif
+ return l:tmp
+ endif
+endfunction
+
+endif