上大學後不久我開始用挖財記帳,當時記得很隨意,不會去追究一些不知道花在哪裏的錢,不時就要強行修正帳戶餘額,就這麼一直用到了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
,表示買菜、就餐方面的支出。還有其它的許多帳戶,就不一一贅述了。