程序員的記帳工具——ledger與ledger-mode

上大學後不久我開始用挖財記帳,當時記得很隨意,不會去追究一些不知道花在哪裏的錢,不時就要強行修正帳戶餘額,就這麼一直用到了2019年中。後來挖財的啓動時間愈來愈長,同時我不想看啓動時的廣告,便動了換記帳軟件的念頭。html

本想着試試MoneyWiz,但其價格使人望而卻步,因而決定繼續物色免費的記帳工具,不久便遇到了GnuCash。因爲它是GNU出品的,讓我對其一開始便比較有好感,加上想嘗試一下複式記帳,便在同年9月份換到了GnuCash上。git

惋惜好景不長,我很快便發現了GnuCash的不足:github

  1. 啓動速度隨着錄入數據的增多顯著變慢;
  2. UI不夠美觀;
  3. 比較依賴鼠標操做;
  4. 交易時間的精度只到天,且沒法輕鬆調整一筆交易的位置——這一點是我尤爲在乎的,由於着意味着一旦我有一筆交易漏記了,再追加回去後,整個帳本的交易數據次序也與銀行記錄的不一致了。

因而我拋棄了GnuCash,投向了ledger(以及ledger-mode)的懷抱。shell

ledger和ledger-mode

ledger

ledger是一個基於複式記帳的、生成財務報表的命令行程序——它不具有錄入的功能,它只生成報表。微信

要使用ledger,必須先將交易數據按它的語法寫在一個文本文件中,而後才用ledger讀取這個文件,生成各類各樣的報表。百聞不如一見,下圖即是ledger生成的報表編輯器

ledger-mode

記錄交易數據的源文件是純文本格式的,能夠用任何文本編輯器(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的優點

用ledger記帳至少有如下優點:命令行

  1. 交易數據保存在本地,有利於保護用戶的隱私;
  2. 交易數據保存爲純文本文件,用戶能夠依本身的喜愛選擇編輯工具(好比我就喜歡用Emacs),即便哪天ledger無法用了,這些數據也依舊能夠查看;
  3. ledger支持自由定製符合我的習慣的資產和支出的層級。例如,我在Assets帳戶下細分了CheckingInvestment子帳戶分別囊括消費和投資帳戶;Checking下細分了三個儲蓄卡、微信零錢,及支付寶餘額帳戶;Investment下細分了FundWMP,分別表示基金和銀行理財產品;Expense下有一個Food,從上面的截圖中能夠看到,Food下進一步分了十個子帳戶——只要願意,就能夠隨意定製帳戶名稱和層級;
  4. ledger支持給每一筆交易添加元數據,其中一種即是tag(標籤)。tag加強了ledger生成報表的靈活度,好比我給在公司點外賣的支出打上:公司:的tag後,即可以讓ledger只生成在公司就餐的支出報表;

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'

其它報表命令

除了查看資產餘額和支出明細以外,我經常使用的報表還包括:

  1. ledger -f a.txt balance ^assets and \( not 公積金 \) or ^liabilities,查看不含公積金的資產和負債的餘額,主要用於覈對帳本(a.txt文件)與銀行卡、信用卡餘額是否一致;
  2. ledger -S '-date' -f ~/Dropbox/Accounting/a.txt register Liabilities,查看信用卡的交易明細,用於在帳單日覈對銀行的信用卡帳單明細。參數-S 'date'表示按日期由近及遠、從上往下排序
  3. ledger -e 10/01 -f a.txt balance '^Asset' and \( not '公積金' \) or '^Liabilities',統計至上月末爲止的淨資產(資產減去負債),用於瞭解本身的資產是上升仍是降低的趨勢。參數-e 10/01表示計算範圍截止於10月1日——每次運行時須要調整爲本月一號;
  4. ledger -b 11/01 -e 11/30 -f a.txt balance '^Expense:Food',統計上個月在用餐方面的總支出,用於覈對上個月的飲食開支是否超支。參數-b 11/01表示計算範圍開始於11月1日——每次運行時須要調整爲上個月一號。

在Emacs中查看報表

ledger-mode容許用戶直接在Emacs中查看報表:先按下組合鍵C-c C-o C-r,而後在minibuffer中輸入報表名稱,最後輸入完整的調用ledger的命令便可。Emacs會打開一個新的buffer展現ledger的輸出

帳戶劃分方法

ledger中劃分帳戶的自由度很高,如下是我劃分的一部分,供讀者參考。

首先按照ledger在線文檔的Structuring your Accounts的要求,劃分出五個頂層的帳戶:

  1. Assets,表示用戶的資產;
  2. Equity,用於初始化時做爲帳戶餘額的來源;
  3. Expense,表示用戶的支出;
  4. Income,表示用戶的收入;
  5. Liabilities,表示用戶的負債。

Assets帳戶下,我還劃分了

  1. Assets:Checking,表示用於消費的帳戶,其下還劃分了儲蓄卡帳戶、微信零錢、支付寶餘額帳戶;
  2. Assets:Investment:Fund,表示購買的基金,其下爲不一樣的基金劃分不一樣的帳戶;
  3. Assets:Investment:WMP,表示購買的理財產品,其下按理財產品代號劃分不一樣的帳戶。

Expense帳戶下,我細分了:

  1. Expense:Clothes,表示衣服鞋飾的支出;
  2. Expense:Education,表示書籍、文具的支出;
  3. Expense:Entertainment,表示電影、遊戲等娛樂方面的支出;
  4. Expense:Food,表示買菜、就餐方面的支出。

還有其它的許多帳戶,就不一一贅述了。

閱讀原文

相關文章
相關標籤/搜索