Enjoying Open Source Software

Sort your Ledger journal with Emacs

Ledger for plain text accounting

Ledger is an open source powerful, double-entry accounting system that you access from the command line.

It is the original form of plain text accounting.

The advantages of plain text accounting are:

  • plain text format, so you can use your favorite editor
  • makes it easy to create scripts to minimize the amount of work
  • excellent for usage with a version control system
  • completely transparent to the user, no "black box" doing incomprehensible things
  • light weight application
  • open source, so no vendor lock in
  • works fine on BSD and Linux

See also the Wikipedia page on Ledger.

Even if you have no legal obligation to register your financial transactions in an accounting system, you can benefit from using Legder.

It is easy to setup, doesn't take much time to maintain and gives you a very good insight in what you have spent your money on.

Version control

For version control I have developed the habit to use a combination of RCS and Git.

RCS is an old revision control system, that works only on local files. I use this as a safety-net. During my work I frequently commit the changes in the journal in RCS. This gives me a number of save-points, I can revert to, in case this might be necessary.

When everything is OK, I commit the changes to Git. This way, my Git repository is not clobbered with small changes, correction of errors and so on.

I use this method for almost anything I write, including my ledger journal.

Emacs cooperates very well with RCS. The default key binding for this is C-x v v (vc-next-action). Hit this to rotate through check in and check out. Log entries are stored with C-c C-c (vc-finish-logentry).

In case you want to rename a file that is under the control of RCS, use M-x vc-rename-file.


At the start of the new year it is time to close to books on the previous year.

To minimize the amount of work I start with downloading a CSV file with the bank-account transactions.

A simple Perl-script creates a ledger journal from this CSV file.

A shell script creates ledger journal entries from my outgoing invoices. These invoices are in Postscript, the shell script combines a mixture of grep, awk and ed.

After a concatenate of the invoice journal entries to the bank-account transaction journal entries, the only thing left to do, is to sort the ledger journal in chronological order.

For this, the Emacs ledger-mode works great!

Ledger journal sorted by date

I have named my journal 2021.ledger.

In Emacs I have set the variable ledger-default-date-format to "%Y-%m-%d", which results in YYYY-MM-DD as the date of the records.

This is the workflow:

  • open 2021.ledger in Emacs
  • Emacs recognizes the format and activates ledger-mode
  • C-x h (mark-whole-buffer) marks the entire buffer as active region
  • C-c C-s sorts the journal entries in chronological order

Ledger-mode can do much more, I use only a fraction of its possibilities.

See also the ledger-mode page at