It has been realy a long time since my last article. Anyway, I am here again. Now in Australia, I think I should start to write in English to expose the content to a broader scope of audience.

I have been using ledger for personal accounting for 10 months now. It amazes myself that I could persist in putting every cents spent down in the ledger file for such a long time.

Recently, I have got a ING Direct Visa Debit Card and like its idea of 2% of cash rebate for every Paywave transaction lower than AUD 100. It quickly comes now my default card for everything. However, it causes extra work during my updating ledger book, I am tired of regularly checking my bank account for updates of cash rebates so that I can insert them into the ledger book.

Luckily, Ultisnips has the functionality of using inline Python/Shell interpolation, and spending a little of time I got the problem solved.

global !p
def ing_paywave_rebate(amount):
    return round(float(amount) * 2.0 / 100, 2)
endglobal

snippet pay "Expense paid with ING Paywave"
${1:`date +%Y`}/${2:`date +%m`}/${3:`date +%d`} * ${4:Expense title}
    ${5:Expenses}:${6:Grocery}	    ${7:$} ${8:0}
    Income:INGRebate		$ -`!p snip.rv=ing_paywave_rebate(t[8])`
    Assets:ING:Everyday

endsnippet

The code is not difficult. The magic !p snip.rv= sentence tells Ultisnips here the return value of the field is set to be the result from a Python function. That’s it.

Now I can use pay to trigger this snippet, the rebate amount will be automatically populated when expense is input.