diff options
Diffstat (limited to '')
-rw-r--r-- | indent/org.vim | 137 |
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 |