summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--doc/ledger-mode.texi587
-rw-r--r--test/input/demo.ledger63
2 files changed, 650 insertions, 0 deletions
diff --git a/doc/ledger-mode.texi b/doc/ledger-mode.texi
new file mode 100644
index 00000000..0dc487a2
--- /dev/null
+++ b/doc/ledger-mode.texi
@@ -0,0 +1,587 @@
+\input texinfo @c -*-texinfo-*-
+@setfilename ledger3.info
+@settitle Ledger: Command-Line Accounting
+
+@dircategory Major Modes
+@copying
+Copyright (c) 2013, Craig Earls. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+- Neither the name of New Artisans LLC nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+@end copying
+
+@documentencoding UTF-8
+
+@iftex
+@finalout
+@end iftex
+
+
+@titlepage
+@title Ledger Mode
+@subtitle Emacs Support For Version 3.0 of Ledger
+@author Craig Earls
+@end titlepage
+
+@direntry
+* Ledger Mode: (ledger-mode). Command-Line Accounting
+@end direntry
+
+@contents
+
+@ifnottex
+@node Top, Copying, (dir), (dir)
+@top Overview
+Ledger is a command line accounting tool that provides double-entry
+accounting based on a text journal. It provides no bells or whistles,
+and returns the user to the days before user interfaces were even a
+1twinkling in their father's CRT.
+
+Ledger Mode assists you in maintaining input files for Ledger, running
+reports and much more...
+@c @insertcopying
+@end ifnottex
+
+@menu
+* Copying::
+* Introduction to Ledger Mode::
+* The Ledger Buffer::
+* The Reconcile Buffer::
+* The Report Buffer::
+* Installing and Customizing Ledger-mode::
+* Hacking Ledger-mode::
+@end menu
+
+@node Copying, Introduction to Ledger Mode, Top, Top
+@chapter Copying
+@insertcopying
+
+@node Introduction to Ledger Mode, The Ledger Buffer, Copying, Top
+@chapter Introduction to Ledger Mode
+@menu
+* Quick installation::
+* Menus::
+* Quick Demo::
+@end menu
+
+@node Quick installation, Menus, Introduction to Ledger Mode, Introduction to Ledger Mode
+@section Quick Installation
+
+The emacs lisp source for Ledger-mode is included with the source
+distribution of Ledger. It is entirely included in the @file{lisp}
+subdirectory. To use ledger mode include the following in your emacs
+initialization file (@file{~/.emacs}, @file{~/.emacs.d/init.el},
+@file{~/.Aquamacs/Preferences.el}
+
+@smallexample
+(add-to-list 'load-path (expand-file-name "/path/to/ledger/source/lisp/"))
+(load "ldg-new")
+(add-to-list 'auto-mode-alist '("\\.ledger$" . ledger-mode))
+@end smallexample
+
+This sets up Emacs to automatically recognize files that end with
+@file{.ledger} and start Ledger mode. Nothing else should be required
+as long as the ledger command line utility is properly installed.
+
+@node Menus, Quick Demo, Quick installation, Introduction to Ledger Mode
+@section Menus
+
+The vast majority of Ledger-mode functionality is available from the
+Emacs menu system. The keystrokes are shown in the menu to help you
+learn the faster keyboard methods.
+
+@node Quick Demo, , Menus, Introduction to Ledger Mode
+@section Quick Demo
+
+Load the demo file @file{demo.ledger} from the Ledger source
+@file{test/input} directory. The ledger will be loaded and font
+highlighted. At this point you could manually edit transactions and run
+Ledger from a convenient command line.
+
+@menu
+* Quick Add::
+* Reconciliation::
+* Reports::
+* Folding::
+@end menu
+
+@node Quick Add, Reconciliation, Quick Demo, Quick Demo
+@subsection Quick Add
+
+As simple as the ledger transaction format is, it can still be daunting
+to add many transactions manually. Ledger provides two way to add
+transactions with minimal typing. Both are based on the idea that most
+tranactions are repretitions of earlier transactions.
+
+In the @file{demo.ledger} buffer enter a date using the correct
+format. The tpye the first few characters of another payee in the
+@file{demo.ledger} buffer. Type @code{C-c TAB}. Ledger-mode will
+search for a Payee that has the same beginning and copy the rest of the
+transaction to you new entry.
+
+Additionally you can ust the ledger xact command, by typing @code{C-c
+C-a} then typing a close match to the payee. Ledger mode will call
+@code{ledger xact} with the data you enter and place the transaction in
+the proper chronological place in the ledger.
+
+@node Reconciliation, Reports, Quick Add, Quick Demo
+@subsection Reconciliation
+
+The biggest task of maintaining a ledger is ensuring the it matches the
+outside world. This process is called reconciliation (@xref{Basics of
+Reconciliation}) and can be quite onerous. Ledger mode attempts to make
+it as painless as possible.
+
+In the @file{demo.ledger} buffer type @code{C-c C-r}. Emacs will prompt
+for an account to reconcile in the mini-buffer. Enter @code{Checking}.
+Emacs will then prompt for a target value. The target value is the
+amount you want the cleared transactions in the buffer to total.
+Normally this would be the ending value from your bank statement, or the
+latest value in your on-line transaction summary. Enter @code{1710}.
+Note that Ledger-mode assumes your are using $ (USD) as your default
+commodity, this can be easily changed in the customization
+variables. @xref{Ledger-mode Customization}
+
+You now see a list of uncleared transactions in a buffer below the
+@file{demo.ledger} buffer. Touching the space bar will mark a
+transaction as pending and display the current cleared (and pending)
+balance, along with the difference remaining to meet your target. Clear
+the first three transactions, and you will see the difference to target
+reach $0. End the reconcilitation by typing @code{C-c C-c}. This saves
+the demo.ledger buffer and marks the transactions and finally cleared.
+Type @code{q} to close out the reconciliation buffer.
+
+@node Reports, Folding, Reconciliation, Quick Demo
+@subsection Reports
+
+The real power of Ledger is in it reporting capabilities. Reports can
+be run and displayed in a spearate Emacs buffer. In the
+@file{demo.ledger} buffer, type @code{C-c C-o C-r}. In the mini-buffer
+Emacs will prompt for a report name. There are a few built-in reports,
+and you can add any report you need @xref{Adding New Reports}.
+
+In the mini-buffer type @code{account}. When prompted for an account
+type @code{checking}. In another buffer you will see a Ledger register
+report. You can move around the buffer, with the point on a transaction,
+type @code{C-c C-c}. Ledger mode will take you directly to that
+transaction in the @file{demo.ledger} buffer.
+
+Another built-in report is the balance report. In the
+@file{demo.ledger} buffer, type @code{C-c C-o C-r}. When prompted for a
+report to run, type @code{bal}, and a balance report of all accounts
+will be shown.
+
+@node Folding, , Reports, Quick Demo
+@subsection Folding
+
+A ledger file can get very large. It can be helpful to collapse the buffer
+to display only the transactions you are interested in. Ledger-mode
+copies the @code{occur} mode functionality. Typing @code{C-c C-f} and
+entering any regex in the mini-buffer will show only transactions that
+match the regex. The regex can be on any field, or amount.
+
+@node The Ledger Buffer, The Reconcile Buffer, Introduction to Ledger Mode, Top
+@chapter The Ledger Buffer
+@menu
+* Adding Transactions::
+* Editing Amounts::
+* Marking Transactions::
+* Deleting Transactions::
+* Sorting Transactions::
+* Hiding Transactions::
+@end menu
+
+@node Adding Transactions, Editing Amounts, The Ledger Buffer, The Ledger Buffer
+@section Adding Transactions
+
+Beyond the two ways of quickly adding transactions (@pxref{Quick Add})
+Ledger-mode assists you by providing robust @code{TAB} completion for
+payees and accounts. Ledger-mode will scan the existing buffer for
+payees and accounts. Included files are not currently included in the
+completion scan. Repeatedly hitting @code{TAB} will cycle through the
+possible completions.
+
+@node Editing Amounts, Marking Transactions, Adding Transactions, The Ledger Buffer
+@section Editing Amounts
+GNU Calc is a very powerful Reverse Polish Notation calculator built
+into all recent version of Emacs. Ledger-mode makes it easy to
+calculate values for amount by integrating GNU Calc. With the point
+anywhere in the same line as a posting, typing @code{C-c C-b} will
+bring up the Calc buffer, and push the current amount for the posting
+onto the top of the Calc stack. Perform any calculations you ened to
+arrive at the final vlaue, then type @code{y} to ynk the value at the
+top of stack back into the ledger buffer. Note: GNU Calc does not
+directly support commas as decimal separators. Ledger mode will
+translate values from decimal-comma format to decimal-period format for
+use in Calc, but it cannot intercept the value being yanked form the
+Calc stack, so decimal-comma users will have to manually replace the
+period with a comma.
+
+
+@node Marking Transactions, Deleting Transactions, Editing Amounts, The Ledger Buffer
+@section Marking Transactions
+Ledger considers transaction or posting to be in one of three states:
+uncleared, cleared, and pending. For calculation Ledger ignores these
+states unless specifically instructed to use them. Ledger-mode assigns
+some additional meaning to the states:
+@itemize
+@item Uncleared.
+No state. This is equivalent to sticking a check in the mail. It has
+been obligated, but not been cashed by the recipient. It could also
+apply to credit/debit card transactions that have not been cleared into
+your account balance. You bank may call these transactions 'pending',
+but Ledger-mode usues a slightly different meaning.
+@item Pending.
+Ledger-mode's reconciliation function see pending transactions as an
+intermediate step in reconciling an account. When doing a
+reconciliation (@pxref{Reconciliation}), marking a transaction as
+pending means that you have seen the transaction finally recorded by the
+recipient, but you have not completely reconciled the account.
+@item Cleared.
+The transaction has been completely recognized by all parties to the transaction.
+@end itemize
+
+Clearing complete transactions is done by typing @code{C-c C-e} with
+point in a transaction. This places an asterisk (@code{*}) after the
+date. Clearing individual postings is done by typing @code{C-c C-c}
+while in a posting. This places an asterisk prior to the posting.
+
+@node Deleting Transactions, Sorting Transactions, Marking Transactions, The Ledger Buffer
+@section Deleting Transactions
+Along with normal buffer editing methods to delete text, Ledger mode
+provides an easy way to delete the transaction under point: @code{C-c
+C-d}. The advantage to using this method is that the complete
+transaction operation is in the undo buffer.
+
+@node Sorting Transactions, Hiding Transactions, Deleting Transactions, The Ledger Buffer
+@section Sorting Transactions
+
+As you operating on the Ledger files, they may become disorganized. For
+the most part, Ledger doesn't care, but our human brains prefer a bit of
+order. Sorting the transactions in a buffer into chronological order
+can help bring order to chaos. Ledger sort (@code C-c C-s) will sort
+all of the transactions in a region by date. Ledger-mode isn't
+particularly smart about handling dates and it simply sorts the
+transactions using the string at the beginning of the transaction. So,
+you should use the preferred ISO 8601 standard date format @code{YYYY/MM/DD}
+which easily sorts.
+
+Note, there is a menu entry to sort the entire buffer. Special
+transactions like automated transactsion, will be moved in the sorting
+process and may not fucntion correctly afterwards. For this reason
+there is no key sequence.
+
+@node Hiding Transactions, , Sorting Transactions, The Ledger Buffer
+@section Hiding Transactions
+
+Ofen times you will want to run Ledger register reports just to look at
+a specific set of transactions. If you don't need the running total
+calculation hadnled by Ledger, Ledger-mode provides a rapid way of
+narrowing what is displayed in the buffer in a way that is sipler than
+the Ledger register command.
+
+Based on the Emacs Occur mode by Alexey Veretennikov, Ledger-occur hides
+all transactions that do NOT meet a specific regular expression. The
+regular expression can match on any part of the transaction. If you
+want to find all transactions whose amount ends in .37, you can do that
+( I don't know why, but hey, whatever ever flaots you aerostat).
+
+Using @code(C-c C-f) or the @code{Hide Xacts} menu entry, enter a
+regualr expression in the minbuffer. Ledger-mode will hide all oter
+transactions. For details of the regualr expression syntax, see the
+Emacs Manual or the Emac Elisp Reference Manual. A few examples using
+the @file{demo.ledger} are given here:
+
+@table @samp
+@item Groceries
+Show only transactions that have a posting to the `Groceries' account.
+@item ^2011/01
+Show only transactions occuring in January of 2011.
+@item ^2011/.*/25
+Show only transactions occuring on the 25th of the month in 2011
+@item .*ore
+Show only transaction with payeees or accounts ending in `ore'
+@end table
+
+To show all transactions simply invoke @code{Hide Xacts} or @code{C-c
+C-f} again.
+
+@node The Reconcile Buffer, The Report Buffer, The Ledger Buffer, Top
+@chapter The Reconcile Buffer
+@menu
+* Basics of Reconciliation::
+* Starting a Reconciliation::
+* Mark Transactions Pending::
+* Edit Transactions During Reconciliation::
+* Finialize Reconciliation::
+* Adding and Deleting Transactions during Reconciliation::
+* Changing Reconciliation Account::
+* Changing Reconciliation Target::
+@end menu
+
+@node Basics of Reconciliation, Starting a Reconciliation, The Reconcile Buffer, The Reconcile Buffer
+@section Basics of Reconciliation
+
+Even in this relativley modern era, financial transactions do not happen
+instantaneously, unless you are paying cash. When you swipe your debit
+card the money may take several days to actually come out of your
+account, or a check may take several days to ``clear''. That is the
+root of the difference between ``obligating'' funds and ``expending''
+funds. Obligation says you have agreed to pay it, the expnediture
+doesn't happen until the money actually leaves your account. Or in the
+case of receiving payment, you have an account receivable until the
+money has actually made it to you.
+
+After an account has been reconciled you have verified that all the
+transactions in that account have been correctly recorded and all
+parties agree.
+
+@node Starting a Reconciliation, Mark Transactions Pending, Basics of Reconciliation, The Reconcile Buffer
+@section Starting a Reconciliation
+
+To start reconciling an account you must have a target, both the
+transactions that you know about and the transactions the bank knows
+about. You can get this from a monthly statement, or from checking your
+online transaction history. It also helps immensely to know the final
+cleared balance you are aiming for.
+
+Use menu @code{Reconcile Account} or @code{C-c C-r} and enter the
+account you wish to reconcile in the mini-buffer. Ledger-mode is not
+particular about what you enter for the account. You can leave it blank
+and Reconcile Mode will show you ALL uncleared transactions. After you
+enter the account enter the target amount. Ledger expects you to enter
+an amount with a commodity. It assumes initially that you are using $
+(USD) as your default commodity. If you are working in a difference
+currency you can change the default in variable
+@code(ledger-reconcile-default-commodity) to whatever you need. If you
+work in multiple commodities simply enter the commoditized amount (for
+example @code{340 VSDX}, for 340 shares of VSDX).
+
+Ledger-mode reconcile cannot currently reconcile accounts the have
+multiple commodities, such as brokerage accounts. You may use
+reconciliation mode to clear transactions, but balance calculations will
+not display the complete list of commodities.
+
+@node Mark Transactions Pending, Edit Transactions During Reconciliation, Starting a Reconciliation, The Reconcile Buffer
+@section Mark Transactions Pending
+
+The @file{*Reconcile*} buffer will show all the uncleared transactions
+that meeting the criteria set in the regex. By default uncleared
+transactions are shown in red. When you have verified that a
+transaction ahs been correctly and compeltely recorded by the opposing
+party, mark the transaction as pending using the space bar. Continue
+this process until you agree with the opposing party and the difference
+from your target is zero.
+
+@node Edit Transactions During Reconciliation, Finialize Reconciliation, Mark Transactions Pending, The Reconcile Buffer
+@section Edit Transactions during Reconciliation
+
+If you find errors during reconciliation. You can visit the transaction
+under point in the @file{*Reconcile*} buffer by hitting the @code{enter}
+key. This will take you to the transaction in the Ledger buffer. When
+you have finished editing the transaction saving the buffer will
+automatically return you to the @file{*Reconcile*} buffer and you can
+mark the transaction if appropriate.
+
+@node Finialize Reconciliation, Adding and Deleting Transactions during Reconciliation, Edit Transactions During Reconciliation, The Reconcile Buffer
+@section Finalize Reconciliation
+
+Once you have marked all transactions as pending and the cleared balance
+is correct. Finish the reconciliation by typing @code{C-c C-c}. This
+marks all pending transaction as cleared and saves the ledger buffer.
+
+@node Adding and Deleting Transactions during Reconciliation, Changing Reconciliation Account, Finialize Reconciliation, The Reconcile Buffer
+@section Adding and Deleting Transactions during Reconciliation
+
+While reconciling, you may find new transactions that need to be entered
+into your ledger. Simply type @code{a} to bring up the quick add for
+the ledger buffer.
+
+Typing @code{d} will delete the transaction under point in the
+@file{*Reconcile*} buffer form the ledger buffer.
+
+@node Changing Reconciliation Account, Changing Reconciliation Target, Adding and Deleting Transactions during Reconciliation, The Reconcile Buffer
+@section Changing Reconciliation Account
+
+You can conveniently switch the account being reconciled by typing
+@code{g}, and entering a new account to reconcile. This simply restarts
+teh reconcile process. Any transactions that were marked `pending' in
+the ledger buffer are left in that state when the account is switched.
+
+@node Changing Reconciliation Target, , Changing Reconciliation Account, The Reconcile Buffer
+@section Changing Reconciliation Target
+
+If for some reason during reconciliation your target amount changes,
+type @code{t} and enter the new target value.
+
+
+@node The Report Buffer, Installing and Customizing Ledger-mode, The Reconcile Buffer, Top
+@chapter The Report Buffer
+@menu
+* Running Basic Reports::
+* Adding and Editing Reports::
+* Reversing Report Order::
+@end menu
+
+@node Running Basic Reports, Adding and Editing Reports, The Report Buffer, The Report Buffer
+@section Running Reports
+The real popwer behing Ledger is in its amazing reporting capability.
+Ledger-mode provides easy facility to run reports directly from emacs.
+It has four reports built-in and facilities for adding custom reports.
+
+Typeing @code{C-c C-o C-r} or using menu @code{Ledger Run Report} prompt
+for the name of a saved report. The built-in reports are:
+@table @samp
+@item bal
+Produce a balance reports of all accounts.
+@item reg
+Produce a register report of all transactions.
+@item payee
+Prompt for a payee, the produce a register report of all transaction
+involving that payee.
+@item account
+Prompt for an account, the produce a register report of all transaction
+involving that account.
+@end table
+
+
+@node Adding and Editing Reports, Reversing Report Order, Running Basic Reports, The Report Buffer
+@section Adding and Editing Reports
+@menu
+* Expansion Formats::
+* Make Report Transactions Active::
+@end menu
+
+If you type a report name that Ledger-mode doesn't recognize it will
+prompt you for a ledger command line to run. That command is
+automatically saved with the name given and you can re-run it at any
+time.
+
+There are two ways to edit the command line for a report. The first is
+to privide a prefix argument to the run-report command. For example,
+type @code{M-1 C-c C-o C-r}. This will prompt you for the report name,
+then present the report command line to be edited. When you hit enter,
+the report will be run, but it will not be permanently saved. If you
+want to save it, type @code{S} in the the @file{*Ledger Report*} buffer you
+will have the option to give it a new name, or overwrite the old report.
+
+Deleting reports is accomplished by type @code{C-c C-o C-e} Edit Reports
+in the ledger buffer, or typing @code{E} in the @file{*Ledger Report*}
+buffer. This takes you to the emacs customization window for the
+@code{ledger-reports} variable. Use the widgets to delete the report
+you want removed.
+
+@node Expansion Formats, Make Report Transactions Active, Adding and Editing Reports, Adding and Editing Reports
+@subsection Expansion Formats
+
+It is sometime convenient to leave room to customize a report without
+saving the command line every time. For example running a register
+report for a specific account, enter at runtime by the user. The
+built-in report @file{account} does exactly that, using a variable
+expansion to prompt the user for the account to use. There are four
+variable that can be expanded to run a report:
+
+@table @samp
+@item ledger-file
+Returns the file to be operated on.
+@item payee
+Prompts for a payee.
+@item account
+Prompt for an account.
+@item value
+Prompt for a tag value.
+@end table
+
+You can use these expansion values in your ledger report commands. For
+example, if you wanted to specify a register report the displayed
+trnasactions from a user-determined account with a particular meta-data
+tag value, you specify the following command line:
+@smallexample
+ledger -f %(ledger-file) reg %(account) --limit \"tag('my-tag') =~
+/%(value)/\"
+@end smallexample
+
+@noindent Note how the double-quotes are escaped with back-slashes.
+
+@node Make Report Transactions Active, , Expansion Formats, Adding and Editing Reports
+@subsection Make Report Transactions Active
+
+In a large register report it is convenient to be anle to jump to the
+source transaction. Ledger-mode will automatically include source
+information in every register file that doesn't contain a
+@code{--subtotal} option. It does this by adding a
+@code{--prepend-format='%(filename):%(beg_line):'} to the register
+report command-line you specify. You should never have to see this, but
+if there is an error in your ledger output this additional information
+may not get stripped out of the visible report.
+
+@node Reversing Report Order, , Adding and Editing Reports, The Report Buffer
+@section Reversing Report Order
+
+Often, banks show their online transaction historyies with the most recent
+transaction at the top. Ledger itself cannot do a sensible ledger
+report in reverse chronoligcal order, if you sort on reverse date the
+calculation will also run in the opposite direction. If you want to
+compare a ledger register report to a bank report with the most recent
+transactions at the top, type R in the @file{*Ledger Report*} buffer and
+it will reverse the order of the transactions and maintain the proper
+mathematical sense.
+
+
+@node Installing and Customizing Ledger-mode, Hacking Ledger-mode, The Report Buffer, Top
+@chapter Installing and Customizing Ledger-mode
+@menu
+* Emacs Initialization File::
+* Ledger-mode Customization::
+* Customization Variables::
+* Ledger-mode Faces::
+@end menu
+
+@node Emacs Initialization File, Ledger-mode Customization, Installing and Customizing Ledger-mode, Installing and Customizing Ledger-mode
+@section Emacs Initialization File
+
+@node Ledger-mode Customization, Ledger-mode Faces, Emacs Initialization File, Installing and Customizing Ledger-mode
+@section Ledger-mode Customization
+@node Customization Variables, , Ledger-mode Customization, Installing and Customizing Ledger-mode
+@section Customization Variables
+@node Ledger-mode Faces, , Customization Variables, Installing and Customizing Ledger-mode
+@section Ledger-mode Faces
+@menu
+* Using EMACS customization menus::
+* Complete list of customization variables::
+@end menu
+
+@node Using EMACS customization menus, Complete list of customization variables, Ledger-mode Faces, Ledger-mode Faces
+@subsection Using EMACS customization menus
+
+@node Complete list of customization variables, , Using EMACS customization menus, Ledger-mode Faces
+@subsection Complete list of customization variables
+
+@node Hacking Ledger-mode, , Installing and Customizing Ledger-mode, Top
+@chapter Hacking Ledger-mode
+
+@bye
diff --git a/test/input/demo.ledger b/test/input/demo.ledger
new file mode 100644
index 00000000..dbf47c2a
--- /dev/null
+++ b/test/input/demo.ledger
@@ -0,0 +1,63 @@
+2010/12/01 * Checking balance
+ Assets:Checking $1,000.00
+ Equity:Opening Balances
+
+2010/12/20 * Organic Co-op
+ Expenses:Food:Groceries $ 37.50 ; [=2011/01/01]
+ Expenses:Food:Groceries $ 37.50 ; [=2011/02/01]
+ Expenses:Food:Groceries $ 37.50 ; [=2011/03/01]
+ Expenses:Food:Groceries $ 37.50 ; [=2011/04/01]
+ Expenses:Food:Groceries $ 37.50 ; [=2011/05/01]
+ Expenses:Food:Groceries $ 37.50 ; [=2011/06/01]
+ Assets:Checking $ -225.00
+
+2010/12/28 Acme Mortgage
+ Liabilities:Mortgage:Principal $ 200.00
+ Expenses:Interest:Mortgage $ 500.00
+ Expenses:Escrow $ 300.00
+ * Assets:Checking $ -1000.00
+
+2011/01/02 Grocery Store
+ Expenses:Food:Groceries $ 65.00
+ * Assets:Checking
+
+2011/01/05 Employer
+ * Assets:Checking $ 2000.00
+ Income:Salary
+
+2011/01/14 Bank
+ ; Regular monthly savings transfer
+ Assets:Savings $ 300.00
+ Assets:Checking
+
+2011/01/19 Grocery Store
+ Expenses:Food:Groceries $ 44.00 ; hastag: not block
+ Assets:Checking
+
+2011/01/25 Bank
+ ; Transfer to cover car purchase
+ Assets:Checking $ 5,500.00
+ Assets:Savings
+ ; :nobudget:
+
+2011/01/25 Tom's Used Cars
+ Expenses:Auto $ 5,500.00
+ ; :nobudget:
+ Assets:Checking
+
+2011/01/27 Book Store
+ Expenses:Books $20.00
+ Liabilities:MasterCard
+
+2011/04/25 Tom's Used Cars
+ Expenses:Auto $ 5,500.00
+ ; :nobudget:
+ Assets:Checking
+
+2011/04/27 Bookstore
+ Expenses:Books $20.00
+ Assets:Checking
+
+2011/12/01 Sale
+ Assets:Checking $ 30.00
+ Income:Sales