aboutsummaryrefslogtreecommitdiffstats
path: root/autoload/beancount.vim
diff options
context:
space:
mode:
authorNathan Grigg2014-10-07 10:59:11 -0700
committerNathan Grigg2014-10-07 10:59:11 -0700
commitbdc0374f49d32dd7a996113fc49d6abee2a50b24 (patch)
treeba44baa67ea2aaa8159e13fc7f2ff317b067397c /autoload/beancount.vim
parentf8177b09626a0ac973912c633d95b604b9024371 (diff)
downloadvim-beancount-bdc0374f49d32dd7a996113fc49d6abee2a50b24.tar.gz
AlignCommodity and Incoming
Diffstat (limited to 'autoload/beancount.vim')
-rw-r--r--autoload/beancount.vim38
1 files changed, 38 insertions, 0 deletions
diff --git a/autoload/beancount.vim b/autoload/beancount.vim
new file mode 100644
index 0000000..85adc3e
--- /dev/null
+++ b/autoload/beancount.vim
@@ -0,0 +1,38 @@
+" Align currency on decimal point.
+function! beancount#align_commodity(line1, line2)
+ " Saving cursor position to adjust it if necessary.
+ let cursor_col = col('.')
+ let cursor_line = line('.')
+ " This matches the line up to the first dot (or other separator),
+ " excluding comments.
+ " Note very nomagic so that the separator is not interpreted as regex.
+ let separator_regex = '^\V\[^;]\{-}' . g:beancount_decimal_separator
+ " This lets me increment at start of loop, because of continue statements.
+ let i = a:line1 - 1
+ while i < a:line2
+ let i += 1
+ let s = getline(i)
+ " This matches an account name followed by a space. There may be
+ " some conflicts with non-transaction syntax that I don't know about.
+ " It won't match a comment or any non-indented line.
+ let end_acc = matchend(s, '^\v([-\d]+\s+(balance|price))? +\S+ ')
+ if end_acc < 0 | continue | endif
+ " Where does commodity amount begin?
+ let end_space = matchend(s, '^ *', end_acc)
+ " Find the first decimal point, not counting comments.
+ let separator = matchend(s, separator_regex, end_space)
+ if separator < 0
+ " If there is no separator, pretend there's one after the last digit.
+ let separator = matchend(s, '^\v[^;]*\d+') + 1
+ endif
+ if separator < 0 | continue | endif
+ let has_spaces = end_space - end_acc
+ let need_spaces = g:beancount_separator_col - separator + has_spaces
+ if need_spaces < 0 | continue | endif
+ call setline(i, s[0 : end_acc - 1] . repeat(" ", need_spaces) . s[ end_space : -1])
+ if i == cursor_line && cursor_col >= end_acc
+ " Adjust cursor position for continuity.
+ call cursor(0, cursor_col + need_spaces - has_spaces)
+ endif
+ endwhile
+endfunction