blob: cfc8aa68d00518359d71154d6bcdf7c4c803ac00 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
|
if exists("b:did_indent")
finish
endif
let b:did_indent = 1
setlocal indentexpr=GetBeancountIndent(v:lnum)
if exists("*GetBeancountIndent")
finish
endif
function! s:IsDirective(str)
return a:str =~ '\v^\s*(\d{4}-\d{2}-\d{2}|pushtag|poptag|option|plugin|include)'
endfunction
function! s:IsPost(str)
return a:str =~ '\v^\s*(Assets|Liabilities|Expenses|Equity|Income):'
endfunction
function! s:IsMetadata(str)
return a:str =~ '\v^\s*\w+:\s'
endfunction
function! s:IsTransaction(str)
" The final \S represents the flag (e.g. * or !).
return a:str =~ '\v^\s*\d{4}-\d{2}-\d{2}\s+(txn\s+)?\S(\s|$)'
endfunction
function GetBeancountIndent(line_num)
let this_line = getline(a:line_num)
let prev_line = getline(a:line_num - 1)
" Don't touch comments
if this_line =~ '\v^\s*;' | return -1 | endif
" This is a new directive or previous line is blank.
if prev_line =~ '^\s*$' || s:IsDirective(this_line) | return 0 | endif
" Previous line is transaction or this is a posting.
if s:IsTransaction(prev_line) || s:IsPost(this_line) | return &sw | endif
if s:IsMetadata(this_line)
let this_indent = indent(a:line_num - 1)
if ! s:IsMetadata(prev_line) | let this_indent += &sw | endif
return this_indent
endif
return -1
endfunction
|