上大学后不久我开始用挖财记帐,当时记得很随意,不会去追究一些不知道花在哪里的钱,不时就要强行修正帐户余额,就这么一直用到了2019年中。后来挖财的启动时间愈来愈长,同时我不想看启动时的广告,便动了换记帐软件的念头。html
本想着试试MoneyWiz,但其价格使人望而却步,因而决定继续物色免费的记帐工具,不久便遇到了GnuCash。因为它是GNU出品的,让我对其一开始便比较有好感,加上想尝试一下复式记帐,便在同年9月份换到了GnuCash上。git
惋惜好景不长,我很快便发现了GnuCash的不足:github
因而我抛弃了GnuCash,投向了ledger(以及ledger-mode)的怀抱。shell
ledger是一个基于复式记帐的、生成财务报表的命令行程序——它不具有录入的功能,它只生成报表。微信
要使用ledger,必须先将交易数据按它的语法写在一个文本文件中,而后才用ledger读取这个文件,生成各类各样的报表。百闻不如一见,下图即是ledger生成的报表编辑器
记录交易数据的源文件是纯文本格式的,能够用任何文本编辑器(text editor,不是word processor)来编辑。若是打算用Emacs,那么就不容错过ledger-mode了。工具
ledger-mode是一个Emacs主模式,为编辑ledger的源文件(通常以ledger
为后缀名)提供诸多便利。ui
好比在上图中,ledger提供了语法高亮:日期(2020-03-04
)和描述(利口福
)是红色的,金额(-32
)和货币(CNY
)是紫色的,注释(分号及其后面的内容)是灰色的。ledger-mode还提供自动缩进,在输入了利口福
并回车后,光标会自动定位到字母L
的位置,下一行也是如此——连续敲入两个回车获得一行空行,标志着一笔交易记录结束。ledger-mode还支持在Emacs内查看ledger输出的报表(见下文)。spa
用ledger记帐至少有如下优点:命令行
Assets
帐户下细分了Checking
和Investment
子帐户分别囊括消费和投资帐户;Checking
下细分了三个储蓄卡、微信零钱,及支付宝余额帐户;Investment
下细分了Fund
和WMP
,分别表示基金和银行理财产品;Expense
下有一个Food
,从上面的截图中能够看到,Food
下进一步分了十个子帐户——只要愿意,就能够随意定制帐户名称和层级;:公司:
的tag后,即可以让ledger只生成在公司就餐的支出报表;用ledger记帐,要先初始化每一个帐户的余额。基于复式记帐的原则,ledger要求每一笔交易中全部帐户的金额变化之和为0,所以若要往储蓄卡资产帐户中“充值”,就必须从另外一个帐户中减去等额的钱。在ledger中,这个“另外一个帐户”即是Equity
。(在ledger的在线文档中有一个章节Understanding Equity能够帮助理解)。
因此,初始化帐户余额就是添加一笔交易,将与帐户余额等量的钱从Equity:Opening Balance
流到Assets
下的细分帐户中,以下图所示
尽管在上图中,金额123
后的货币为CNY
,但ledger并不理解这三个字母是否真的为合法的货币名称——ledger只要求用户指定了便可。(能够参见ledger在线文档的Commodities and Currencies章节)
PS:在上图中没有明确写出Equity:Opening Balance
的变化为-123 CNY
,是由于ledger足够“聪明”,能够本身补足这个信息。
如今能够用ledger输出报表了
有了钱即可以开始买买买了。假设早餐在楼下肠粉店花了6块钱吃了一份鸡蛋肠,能够记为
用ledger输出新的资产报表
还能够用ledger输出支出帐户的明细,示例代码为
ledger -f a.ledger register 'Expense'
除了查看资产余额和支出明细以外,我经常使用的报表还包括:
ledger -f a.txt balance ^assets and \( not 公积金 \) or ^liabilities
,查看不含公积金的资产和负债的余额,主要用于核对帐本(a.txt
文件)与银行卡、信用卡余额是否一致;ledger -S '-date' -f ~/Dropbox/Accounting/a.txt register Liabilities
,查看信用卡的交易明细,用于在帐单日核对银行的信用卡帐单明细。参数-S 'date'表示按日期由近及远、从上往下排序
;ledger -e 10/01 -f a.txt balance '^Asset' and \( not '公积金' \) or '^Liabilities'
,统计至上月末为止的净资产(资产减去负债),用于了解本身的资产是上升仍是降低的趋势。参数-e 10/01
表示计算范围截止于10月1日——每次运行时须要调整为本月一号;ledger -b 11/01 -e 11/30 -f a.txt balance '^Expense:Food'
,统计上个月在用餐方面的总支出,用于核对上个月的饮食开支是否超支。参数-b 11/01
表示计算范围开始于11月1日——每次运行时须要调整为上个月一号。ledger-mode容许用户直接在Emacs中查看报表:先按下组合键C-c C-o C-r
,而后在minibuffer中输入报表名称,最后输入完整的调用ledger的命令便可。Emacs会打开一个新的buffer展现ledger的输出
ledger中划分帐户的自由度很高,如下是我划分的一部分,供读者参考。
首先按照ledger在线文档的Structuring your Accounts的要求,划分出五个顶层的帐户:
Assets
,表示用户的资产;Equity
,用于初始化时做为帐户余额的来源;Expense
,表示用户的支出;Income
,表示用户的收入;Liabilities
,表示用户的负债。在Assets
帐户下,我还划分了
Assets:Checking
,表示用于消费的帐户,其下还划分了储蓄卡帐户、微信零钱、支付宝余额帐户;Assets:Investment:Fund
,表示购买的基金,其下为不一样的基金划分不一样的帐户;Assets:Investment:WMP
,表示购买的理财产品,其下按理财产品代号划分不一样的帐户。在Expense
帐户下,我细分了:
Expense:Clothes
,表示衣服鞋饰的支出;Expense:Education
,表示书籍、文具的支出;Expense:Entertainment
,表示电影、游戏等娱乐方面的支出;Expense:Food
,表示买菜、就餐方面的支出。还有其它的许多帐户,就不一一赘述了。