Unconstant Conjunction A personal blog

Using hledger with ledger-mode

    10 February 2017 // tagged

Last summer I landed a few patches in Emacs’s ledger-mode that make it easier to use with alternative implementations of Ledger, such as hledger. Since the competing hledger-mode garnered some attention last week on Hacker News, I thought these new features might be worth highlighting to those interested in plain-text accounting in Emacs.

Why choose ledger-mode over hledger-mode?

ledger-mode is the original major mode for the Ledger file format, first penned by current Emacs maintainer and Ledger author John Wiegley himself. It’s generally less opinionated than the newer hledger-mode and is less tied to the specifics of hledger’s command line output, but each has some nice features the other lacks.

Unfortunately, up until last summer certain commands (such as register reports) expected command line flags that hledger lacks, and so several things were broken if you tried to use hledger to run your reports instead.

To summarise the changes, you can now use hledger pretty seamlessly by adding the following somewhere in your init.el file:

;; Required to use hledger instead of ledger itself.
(setq ledger-mode-should-check-version nil
      ledger-report-links-in-register nil
      ledger-binary-path "hledger")

If you write your own reports, you might also be interested in the new %(binary) format specifier (demo below), which will substitute in whatever you have set as the binary path. This makes it a little easier to switch back and forth, too.

Why use hledger at all?

Again, this is mostly a matter of taste, but hledger and Ledger do offer slightly different features. I’m particularly fond of hledger’s column format for periodic reports. I find it useful to compare expenses from one month to the next, and this makes it easy to do so.

For example, you could add the following to your ledger-reports:

("monthly expenses"
 (concat "%(binary) -f %(ledger-file) balance expenses"
         "--tree --no-total --row-total --average --monthly"))

It should produce output like the following:

Balance changes in 2016/12/01-2017/02/28:

               ||  2016/12  2017/01  2017/02    Total  Average 
===============++==============================================
 Expenses      || $1977.97 $1713.99 $1402.97 $5094.93 $1698.31 
   Bills       ||   $90.00   $90.00   $90.00  $270.00   $90.00 
     Internet  ||   $35.00   $35.00   $35.00  $105.00   $35.00 
     Phone     ||   $55.00   $55.00   $55.00  $165.00   $55.00 
   Cash        ||   $41.00   $27.50   $60.00  $128.50   $42.83 
   Food        ||  $549.21  $679.52  $443.09 $1671.82  $557.27 
     Dining    ||  $247.67  $302.31  $186.77  $736.75  $245.58 
     Groceries ||  $301.54  $377.21  $256.32  $935.07  $311.69 
   FunTimes    ||  $177.76  $210.21  $145.56  $533.53  $177.84 
   Misc        ||  $500.00   $86.76   $44.32  $631.08  $210.36 
     Books     ||        0   $34.99        0   $34.99   $11.66 
     Car       ||        0   $51.77   $44.32   $96.09   $32.03 
     Gifts     ||  $340.00        0        0  $340.00  $113.33 
     Travel    ||  $160.00        0        0  $160.00   $53.33 
   Rent        ||  $500.00  $500.00  $500.00 $1500.00  $500.00 
   Transit     ||  $120.00  $120.00  $120.00  $360.00  $120.00 

(No, this is not my real data.)

You can get ledger-mode on MELPA.

comments powered by Disqus