summaryrefslogtreecommitdiff
path: root/contrib
diff options
context:
space:
mode:
authorJohann Klähn <kljohann@gmail.com>2011-07-31 17:12:51 +0200
committerJohann Klähn <kljohann@gmail.com>2011-07-31 17:39:02 +0200
commitecb5dac1da65551b47648a06e5f286319e22df3c (patch)
tree59afaea9a2c9f186909eeb8042291d61151e708e /contrib
parent24226c890ecf2d49cacd0c74e0eeee54341ad818 (diff)
downloadfork-ledger-ecb5dac1da65551b47648a06e5f286319e22df3c.tar.gz
fork-ledger-ecb5dac1da65551b47648a06e5f286319e22df3c.tar.bz2
fork-ledger-ecb5dac1da65551b47648a06e5f286319e22df3c.zip
vim. improve completion and cache invalidation
The completion cache for account names will be updated if there were no exact matches and the file was changed since the cache has been generated.
Diffstat (limited to 'contrib')
-rw-r--r--contrib/vim/ftplugin/ledger.vim51
1 files changed, 41 insertions, 10 deletions
diff --git a/contrib/vim/ftplugin/ledger.vim b/contrib/vim/ftplugin/ledger.vim
index dc285b72..87a7240e 100644
--- a/contrib/vim/ftplugin/ledger.vim
+++ b/contrib/vim/ftplugin/ledger.vim
@@ -69,7 +69,17 @@ endif
" A
" }}}
if !exists('g:ledger_detailed_first')
- let g:ledger_detailed_first = 0
+ let g:ledger_detailed_first = 1
+endif
+
+" only display exact matches (no parent accounts etc.)
+if !exists('g:ledger_exact_only')
+ let g:ledger_exact_only = 0
+endif
+
+" display original text / account name as completion
+if !exists('g:ledger_include_original')
+ let g:ledger_include_original = 0
endif
let s:rx_amount = '\('.
@@ -161,31 +171,51 @@ function! LedgerComplete(findstart, base) "{{{1
let b:compl_cache = s:collect_completion_data()
let b:compl_cache['#'] = changenr()
endif
+ let update_cache = 0
let results = []
if b:compl_context == 'account' "{{{2 (account)
- unlet! b:compl_context
let hierarchy = split(a:base, ':')
if a:base =~ ':$'
call add(hierarchy, '')
endif
let results = LedgerFindInTree(b:compl_cache.accounts, hierarchy)
- " sort by alphabet and reverse because it will get reversed one more time
+ let exacts = filter(copy(results), 'v:val[1]')
+
+ if len(exacts) < 1
+ " update cache if we have no exact matches
+ let update_cache = 1
+ endif
+
+ if g:ledger_exact_only
+ let results = exacts
+ endif
+
+ call map(results, 'v:val[0]')
+
if g:ledger_detailed_first
let results = reverse(sort(results, 's:sort_accounts_by_depth'))
else
let results = sort(results)
endif
- call insert(results, a:base)
elseif b:compl_context == 'description' "{{{2 (description)
- let results = [a:base] + s:filter_items(b:compl_cache.descriptions, a:base)
+ let results = s:filter_items(b:compl_cache.descriptions, a:base)
+
+ if len(results) < 1
+ let update_cache = 1
+ endif
elseif b:compl_context == 'new' "{{{2 (new line)
return [strftime('%Y/%m/%d')]
endif "}}}
+
+ if g:ledger_include_original
+ call insert(results, a:base)
+ endif
+
" no completion (apart from a:base) found. update cache if file has changed
- if len(results) <= 1 && b:compl_cache['#'] != changenr()
+ if update_cache && b:compl_cache['#'] != changenr()
unlet b:compl_cache
return LedgerComplete(a:findstart, a:base)
else
@@ -203,11 +233,12 @@ function! LedgerFindInTree(tree, levels) "{{{1
let currentlvl = a:levels[0]
let nextlvls = a:levels[1:]
let branches = s:filter_items(keys(a:tree), currentlvl)
+ let exact = empty(nextlvls)
for branch in branches
- call add(results, branch)
- if !empty(nextlvls)
- for result in LedgerFindInTree(a:tree[branch], nextlvls)
- call add(results, branch.':'.result)
+ call add(results, [branch, exact])
+ if ! empty(nextlvls)
+ for [result, exact] in LedgerFindInTree(a:tree[branch], nextlvls)
+ call add(results, [branch.':'.result, exact])
endfor
endif
endfor