docs: convert manual to markdown
This commit is contained in:
		
							parent
							
								
									4400af2392
								
							
						
					
					
						commit
						d966998292
					
				
							
								
								
									
										864
									
								
								MANUAL.markdown
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										864
									
								
								MANUAL.markdown
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,864 @@ | |||||||
|  | --- | ||||||
|  | title: hledger manual | ||||||
|  | --- | ||||||
|  | 
 | ||||||
|  | # hledger manual | ||||||
|  | 
 | ||||||
|  | This is the official hledger manual. You may also want to visit the | ||||||
|  | [http://hledger.org](http://hledger.org) home page, the | ||||||
|  | [hledger for techies](README2.html) page, and for background, | ||||||
|  | [c++ ledger's manual](http://joyful.com/repos/ledger/doc/ledger.html). | ||||||
|  | A tip: on hledger.org, these docs are also available with .pdf | ||||||
|  | suffix. | ||||||
|  | 
 | ||||||
|  | ## User Guide | ||||||
|  | 
 | ||||||
|  | ### Introduction | ||||||
|  | 
 | ||||||
|  | hledger is a program for tracking money, time, or any other commodity, | ||||||
|  | using a plain text file format and the simple but powerful principles of | ||||||
|  | double-entry accounting. | ||||||
|  | 
 | ||||||
|  | It is modelled closely on | ||||||
|  | [John Wiegley's ledger](http://wiki.github.com/jwiegley/ledger) (aka "c++ | ||||||
|  | ledger"), with some features removed and some new ones added. I wrote | ||||||
|  | hledger because I wanted to build financial tools in the Haskell | ||||||
|  | programming language rather than in C++. | ||||||
|  | 
 | ||||||
|  | hledger's basic function is to generate register and balance reports from | ||||||
|  | a plain text ledger file, at the command line or via the web or curses | ||||||
|  | interface. You can use it to, eg, | ||||||
|  | 
 | ||||||
|  | -   track spending and income | ||||||
|  | -   see time reports by day/week/month/project | ||||||
|  | -   get accurate numbers for client billing and tax filing | ||||||
|  | -   track invoices | ||||||
|  | 
 | ||||||
|  | hledger aims to help both computer experts and every-day users gain | ||||||
|  | clarity in their finances and time management. For now though, it is most | ||||||
|  | useful to technically-minded folks who are comfortable with command-line | ||||||
|  | tools. | ||||||
|  | 
 | ||||||
|  | hledger is copyright (c) 2007-2009 Simon Michael | ||||||
|  | <[simon@joyful.com](mailto:simon@joyful.com)\> and contributors and | ||||||
|  | released as Free Software under GPL version 3 or later. | ||||||
|  | 
 | ||||||
|  | ### Installing | ||||||
|  | 
 | ||||||
|  | hledger works on all major platforms. One of these pre-built | ||||||
|  | [binaries](http://hledger.org/binaries/) might work for you. If not, | ||||||
|  | please [report the problem](http://hledger.org/README2.html#support), then | ||||||
|  | install the [Haskell Platform](http://hackage.haskell.org/platform/) and | ||||||
|  | type: | ||||||
|  | 
 | ||||||
|  |     cabal update | ||||||
|  |     cabal install hledger | ||||||
|  | 
 | ||||||
|  | You can add some options to the install command to include extra features: | ||||||
|  | 
 | ||||||
|  | -   Add `-fvty` to build the [ui](#ui) command. This is not | ||||||
|  |     available on microsoft windows. | ||||||
|  | 
 | ||||||
|  | -   Add `-fweb` to build the [web](#web) command. | ||||||
|  | 
 | ||||||
|  |     Note: this uses a simple web server which might not support older | ||||||
|  |     browsers like IE6. To build with a more featureful (but slightly | ||||||
|  |     harder to install) web server, use `-fwebhappstack` instead. | ||||||
|  | 
 | ||||||
|  | -   Add `-fchart` to build the [chart](#chart) command. This | ||||||
|  |     requires [gtk2hs](http://www.haskell.org/gtk2hs/download/), which | ||||||
|  |     you'll need to install yourself as it's not yet provided by the | ||||||
|  |     haskell platform or cabal. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Here are some issues that have been encountered, with workarounds: | ||||||
|  | 
 | ||||||
|  | -   cabal-install 0.6.4 might succeed if cabal-install 0.6.2 does | ||||||
|  |     not | ||||||
|  | 
 | ||||||
|  | -   In some cases, cabal install can fail with a compilation or | ||||||
|  |     link error due to incompatible package versions. You can sometimes | ||||||
|  |     work around this by specifying versions manually. Eg here's a | ||||||
|  |     recipe for building with happstack on haskell platform 2009.2.0.2 | ||||||
|  |     on MS Windows: | ||||||
|  | 
 | ||||||
|  |         cabal install hledger -fwebhappstack --constraint="haskell-src-meta < 0.0.6" --constraint="syb-with-class < 0.6.1" | ||||||
|  | 
 | ||||||
|  | -   A ghc panic while building might be due to | ||||||
|  |     [http://hackage.haskell.org/trac/ghc/ticket/3862](http://hackage.haskell.org/trac/ghc/ticket/3862) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | Release notes are at | ||||||
|  | [http://hledger.org/NEWS.html](http://hledger.org/NEWS.html) . | ||||||
|  | 
 | ||||||
|  | ### Basic usage | ||||||
|  | 
 | ||||||
|  | Basic usage is: | ||||||
|  | 
 | ||||||
|  |     hledger [OPTIONS] [COMMAND [PATTERNS]] | ||||||
|  | 
 | ||||||
|  | [OPTIONS](#overview) may appear anywhere on the command line. | ||||||
|  | [COMMAND](#commands) is one of: add, balance, chart, convert, histogram, | ||||||
|  | print, register, stats, ui, web, test (defaulting to balance). The | ||||||
|  | optional [PATTERNS](#filter-patterns) are regular expressions which select | ||||||
|  | a subset of the ledger data. | ||||||
|  | 
 | ||||||
|  | hledger looks for data in a ledger file, usually `.ledger` in your home | ||||||
|  | directory. You can specify a different file with the -f option (use - for | ||||||
|  | standard input) or `LEDGER` environment variable. | ||||||
|  | 
 | ||||||
|  | To get started, make yourself a ledger file containing some | ||||||
|  | transactions. You can copy the sample file below (or | ||||||
|  | [sample.ledger](http://joyful.com/repos/hledger/sample.ledger)) and save | ||||||
|  | it as `.ledger` in your home directory. Or, just run `hledger add` and | ||||||
|  | enter a few transactions. Now you can try some of these commands, or read | ||||||
|  | on: | ||||||
|  | 
 | ||||||
|  |     hledger --help                        # show command-line help | ||||||
|  |     hledger balance                       # all accounts with aggregated balances | ||||||
|  |     hledger bal --depth 1                 # only top-level accounts | ||||||
|  |     hledger register                      # transaction register | ||||||
|  |     hledger reg income                    # transactions to/from an income account | ||||||
|  |     hledger reg checking                  # checking transactions | ||||||
|  |     hledger reg desc:shop                 # transactions with shop in the description | ||||||
|  |     hledger histogram                     # transactions per day, or other interval | ||||||
|  |     hledger add                           # add some new transactions to the ledger file | ||||||
|  |     hledger ui                            # curses ui, if installed with -fvty | ||||||
|  |     hledger web                           # web ui, if installed with -fweb or -fwebhappstack | ||||||
|  |     hledger chart                         # make a balance chart, if installed with -fchart | ||||||
|  | 
 | ||||||
|  | You'll find more examples below. | ||||||
|  | 
 | ||||||
|  | ### File format | ||||||
|  | 
 | ||||||
|  | hledger's data file, aka the ledger, is a plain text representation of a | ||||||
|  | standard accounting journal. It contains a number of transactions, each | ||||||
|  | describing a transfer of money (or another commodity) between two or more | ||||||
|  | named accounts. Here's an example: | ||||||
|  | 
 | ||||||
|  |     ; A sample ledger file. This is a comment. | ||||||
|  |      | ||||||
|  |     2008/01/01 income               ; <- transaction's first line starts in column 0, contains date and description | ||||||
|  |         assets:bank:checking  $1    ; <- posting lines start with whitespace, each contains an account name | ||||||
|  |         income:salary        $-1    ;    followed by at least two spaces and an amount | ||||||
|  |      | ||||||
|  |     2008/06/01 gift | ||||||
|  |         assets:bank:checking  $1    ; <- at least two postings in a transaction | ||||||
|  |         income:gifts         $-1    ; <- their amounts must balance to 0 | ||||||
|  |      | ||||||
|  |     2008/06/02 save | ||||||
|  |         assets:bank:saving    $1 | ||||||
|  |         assets:bank:checking        ; <- one amount may be omitted; here $-1 is inferred | ||||||
|  |      | ||||||
|  |     2008/06/03 eat & shop           ; <- description can be anything | ||||||
|  |         expenses:food         $1 | ||||||
|  |         expenses:supplies     $1    ; <- this transaction debits two expense accounts | ||||||
|  |         assets:cash                 ; <- $-2 inferred | ||||||
|  |      | ||||||
|  |     2008/12/31 * pay off            ; <- an optional * after the date means "cleared" (or anything you want) | ||||||
|  |         liabilities:debts     $1 | ||||||
|  |         assets:bank:checking | ||||||
|  | 
 | ||||||
|  | Each transaction has a date, description, and two or more postings (of | ||||||
|  | some amount to some account) which must balance to 0. As a convenience, | ||||||
|  | one posting's amount may be left blank and will be inferred. | ||||||
|  | 
 | ||||||
|  | Note that account names may contain single spaces, while the amount must | ||||||
|  | be separated from the account name by at least two spaces. | ||||||
|  | 
 | ||||||
|  | An amount is a number, with an optional currency/commodity symbol or word | ||||||
|  | on either the left or right. Note: when writing a negative amount with a | ||||||
|  | left-side currency symbol, the minus goes after the symbol, eg `$-1`. | ||||||
|  | 
 | ||||||
|  | This file format is also compatible with c++ ledger, so you can use both | ||||||
|  | tools. For more details, see | ||||||
|  | [File format compatibility](#file-format-compatibility). | ||||||
|  | 
 | ||||||
|  | ## Reference | ||||||
|  | 
 | ||||||
|  | ### Overview | ||||||
|  | 
 | ||||||
|  | This version of hledger mimics a subset of ledger 3.x, and adds some | ||||||
|  | features of its own. We currently support regular ledger entries, timelog | ||||||
|  | entries, multiple commodities, (fixed) price history, virtual postings, | ||||||
|  | filtering by account and description, the familiar print, register & | ||||||
|  | balance commands and several new commands. We handle (almost) the full | ||||||
|  | period expression syntax, and very limited display expressions consisting | ||||||
|  | of a simple date predicate. | ||||||
|  | 
 | ||||||
|  | Here is the command-line help: | ||||||
|  | 
 | ||||||
|  |     Usage: hledger [OPTIONS] [COMMAND [PATTERNS]] | ||||||
|  |            hledger [OPTIONS] convert CSVFILE | ||||||
|  |            hledger [OPTIONS] stats | ||||||
|  |      | ||||||
|  |     hledger uses your ~/.ledger or $LEDGER file, or another specified with -f | ||||||
|  |      | ||||||
|  |     COMMAND is one of (may be abbreviated): | ||||||
|  |      add       - prompt for new transactions and add them to the ledger | ||||||
|  |      balance   - show accounts, with balances | ||||||
|  |      convert   - read CSV bank data and display in ledger format | ||||||
|  |      histogram - show a barchart of transactions per day or other interval | ||||||
|  |      print     - show transactions in ledger format | ||||||
|  |      register  - show transactions as a register with running balance | ||||||
|  |      stats     - show various statistics for a ledger | ||||||
|  |      ui        - run a simple text-based UI | ||||||
|  |      web       - run a simple web-based UI | ||||||
|  |      chart     - generate balances pie chart | ||||||
|  |      test      - run self-tests | ||||||
|  |      | ||||||
|  |     PATTERNS are regular expressions which filter by account name. | ||||||
|  |     Prefix with desc: to filter by transaction description instead. | ||||||
|  |     Prefix with not: to negate a pattern. When using both, not: comes last. | ||||||
|  |      | ||||||
|  |     DATES can be y/m/d or ledger-style smart dates like "last month". | ||||||
|  |      | ||||||
|  |     Options: | ||||||
|  |      -f FILE  --file=FILE          use a different ledger/timelog file; - means stdin | ||||||
|  |               --no-new-accounts    don't allow to create new accounts | ||||||
|  |      -b DATE  --begin=DATE         report on transactions on or after this date | ||||||
|  |      -e DATE  --end=DATE           report on transactions before this date | ||||||
|  |      -p EXPR  --period=EXPR        report on transactions during the specified period | ||||||
|  |                                    and/or with the specified reporting interval | ||||||
|  |      -C       --cleared            report only on cleared transactions | ||||||
|  |      -U       --uncleared          report only on uncleared transactions | ||||||
|  |      -B       --cost, --basis      report cost of commodities | ||||||
|  |               --depth=N            hide accounts/transactions deeper than this | ||||||
|  |      -d EXPR  --display=EXPR       show only transactions matching EXPR (where | ||||||
|  |                                    EXPR is 'dOP[DATE]' and OP is <, <=, =, >=, >) | ||||||
|  |               --effective          use transactions' effective dates, if any | ||||||
|  |      -E       --empty              show empty/zero things which are normally elided | ||||||
|  |      -R       --real               report only on real (non-virtual) transactions | ||||||
|  |               --no-total           balance report: hide the final total | ||||||
|  |      -W       --weekly             register report: show weekly summary | ||||||
|  |      -M       --monthly            register report: show monthly summary | ||||||
|  |      -Q       --quarterly          register report: show quarterly summary | ||||||
|  |      -Y       --yearly             register report: show yearly summary | ||||||
|  |      -h       --help               show this help | ||||||
|  |      -V       --version            show version information | ||||||
|  |      -v       --verbose            show verbose test output | ||||||
|  |               --binary-filename    show the download filename for this hledger build | ||||||
|  |               --debug              show extra debug output; implies verbose | ||||||
|  |               --debug-no-ui        run ui commands with no output | ||||||
|  |      -o FILE  --output=FILE        chart: output filename (default: hledger.png) | ||||||
|  |               --items=N            chart: number of accounts to show (default: 10) | ||||||
|  |               --size=WIDTHxHEIGHT  chart: image size (default: 600x400) | ||||||
|  | 
 | ||||||
|  | ### Commands | ||||||
|  | 
 | ||||||
|  | #### Reporting commands | ||||||
|  | 
 | ||||||
|  | These commands are read-only, that is they never modify your data. | ||||||
|  | 
 | ||||||
|  | ##### print | ||||||
|  | 
 | ||||||
|  | The print command displays full transactions from the ledger file, tidily | ||||||
|  | formatted and showing all amounts explicitly. The output of print is | ||||||
|  | always valid ledger data. | ||||||
|  | 
 | ||||||
|  | hledger's print command also shows all unit prices in effect, or (with | ||||||
|  | -B/--cost) shows cost amounts. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger print | ||||||
|  |     $ hledger print employees:bob | hledger -f- register expenses | ||||||
|  | 
 | ||||||
|  | ##### register | ||||||
|  | 
 | ||||||
|  | The register command displays postings, one per line, and their running | ||||||
|  | total. With a [reporting interval](#reporting-interval) it will aggregate | ||||||
|  | similar postings within each interval. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger register | ||||||
|  |     $ hledger register --monthly -E rent | ||||||
|  | 
 | ||||||
|  | ##### balance | ||||||
|  | 
 | ||||||
|  | The balance command displays accounts and their balances. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger balance | ||||||
|  |     $ hledger balance food -p 'last month' | ||||||
|  |     $ for y in 2006 2007 2008 2009 2010; do echo; echo $y; hledger -f $y.ledger balance ^expenses --depth 2; done | ||||||
|  | 
 | ||||||
|  | ##### chart | ||||||
|  | 
 | ||||||
|  | (optional feature) | ||||||
|  | 
 | ||||||
|  | The chart command saves a pie chart of your top account balances to an | ||||||
|  | image file (usually "hledger.png", or use -o/--output FILE). You can | ||||||
|  | adjust the image resolution with --size=WIDTHxHEIGHT, and the number of | ||||||
|  | accounts with --items=N. | ||||||
|  | 
 | ||||||
|  | Note that positive and negative balances will not be displayed together in | ||||||
|  | the same chart; any balances not matching the sign of the first one will | ||||||
|  | be omitted. | ||||||
|  | 
 | ||||||
|  | To show only accounts above a certain depth, use the --depth | ||||||
|  | option. Otherwise, the chart can include accounts at any depth. If a | ||||||
|  | parent and child account are both displayed, the parent's balance excludes | ||||||
|  | the child's. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger chart assets --depth 2 | ||||||
|  |     $ hledger chart liabilities --depth 2 | ||||||
|  |     $ hledger chart ^expenses -o balance.png --size 1000x600 --items 20 | ||||||
|  |     $ for m in 01 02 03 04 05 06 07 08 09 10 11 12; do hledger -p 2009/$m chart ^expenses --depth 2 -o expenses-2009$m.png --size 400x300; done | ||||||
|  | 
 | ||||||
|  | ##### histogram | ||||||
|  | 
 | ||||||
|  | The histogram command displays a quick bar chart showing transaction | ||||||
|  | counts, per day, week, month or other reporting interval. It is | ||||||
|  | experimental. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger histogram -p weekly dining | ||||||
|  | 
 | ||||||
|  | ##### stats | ||||||
|  | 
 | ||||||
|  | The stats command displays quick summary information for the ledger. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger stats | ||||||
|  | 
 | ||||||
|  | ##### ui | ||||||
|  | 
 | ||||||
|  | (optional feature) | ||||||
|  | 
 | ||||||
|  | The ui command starts hledger's curses (full-screen, text) user interface, | ||||||
|  | which allows interactive navigation of the print/register/balance | ||||||
|  | reports. This lets you browse around your numbers and get quick insights | ||||||
|  | with less typing. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  | $ hledger ui $ hledger ui -BE food | ||||||
|  | 
 | ||||||
|  | #### Modifying commands | ||||||
|  | 
 | ||||||
|  | The following commands can alter your ledger file. | ||||||
|  | 
 | ||||||
|  | ##### add | ||||||
|  | 
 | ||||||
|  | The add command prompts interactively for new transactions, and adds them | ||||||
|  | to the ledger. It is experimental. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  | $ hledger add $ hledger add accounts:personal:bob | ||||||
|  | 
 | ||||||
|  | ##### web | ||||||
|  | 
 | ||||||
|  | (optional feature) | ||||||
|  | 
 | ||||||
|  | The web command starts hledger's web interface, and tries to open a web | ||||||
|  | browser to view it (if this fails, you'll have to visit the indicated url | ||||||
|  | yourself.) The web ui combines the features of the print, register, | ||||||
|  | balance and add commands. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger web | ||||||
|  |     $ hledger web --debug -f demo.ledger -p thisyear | ||||||
|  | 
 | ||||||
|  | #### Other commands | ||||||
|  | 
 | ||||||
|  | ##### convert | ||||||
|  | 
 | ||||||
|  | The convert command reads a | ||||||
|  | [CSV](http://en.wikipedia.org/wiki/Comma-separated_values) file you have | ||||||
|  | downloaded from your bank, and prints out the transactions in ledger | ||||||
|  | format, suitable for adding to your ledger. It does not alter your ledger | ||||||
|  | directly. | ||||||
|  | 
 | ||||||
|  | This can be a lot quicker than entering every transaction by hand.  (The | ||||||
|  | downside is that you are less likely to notice if your bank makes an | ||||||
|  | error!) Use it like this: | ||||||
|  | 
 | ||||||
|  |     $ hledger convert FILE.csv >FILE.ledger | ||||||
|  | 
 | ||||||
|  | where FILE.csv is your downloaded csv file. This will convert the csv data | ||||||
|  | using conversion rules defined in FILE.rules (auto-creating this file if | ||||||
|  | needed), and save the output into a temporary ledger file. Then you should | ||||||
|  | review FILE.ledger for problems; update the rules and convert again if | ||||||
|  | needed; and finally copy/paste transactions which are new into your main | ||||||
|  | ledger. | ||||||
|  | 
 | ||||||
|  | ###### .rules file | ||||||
|  | 
 | ||||||
|  | convert requires a \*.rules file containing data definitions and rules for | ||||||
|  | assigning destination accounts to transactions; it will be auto-created if | ||||||
|  | missing. Typically you will have one csv file and one rules file per bank | ||||||
|  | account. Here's an example rules file for converting csv data from a Wells | ||||||
|  | Fargo checking account: | ||||||
|  | 
 | ||||||
|  |     base-account assets:bank:checking | ||||||
|  |     date-field 0 | ||||||
|  |     description-field 4 | ||||||
|  |     amount-field 1 | ||||||
|  |     currency $ | ||||||
|  |      | ||||||
|  |     # account-assigning rules | ||||||
|  |      | ||||||
|  |     SPECTRUM | ||||||
|  |     expenses:health:gym | ||||||
|  |      | ||||||
|  |     ITUNES | ||||||
|  |     BLKBSTR=BLOCKBUSTER | ||||||
|  |     expenses:entertainment | ||||||
|  |      | ||||||
|  |     (TO|FROM) SAVINGS | ||||||
|  |     assets:bank:savings | ||||||
|  | 
 | ||||||
|  | This says: | ||||||
|  | 
 | ||||||
|  | -   the ledger account corresponding to this csv file is | ||||||
|  |     assets:bank:checking | ||||||
|  | -   the first csv field is the date, the second is the amount, the | ||||||
|  |     fifth is the description | ||||||
|  | -   prepend a dollar sign to the amount field | ||||||
|  | -   if description contains SPECTRUM (case-insensitive), the | ||||||
|  |     transaction is a gym expense | ||||||
|  | -   if description contains ITUNES or BLKBSTR, the transaction is | ||||||
|  |     an entertainment expense; also rewrite BLKBSTR as BLOCKBUSTER | ||||||
|  | -   if description contains TO SAVINGS or FROM SAVINGS, the | ||||||
|  |     transaction is a savings transfer | ||||||
|  | 
 | ||||||
|  | Notes: | ||||||
|  | 
 | ||||||
|  | -   Lines beginning with \# or ; are ignored (but avoid using | ||||||
|  |     inside an account rule) | ||||||
|  | 
 | ||||||
|  | -   Definitions must come first, one per line, all in one | ||||||
|  |     paragraph. Each is a name and a value separated by whitespace. | ||||||
|  |     Supported names are: base-account, date-field, status-field, | ||||||
|  |     code-field, description-field, amount-field, currency-field, | ||||||
|  |     currency. All are optional and will use defaults if not specified. | ||||||
|  | 
 | ||||||
|  | -   The remainder of the file is account-assigning rules. Each is a | ||||||
|  |     paragraph consisting of one or more description-matching patterns | ||||||
|  |     (case-insensitive regular expressions), one per line, followed by | ||||||
|  |     the account name to use when the transaction's description matches | ||||||
|  |     any of these patterns. | ||||||
|  | 
 | ||||||
|  | -   A match pattern may be followed by a replacement pattern, | ||||||
|  |     separated by `=`, which rewrites the matched part of the | ||||||
|  |     description. Use this if you want to clean up messy bank data. To | ||||||
|  |     rewrite the entire description, use a match pattern like | ||||||
|  |     `.*PAT.*=REPL`. Within a replacement pattern, you can refer to the | ||||||
|  |     matched text with `\0` and any regex groups with `\1`, `\2` in the | ||||||
|  |     usual way. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ##### test | ||||||
|  | 
 | ||||||
|  | This command runs hledger's internal self-tests and displays a quick | ||||||
|  | report. The -v option shows more detail, and a pattern can be provided to | ||||||
|  | filter tests by name. It's mainly used in development, but it's also nice | ||||||
|  | to be able to run a sanity check at any time.. | ||||||
|  | 
 | ||||||
|  | Examples: | ||||||
|  | 
 | ||||||
|  |     $ hledger test | ||||||
|  |     $ hledger test -v balance | ||||||
|  | 
 | ||||||
|  | ### Other features | ||||||
|  | 
 | ||||||
|  | #### Filter patterns | ||||||
|  | 
 | ||||||
|  | Most commands accept one or more filter pattern arguments after the | ||||||
|  | command name, to select a subset of transactions or postings. There are | ||||||
|  | two kinds of pattern: | ||||||
|  | 
 | ||||||
|  | -   an account pattern, which is a regular expression. This is | ||||||
|  |     matched against postings' accounts. Optionally, it may be prefixed | ||||||
|  |     with `not:` in which case the match is negated. | ||||||
|  | 
 | ||||||
|  | -   a description pattern, like the above but prefixed with | ||||||
|  |     `desc:`. This is matched against transactions' descriptions. Note, | ||||||
|  |     when negating a desc: pattern, not: goes last, eg: | ||||||
|  |     `desc:not:someregexp`. | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | When you specify multiple filter patterns, hledger generally selects the | ||||||
|  | transactions or postings which match (or negatively match) | ||||||
|  | 
 | ||||||
|  | > *any of the account patterns* AND | ||||||
|  | > *any of the description patterns* | ||||||
|  | 
 | ||||||
|  | The [print](#print) command selects transactions which | ||||||
|  | 
 | ||||||
|  | > *match any of the description patterns* AND | ||||||
|  | > *have any postings matching any of the positive account patterns* | ||||||
|  | > AND | ||||||
|  | > *have no postings matching any of the negative account patterns* | ||||||
|  | 
 | ||||||
|  | #### Dates | ||||||
|  | 
 | ||||||
|  | ##### Simple dates | ||||||
|  | 
 | ||||||
|  | Within a ledger file, dates must follow a fairly simple year/month/day | ||||||
|  | format. Examples: | ||||||
|  | 
 | ||||||
|  | > `2010/01/31` or `2010/1/31` or `2010-1-31` or `2010.1.31` | ||||||
|  | 
 | ||||||
|  | The [add](#add) command and the [web](#web) add form, as well as some | ||||||
|  | other places, accept [smart dates](#smart-dates) - more about those below. | ||||||
|  | 
 | ||||||
|  | ##### Default year | ||||||
|  | 
 | ||||||
|  | You can set a default year with a `Y` directive in the ledger, then | ||||||
|  | subsequent dates may be written as month/day. Eg: | ||||||
|  | 
 | ||||||
|  |     Y2009 | ||||||
|  |      | ||||||
|  |     12/15 ... | ||||||
|  |      | ||||||
|  |     Y2010 | ||||||
|  |      | ||||||
|  |     1/31 ... | ||||||
|  | 
 | ||||||
|  | ##### Actual and effective dates | ||||||
|  | 
 | ||||||
|  | Frequently, a real-life transaction has two (or more) dates of | ||||||
|  | interest. For example, you might make a purchase on friday with a debit | ||||||
|  | card, and it might clear (take effect in your bank account) on | ||||||
|  | tuesday. It's sometimes useful to model this accurately, so that your | ||||||
|  | hledger balances match reality. So, you can specify two dates for a | ||||||
|  | transaction, the *actual* and *effective* date, separated by `=`. Eg: | ||||||
|  | 
 | ||||||
|  |     2010/2/19=2010/2/23 ... | ||||||
|  | 
 | ||||||
|  | Then you can use the `--effective` flag to prefer the effective (second) | ||||||
|  | date, if any, in reports. This is useful for, eg, seeing a more accurate | ||||||
|  | daily balance while reconciling a bank account. | ||||||
|  | 
 | ||||||
|  | So, what do *actual* and *effective* mean, exactly ? I always assumed that | ||||||
|  | the actual date comes first, and is "the date you enacted the | ||||||
|  | transaction", while the effective date comes second, and is optional, and | ||||||
|  | is "the date the transaction took effect" (showed up in your bank | ||||||
|  | balance). | ||||||
|  | 
 | ||||||
|  | Unfortunately, this is the reverse of c++ ledger's interpretation (cf | ||||||
|  | [differences](#other-differences)). However it's not *too* serious; just | ||||||
|  | remember that hledger requires the first date; allows an optional second | ||||||
|  | date which the `--effective` flag will select; and the meaning of "actual" | ||||||
|  | and "effective" is up to you. | ||||||
|  | 
 | ||||||
|  | The second date may omit the year if it is the same as the first's. | ||||||
|  | 
 | ||||||
|  | ##### Smart dates | ||||||
|  | 
 | ||||||
|  | In [period expressions](#period-expressions), the `-b` and `-e` options, | ||||||
|  | the [add](#add) command and the [web](#web) add form, more flexible "smart | ||||||
|  | dates" are allowed. Here are some examples: | ||||||
|  | 
 | ||||||
|  | -   `2009/1/1`, `2009/01/01`, `2009-1-1`, `2009.1.1`, `2009/1`, | ||||||
|  |     `2009` (january 1, 2009) | ||||||
|  | -   `1/1`, `january`, `jan`, `this year` (january 1, this year) | ||||||
|  | -   `next year` (january 1, next year) | ||||||
|  | -   `this month` (the 1st of the current month) | ||||||
|  | -   `this week` (the most recent monday) | ||||||
|  | -   `last week` (the monday of the week before this one) | ||||||
|  | -   `today`, `yesterday`, `tomorrow` | ||||||
|  | 
 | ||||||
|  | Spaces are optional, so eg: `-p lastmonth` is valid. | ||||||
|  | 
 | ||||||
|  | #### Period expressions | ||||||
|  | 
 | ||||||
|  | hledger supports flexible "period expressions" with the `-p/--period` | ||||||
|  | option to select transactions within a period of time (like 2009) and/or | ||||||
|  | with a reporting interval (like weekly). hledger period expressions are | ||||||
|  | similar but not identical to c++ ledger's. | ||||||
|  | 
 | ||||||
|  | Here is a basic period expression specifying the first quarter of 2009 | ||||||
|  | (start date is always included, end date is always excluded): | ||||||
|  | 
 | ||||||
|  |     -p "from 2009/1/1 to 2009/4/1" | ||||||
|  | 
 | ||||||
|  | Keywords like "from" and "to" are optional, and so are the spaces.  Just | ||||||
|  | don't run two dates together: | ||||||
|  | 
 | ||||||
|  |     -p2009/1/1to2009/4/1 | ||||||
|  |     -p"2009/1/1 2009/4/1" | ||||||
|  | 
 | ||||||
|  | Dates are [smart dates](#smart-dates), so if the current year is 2009, the | ||||||
|  | above can also be written as: | ||||||
|  | 
 | ||||||
|  |     -p "1/1 to 4/1" | ||||||
|  |     -p "january to apr" | ||||||
|  |     -p "this year to 4/1" | ||||||
|  | 
 | ||||||
|  | If you specify only one date, the missing start or end date will be the | ||||||
|  | earliest or latest transaction in your ledger data: | ||||||
|  | 
 | ||||||
|  |     -p "from 2009/1/1"  (everything after january 1, 2009) | ||||||
|  |     -p "from 2009/1"    (the same) | ||||||
|  |     -p "from 2009"      (the same) | ||||||
|  |     -p "to 2009"        (everything before january 1, 2009) | ||||||
|  | 
 | ||||||
|  | A single date with no "from" or "to" defines both the start and end date | ||||||
|  | like so: | ||||||
|  | 
 | ||||||
|  |     -p "2009"           (the year 2009;    equivalent to "2009/1/1 to 2010/1/1") | ||||||
|  |     -p "2009/1"         (the month of jan; equivalent to "2009/1/1 to 2009/2/1") | ||||||
|  |     -p "2009/1/1"       (just that day;    equivalent to "2009/1/1 to 2009/1/2") | ||||||
|  | 
 | ||||||
|  | ##### Reporting interval | ||||||
|  | 
 | ||||||
|  | You can also specify a reporting interval, which causes the "register" | ||||||
|  | command to summarise the transactions in each interval.  It goes before | ||||||
|  | the dates, and can be: "daily", "weekly", "monthly", "quarterly", or | ||||||
|  | "yearly". An "in" keyword is optional, and so are the dates: | ||||||
|  | 
 | ||||||
|  |     -p "weekly from 2009/1/1 to 2009/4/1" | ||||||
|  |     -p "monthly in 2008" | ||||||
|  |     -p "monthly from 2008" | ||||||
|  |     -p "quarterly" | ||||||
|  | 
 | ||||||
|  | A reporting interval may also be specified with the -W/--weekly, | ||||||
|  | -M/--monthly, -Q/--quarterly, and -Y/--yearly options. However.. | ||||||
|  | 
 | ||||||
|  | ##### -p overrides other flags | ||||||
|  | 
 | ||||||
|  | Note: any period option on the command line will override the -b, -e, -W, | ||||||
|  | -Q and -Y flags. | ||||||
|  | 
 | ||||||
|  | #### Display expressions | ||||||
|  | 
 | ||||||
|  | A display expression with the `-d/--display` option selects which | ||||||
|  | transactions will be displayed (unlike a | ||||||
|  | [period expression](#period-expressions), which selects the transactions | ||||||
|  | to be used for calculation). | ||||||
|  | 
 | ||||||
|  | hledger currently supports a very small subset of c++ ledger's display | ||||||
|  | expressions, namely: transactions before or after a date.  This is useful | ||||||
|  | for displaying your recent check register with an accurate running | ||||||
|  | total. Note the use of \>= here to include the first of the month: | ||||||
|  | 
 | ||||||
|  |     $ hledger register -d "d>=[this month]" | ||||||
|  | 
 | ||||||
|  | #### Depth limiting | ||||||
|  | 
 | ||||||
|  | With the `--depth N` option, reports will show only the uppermost accounts | ||||||
|  | in the account tree, down to level N. This is most useful with | ||||||
|  | [balance](#balance) (and [chart](#chart)). For example: | ||||||
|  | 
 | ||||||
|  |     $ hledger balance --depth 2 | ||||||
|  | 
 | ||||||
|  | shows a more concise balance report displaying only the top two levels of | ||||||
|  | accounts. This example with [register](#register): | ||||||
|  | 
 | ||||||
|  |     $ hledger register --depth 1 | ||||||
|  | 
 | ||||||
|  | would show only the postings to top-level accounts, which usually means | ||||||
|  | none. | ||||||
|  | 
 | ||||||
|  | #### Prices | ||||||
|  | 
 | ||||||
|  | You can specify a commodity's unit price, or exchange rate, in terms of | ||||||
|  | another commodity. There are two ways. | ||||||
|  | 
 | ||||||
|  | First, you can set the price explicitly for a single posting by writing `@ | ||||||
|  | PRICE` after the amount. PRICE is another amount in a different | ||||||
|  | commodity. Eg, here one hundred euros was purchased at $1.35 per euro: | ||||||
|  | 
 | ||||||
|  |     2009/1/2 x | ||||||
|  |      expenses:foreign currency       €100 @ $1.35 | ||||||
|  |      assets | ||||||
|  | 
 | ||||||
|  | Secondly, you can set the price for a commodity as of a certain date, by | ||||||
|  | entering a historical price record. These are lines beginning with "P", | ||||||
|  | appearing anywhere in the ledger between transactions. Eg, here we say the | ||||||
|  | exchange rate for 1 euro is $1.35 on 2009/1/1 (and thereafter, until a | ||||||
|  | newer price record is found): | ||||||
|  | 
 | ||||||
|  |     P 2009/1/1 € $1.35  ; <- historical price: P, date, commodity symbol, price in 2nd commodity (space-separated) | ||||||
|  |      | ||||||
|  |     2009/1/2 x | ||||||
|  |      expenses:foreign currency       €100 | ||||||
|  |      assets | ||||||
|  | 
 | ||||||
|  | The print command shows any unit prices in effect. Either example above | ||||||
|  | will show: | ||||||
|  | 
 | ||||||
|  |     $ hledger print | ||||||
|  |     2009/01/02 x | ||||||
|  |         expenses:foreign currency  €100 @ $1.35 | ||||||
|  |         assets                     €-100 @ $1.35 | ||||||
|  | 
 | ||||||
|  | To see amounts converted to their total cost, use the `--cost/-B` flag | ||||||
|  | with any command: | ||||||
|  | 
 | ||||||
|  |     $ hledger print --cost | ||||||
|  |     2009/01/02 x | ||||||
|  |         expenses:foreign currency       $135.00 | ||||||
|  |         assets                         $-135.00 | ||||||
|  | 
 | ||||||
|  | The `--cost/-B` flag does only one lookup step, ie it will not look up the | ||||||
|  | price of a price's commodity. | ||||||
|  | 
 | ||||||
|  | Note hledger handles prices differently from c++ ledger in one important | ||||||
|  | respect: we assume unit prices do not vary over time.  This is good for | ||||||
|  | simple reporting of foreign currency transactions, but not for tracking | ||||||
|  | fluctuating-value investments or capital gains. | ||||||
|  | 
 | ||||||
|  | #### Timelog reporting | ||||||
|  | 
 | ||||||
|  | hledger will also read timelog files in timeclock.el format. As a | ||||||
|  | convenience, if you invoke hledger via an "hours" symlink or copy, it uses | ||||||
|  | your timelog file (\~/.timelog or $TIMELOG) by default, rather than your | ||||||
|  | ledger. | ||||||
|  | 
 | ||||||
|  | Timelog entries look like this: | ||||||
|  | 
 | ||||||
|  |     i 2009/03/31 22:21:45 some:project | ||||||
|  |     o 2009/04/01 02:00:34 | ||||||
|  | 
 | ||||||
|  | The clockin description is treated as an account name. Here are some | ||||||
|  | queries to try (after downloading | ||||||
|  | [sample.timelog](http://joyful.com/repos/hledger/sample.timelog)): | ||||||
|  | 
 | ||||||
|  |     ln -s `which hledger` ~/bin/hours            # set up "hours" in your path | ||||||
|  |     export TIMELOG=sample.timelog | ||||||
|  |     hours                                        # show all time balances | ||||||
|  |     hours -p 'last week'                         # last week | ||||||
|  |     hours -p thismonth                           # the space is optional | ||||||
|  |     hours -p 'from 1/15' register project        # project sessions since jan 15 | ||||||
|  |     hours -p 'weekly' reg --depth 1 -E           # weekly time summary | ||||||
|  | 
 | ||||||
|  | This is a useful feature, if you can find a way to efficiently record | ||||||
|  | timelog entries. The "ti" and "to" scripts may be available from the c++ | ||||||
|  | ledger 2.x repository. I use | ||||||
|  | [timeclock-x.el](http://www.emacswiki.org/emacs/timeclock-x.el) and | ||||||
|  | [ledgerutils.el](http://joyful.com/repos/ledgertools/ledgerutils.el) in | ||||||
|  | emacs. | ||||||
|  | 
 | ||||||
|  | ### Compatibility with c++ ledger | ||||||
|  | 
 | ||||||
|  | #### Implementation | ||||||
|  | 
 | ||||||
|  | Unlike c++ ledger, hledger is written in the Haskell programming | ||||||
|  | language. Haskell enables a coding style known as pure lazy functional | ||||||
|  | programming, which holds the promise of more robust and maintainable | ||||||
|  | software built with fewer lines of code. Haskell also provides a more | ||||||
|  | abstracted, portable platform which can make deployment and installation | ||||||
|  | easier in some cases. Haskell also brings some new challenges such as | ||||||
|  | managing memory growth. | ||||||
|  | 
 | ||||||
|  | #### File format compatibility | ||||||
|  | 
 | ||||||
|  | hledger's file format is mostly identical with that of c++ ledger version | ||||||
|  | 2, with some features (like modifier and periodic entries) being accepted, | ||||||
|  | but ignored. There are also some subtle differences in parser behaviour | ||||||
|  | (eg comments may be permissible in different places.) C++ ledger version 3 | ||||||
|  | has introduced additional syntax, which current hledger probably fails to | ||||||
|  | parse. | ||||||
|  | 
 | ||||||
|  | Generally, it's easy to keep a ledger file that works with both hledger | ||||||
|  | and c++ledger if you avoid the more esoteric syntax.  Occasionally you'll | ||||||
|  | need to make small edits to restore compatibility for one or the other. | ||||||
|  | 
 | ||||||
|  | #### Features not supported | ||||||
|  | 
 | ||||||
|  | c++ ledger features not currently supported include: modifier and periodic | ||||||
|  | entries, and the following c++ ledger options and commands: | ||||||
|  | 
 | ||||||
|  |     Basic options: | ||||||
|  |     -o, --output FILE      write output to FILE | ||||||
|  |     -i, --init-file FILE   initialize ledger using FILE (default: ~/.ledgerrc) | ||||||
|  |     -a, --account NAME     use NAME for the default account (useful with QIF) | ||||||
|  |      | ||||||
|  |     Report filtering: | ||||||
|  |     -c, --current          show only current and past entries (not future) | ||||||
|  |         --period-sort EXPR sort each report period's entries by EXPR | ||||||
|  |     -L, --actual           consider only actual (non-automated) transactions | ||||||
|  |     -r, --related          calculate report using related transactions | ||||||
|  |         --budget           generate budget entries based on periodic entries | ||||||
|  |         --add-budget       show all transactions plus the budget | ||||||
|  |         --unbudgeted       show only unbudgeted transactions | ||||||
|  |         --forecast EXPR    generate forecast entries while EXPR is true | ||||||
|  |     -l, --limit EXPR       calculate only transactions matching EXPR | ||||||
|  |     -t, --amount EXPR      use EXPR to calculate the displayed amount | ||||||
|  |     -T, --total EXPR       use EXPR to calculate the displayed total | ||||||
|  |      | ||||||
|  |     Output customization: | ||||||
|  |     -n, --collapse         Only show totals in the top-most accounts. | ||||||
|  |     -s, --subtotal         other: show subtotals | ||||||
|  |     -P, --by-payee         show summarized totals by payee | ||||||
|  |     -x, --comm-as-payee    set commodity name as the payee, for reporting | ||||||
|  |         --dow              show a days-of-the-week report | ||||||
|  |     -S, --sort EXPR        sort report according to the value expression EXPR | ||||||
|  |     -w, --wide             for the default register report, use 132 columns | ||||||
|  |         --head COUNT       show only the first COUNT entries (negative inverts) | ||||||
|  |         --tail COUNT       show only the last COUNT entries (negative inverts) | ||||||
|  |         --pager PAGER      send all output through the given PAGER program | ||||||
|  |     -A, --average          report average transaction amount | ||||||
|  |     -D, --deviation        report deviation from the average | ||||||
|  |     -%, --percentage       report balance totals as a percentile of the parent | ||||||
|  |         --totals           in the "xml" report, include running total | ||||||
|  |     -j, --amount-data      print only raw amount data (useful for scripting) | ||||||
|  |     -J, --total-data       print only raw total data | ||||||
|  |     -y, --date-format STR  use STR as the date format (default: %Y/%m/%d) | ||||||
|  |     -F, --format STR       use STR as the format; for each report type, use: | ||||||
|  |         --balance-format      --register-format       --print-format | ||||||
|  |         --plot-amount-format  --plot-total-format     --equity-format | ||||||
|  |         --prices-format       --wide-register-format | ||||||
|  |      | ||||||
|  |     Commodity reporting: | ||||||
|  |         --price-db FILE    sets the price database to FILE (def: ~/.pricedb) | ||||||
|  |     -L, --price-exp MINS   download quotes only if newer than MINS (def: 1440) | ||||||
|  |     -Q, --download         download price information when needed | ||||||
|  |     -O, --quantity         report commodity totals (this is the default) | ||||||
|  |     -V, --market           report last known market value | ||||||
|  |     -g, --performance      report gain/loss for each displayed transaction | ||||||
|  |     -G, --gain             report net gain/loss | ||||||
|  |      | ||||||
|  |     Commands: | ||||||
|  |     xml      [REGEXP]...   print matching entries in XML format | ||||||
|  |     equity   [REGEXP]...   output equity entries for matching accounts | ||||||
|  |     prices   [REGEXP]...   display price history for matching commodities | ||||||
|  |     entry DATE PAYEE AMT   output a derived entry, based on the arguments | ||||||
|  | 
 | ||||||
|  | #### Other differences | ||||||
|  | 
 | ||||||
|  | -   hledger recognises description and negative patterns by "desc:" | ||||||
|  |     and "not:" prefixes, unlike ledger 3's free-form parser | ||||||
|  | -   hledger doesn't require a space before command-line option | ||||||
|  |     values, you can write -f- | ||||||
|  | -   hledger's weekly reporting intervals always start on mondays | ||||||
|  | -   hledger shows start and end dates of the intervals requested, | ||||||
|  |     not just the span containing data | ||||||
|  | -   hledger period expressions don't support "biweekly", | ||||||
|  |     "bimonthly", or "every N days/weeks/..." | ||||||
|  | -   hledger always shows timelog balances in hours | ||||||
|  | -   hledger splits multi-day timelog sessions at midnight | ||||||
|  | -   hledger doesn't track the value of commodities with varying | ||||||
|  |     price; prices are fixed as of the transaction date | ||||||
|  | -   hledger print shows amounts for all postings, and shows unit | ||||||
|  |     prices for amounts which have them | ||||||
|  | -   hledger assumes a transaction's actual date comes first, and is | ||||||
|  |     required, while the optional effective date comes second (cf | ||||||
|  |     [Actual and effective dates](#actual-and-effective-dates)) | ||||||
|  | -   hledger does not support per-posting actual or effective dates | ||||||
|  | 
 | ||||||
|  | ### More examples and recipes | ||||||
|  | 
 | ||||||
|  | -   Here's a bash function that will run hledger chart and display | ||||||
|  |     the image in your (graphical) emacs: | ||||||
|  | 
 | ||||||
|  |         function chart () { | ||||||
|  |           hledger chart $* && emacsclient -n hledger.png | ||||||
|  |         } | ||||||
|  | 
 | ||||||
|  |     Example: | ||||||
|  | 
 | ||||||
|  |         $ chart food --depth 2 -p jan | ||||||
|  | 
 | ||||||
							
								
								
									
										884
									
								
								MANUAL.rst
									
									
									
									
									
								
							
							
						
						
									
										884
									
								
								MANUAL.rst
									
									
									
									
									
								
							| @ -1,884 +0,0 @@ | |||||||
| --- |  | ||||||
| title: hledger manual |  | ||||||
| --- |  | ||||||
| hledger manual |  | ||||||
| ============== |  | ||||||
| 
 |  | ||||||
| This is the official hledger manual. You may also want to visit |  | ||||||
| the http://hledger.org home page, |  | ||||||
| the `hledger for techies`_ page, |  | ||||||
| and for background, `c++ ledger's manual`_. |  | ||||||
| A tip: on hledger.org, these docs are also available with .pdf suffix. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| User Guide |  | ||||||
| :::::::::: |  | ||||||
| 
 |  | ||||||
| Introduction |  | ||||||
| ............ |  | ||||||
| 
 |  | ||||||
| hledger is a program for tracking money, time, or any other commodity, |  | ||||||
| using a plain text file format and the simple but powerful principles of |  | ||||||
| double-entry accounting. |  | ||||||
| 
 |  | ||||||
| It is modelled closely on `John Wiegley's ledger`_ (aka "c++ ledger"), |  | ||||||
| with some features removed and some new ones added.  I wrote hledger |  | ||||||
| because I wanted to build financial tools in the Haskell programming |  | ||||||
| language rather than in C++. |  | ||||||
| 
 |  | ||||||
| hledger's basic function is to generate register and balance reports from |  | ||||||
| a plain text ledger file, at the command line or via the web or curses |  | ||||||
| interface. You can use it to, eg, |  | ||||||
| 
 |  | ||||||
| - track spending and income |  | ||||||
| - see time reports by day/week/month/project |  | ||||||
| - get accurate numbers for client billing and tax filing |  | ||||||
| - track invoices |  | ||||||
| 
 |  | ||||||
| hledger aims to help both computer experts and every-day users gain clarity in their finances and time management. |  | ||||||
| For now though, it is most useful to technically-minded folks who are comfortable with command-line tools. |  | ||||||
| 
 |  | ||||||
| hledger is copyright (c) 2007-2009 Simon Michael <simon@joyful.com> and |  | ||||||
| contributors and released as Free Software under GPL version 3 or later. |  | ||||||
| 
 |  | ||||||
| Installing |  | ||||||
| .......... |  | ||||||
| 
 |  | ||||||
| hledger works on all major platforms. One of these pre-built binaries_ might work for you. |  | ||||||
| If not, please `report the problem <http://hledger.org/README2.html#support>`_, then |  | ||||||
| install the `Haskell Platform`_ and type:: |  | ||||||
| 
 |  | ||||||
|  cabal update |  | ||||||
|  cabal install hledger |  | ||||||
| 
 |  | ||||||
| You can add some options to the install command to include extra features: |  | ||||||
| 
 |  | ||||||
| - Add ``-fvty`` to build the `ui <#ui>`_ command. This is not available on microsoft windows. |  | ||||||
| 
 |  | ||||||
| - Add ``-fweb`` to build the `web <#web>`_ command. |  | ||||||
| 
 |  | ||||||
|   Note: this uses a simple web server which might not support older |  | ||||||
|   browsers like IE6. To build with a more featureful (but slightly harder |  | ||||||
|   to install) web server, use ``-fwebhappstack`` instead. |  | ||||||
| 
 |  | ||||||
| - Add ``-fchart`` to build the `chart <#chart>`_ command. This requires |  | ||||||
|   gtk2hs_, which you'll need to install yourself as it's not yet provided |  | ||||||
|   by the haskell platform or cabal. |  | ||||||
| 
 |  | ||||||
| Here are some issues that have been encountered, with workarounds: |  | ||||||
| 
 |  | ||||||
| - cabal-install 0.6.4 might succeed if cabal-install 0.6.2 does not |  | ||||||
| 
 |  | ||||||
| - In some cases, cabal install can fail with a compilation or link error |  | ||||||
|   due to incompatible package versions.  You can sometimes work around |  | ||||||
|   this by specifying versions manually.  Eg here's a recipe for building |  | ||||||
|   with happstack on haskell platform 2009.2.0.2 on MS Windows:: |  | ||||||
| 
 |  | ||||||
|    cabal install hledger -fwebhappstack --constraint="haskell-src-meta < 0.0.6" --constraint="syb-with-class < 0.6.1" |  | ||||||
| 
 |  | ||||||
| - A ghc panic while building might be due to http://hackage.haskell.org/trac/ghc/ticket/3862 |  | ||||||
| 
 |  | ||||||
| Release notes are at http://hledger.org/NEWS.html . |  | ||||||
| 
 |  | ||||||
| Basic usage |  | ||||||
| ........... |  | ||||||
| 
 |  | ||||||
| Basic usage is:: |  | ||||||
| 
 |  | ||||||
|  hledger [OPTIONS] [COMMAND [PATTERNS]] |  | ||||||
| 
 |  | ||||||
| `OPTIONS <#overview>`_ may appear anywhere on the command line. |  | ||||||
| `COMMAND <#commands>`_ is one of: add, balance, chart, convert, histogram, |  | ||||||
| print, register, stats, ui, web, test (defaulting to balance).  The |  | ||||||
| optional `PATTERNS <#filter-patterns>`_ are regular expressions which |  | ||||||
| select a subset of the ledger data. |  | ||||||
| 
 |  | ||||||
| hledger looks for data in a ledger file, usually ``.ledger`` in your home |  | ||||||
| directory.  You can specify a different file with the -f option (use - for |  | ||||||
| standard input) or ``LEDGER`` environment variable. |  | ||||||
| 
 |  | ||||||
| To get started, make yourself a ledger file containing some transactions. |  | ||||||
| You can copy the sample file below (or sample.ledger_) and save it as |  | ||||||
| ``.ledger`` in your home directory.  Or, just run ``hledger add`` and enter a |  | ||||||
| few transactions. Now you can try some of these commands, or read on:: |  | ||||||
| 
 |  | ||||||
|  hledger --help                        # show command-line help |  | ||||||
|  hledger balance                       # all accounts with aggregated balances |  | ||||||
|  hledger bal --depth 1                 # only top-level accounts |  | ||||||
|  hledger register                      # transaction register |  | ||||||
|  hledger reg income                    # transactions to/from an income account |  | ||||||
|  hledger reg checking                  # checking transactions |  | ||||||
|  hledger reg desc:shop                 # transactions with shop in the description |  | ||||||
|  hledger histogram                     # transactions per day, or other interval |  | ||||||
|  hledger add                           # add some new transactions to the ledger file |  | ||||||
|  hledger ui                            # curses ui, if installed with -fvty |  | ||||||
|  hledger web                           # web ui, if installed with -fweb or -fwebhappstack |  | ||||||
|  hledger chart                         # make a balance chart, if installed with -fchart |  | ||||||
| 
 |  | ||||||
| You'll find more examples below. |  | ||||||
| 
 |  | ||||||
| File format |  | ||||||
| ........... |  | ||||||
| 
 |  | ||||||
| hledger's data file, aka the ledger, is a plain text representation of a |  | ||||||
| standard accounting journal. It contains a number of transactions, each |  | ||||||
| describing a transfer of money (or another commodity) between two or more |  | ||||||
| named accounts. Here's an example:: |  | ||||||
| 
 |  | ||||||
|  ; A sample ledger file. This is a comment. |  | ||||||
|   |  | ||||||
|  2008/01/01 income               ; <- transaction's first line starts in column 0, contains date and description |  | ||||||
|      assets:bank:checking  $1    ; <- posting lines start with whitespace, each contains an account name |  | ||||||
|      income:salary        $-1    ;    followed by at least two spaces and an amount |  | ||||||
|   |  | ||||||
|  2008/06/01 gift |  | ||||||
|      assets:bank:checking  $1    ; <- at least two postings in a transaction |  | ||||||
|      income:gifts         $-1    ; <- their amounts must balance to 0 |  | ||||||
|   |  | ||||||
|  2008/06/02 save |  | ||||||
|      assets:bank:saving    $1 |  | ||||||
|      assets:bank:checking        ; <- one amount may be omitted; here $-1 is inferred |  | ||||||
|   |  | ||||||
|  2008/06/03 eat & shop           ; <- description can be anything |  | ||||||
|      expenses:food         $1 |  | ||||||
|      expenses:supplies     $1    ; <- this transaction debits two expense accounts |  | ||||||
|      assets:cash                 ; <- $-2 inferred |  | ||||||
|   |  | ||||||
|  2008/12/31 * pay off            ; <- an optional * after the date means "cleared" (or anything you want) |  | ||||||
|      liabilities:debts     $1 |  | ||||||
|      assets:bank:checking |  | ||||||
| 
 |  | ||||||
| Each transaction has a date, description, and two or more postings (of |  | ||||||
| some amount to some account) which must balance to 0. As a convenience, |  | ||||||
| one posting's amount may be left blank and will be inferred. |  | ||||||
| 
 |  | ||||||
| Note that account names may contain single spaces, while the amount must |  | ||||||
| be separated from the account name by at least two spaces. |  | ||||||
| 
 |  | ||||||
| An amount is a number, with an optional currency/commodity symbol or word |  | ||||||
| on either the left or right. Note: when writing a negative amount with a |  | ||||||
| left-side currency symbol, the minus goes after the symbol, eg ``$-1``. |  | ||||||
| 
 |  | ||||||
| This file format is also compatible with c++ ledger, so you can use both tools. |  | ||||||
| For more details, see `File format compatibility <#file-format-compatibility>`_. |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| Reference |  | ||||||
| ::::::::: |  | ||||||
| 
 |  | ||||||
| Overview |  | ||||||
| ........ |  | ||||||
| 
 |  | ||||||
| This version of hledger mimics a subset of ledger 3.x, and adds some |  | ||||||
| features of its own. We currently support regular ledger entries, timelog |  | ||||||
| entries, multiple commodities, (fixed) price history, virtual postings, |  | ||||||
| filtering by account and description, the familiar print, register & |  | ||||||
| balance commands and several new commands. We handle (almost) the full |  | ||||||
| period expression syntax, and very limited display expressions consisting |  | ||||||
| of a simple date predicate. |  | ||||||
| 
 |  | ||||||
| Here is the command-line help:: |  | ||||||
| 
 |  | ||||||
|  Usage: hledger [OPTIONS] [COMMAND [PATTERNS]] |  | ||||||
|         hledger [OPTIONS] convert CSVFILE |  | ||||||
|         hledger [OPTIONS] stats |  | ||||||
| 
 |  | ||||||
|  hledger uses your ~/.ledger or $LEDGER file, or another specified with -f |  | ||||||
| 
 |  | ||||||
|  COMMAND is one of (may be abbreviated): |  | ||||||
|   add       - prompt for new transactions and add them to the ledger |  | ||||||
|   balance   - show accounts, with balances |  | ||||||
|   convert   - read CSV bank data and display in ledger format |  | ||||||
|   histogram - show a barchart of transactions per day or other interval |  | ||||||
|   print     - show transactions in ledger format |  | ||||||
|   register  - show transactions as a register with running balance |  | ||||||
|   stats     - show various statistics for a ledger |  | ||||||
|   ui        - run a simple text-based UI |  | ||||||
|   web       - run a simple web-based UI |  | ||||||
|   chart     - generate balances pie chart |  | ||||||
|   test      - run self-tests |  | ||||||
| 
 |  | ||||||
|  PATTERNS are regular expressions which filter by account name. |  | ||||||
|  Prefix with desc: to filter by transaction description instead. |  | ||||||
|  Prefix with not: to negate a pattern. When using both, not: comes last. |  | ||||||
| 
 |  | ||||||
|  DATES can be y/m/d or ledger-style smart dates like "last month". |  | ||||||
| 
 |  | ||||||
|  Options: |  | ||||||
|   -f FILE  --file=FILE          use a different ledger/timelog file; - means stdin |  | ||||||
|            --no-new-accounts    don't allow to create new accounts |  | ||||||
|   -b DATE  --begin=DATE         report on transactions on or after this date |  | ||||||
|   -e DATE  --end=DATE           report on transactions before this date |  | ||||||
|   -p EXPR  --period=EXPR        report on transactions during the specified period |  | ||||||
|                                 and/or with the specified reporting interval |  | ||||||
|   -C       --cleared            report only on cleared transactions |  | ||||||
|   -U       --uncleared          report only on uncleared transactions |  | ||||||
|   -B       --cost, --basis      report cost of commodities |  | ||||||
|            --depth=N            hide accounts/transactions deeper than this |  | ||||||
|   -d EXPR  --display=EXPR       show only transactions matching EXPR (where |  | ||||||
|                                 EXPR is 'dOP[DATE]' and OP is <, <=, =, >=, >) |  | ||||||
|            --effective          use transactions' effective dates, if any |  | ||||||
|   -E       --empty              show empty/zero things which are normally elided |  | ||||||
|   -R       --real               report only on real (non-virtual) transactions |  | ||||||
|            --no-total           balance report: hide the final total |  | ||||||
|   -W       --weekly             register report: show weekly summary |  | ||||||
|   -M       --monthly            register report: show monthly summary |  | ||||||
|   -Q       --quarterly          register report: show quarterly summary |  | ||||||
|   -Y       --yearly             register report: show yearly summary |  | ||||||
|   -h       --help               show this help |  | ||||||
|   -V       --version            show version information |  | ||||||
|   -v       --verbose            show verbose test output |  | ||||||
|            --binary-filename    show the download filename for this hledger build |  | ||||||
|            --debug              show extra debug output; implies verbose |  | ||||||
|            --debug-no-ui        run ui commands with no output |  | ||||||
|   -o FILE  --output=FILE        chart: output filename (default: hledger.png) |  | ||||||
|            --items=N            chart: number of accounts to show (default: 10) |  | ||||||
|            --size=WIDTHxHEIGHT  chart: image size (default: 600x400) |  | ||||||
|   |  | ||||||
| Commands |  | ||||||
| ........ |  | ||||||
| 
 |  | ||||||
| Reporting commands |  | ||||||
| """""""""""""""""" |  | ||||||
| 
 |  | ||||||
| These commands are read-only, that is they never modify your data. |  | ||||||
| 
 |  | ||||||
| print |  | ||||||
| ''''' |  | ||||||
| 
 |  | ||||||
| The print command displays full transactions from the ledger file, tidily |  | ||||||
| formatted and showing all amounts explicitly. The output of print is |  | ||||||
| always valid ledger data.  |  | ||||||
| 
 |  | ||||||
| hledger's print command also shows all unit prices in effect, or |  | ||||||
| (with -B/--cost) shows cost amounts. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger print |  | ||||||
|  $ hledger print employees:bob | hledger -f- register expenses |  | ||||||
| 
 |  | ||||||
| register |  | ||||||
| '''''''' |  | ||||||
| 
 |  | ||||||
| The register command displays postings, one per line, and their running |  | ||||||
| total.  With a `reporting interval <#reporting-interval>`_ it will |  | ||||||
| aggregate similar postings within each interval. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger register |  | ||||||
|  $ hledger register --monthly -E rent |  | ||||||
| 
 |  | ||||||
| balance |  | ||||||
| ''''''' |  | ||||||
| 
 |  | ||||||
| The balance command displays accounts and their balances. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger balance |  | ||||||
|  $ hledger balance food -p 'last month' |  | ||||||
|  $ for y in 2006 2007 2008 2009 2010; do echo; echo $y; hledger -f $y.ledger balance ^expenses --depth 2; done |  | ||||||
| 
 |  | ||||||
| chart |  | ||||||
| ''''' |  | ||||||
| 
 |  | ||||||
| (optional feature) |  | ||||||
| 
 |  | ||||||
| The chart command saves a pie chart of your top account balances to an |  | ||||||
| image file (usually "hledger.png", or use -o/--output FILE). You can adjust the |  | ||||||
| image resolution with --size=WIDTHxHEIGHT, and the number of accounts with |  | ||||||
| --items=N. |  | ||||||
| 
 |  | ||||||
| Note that positive and negative balances will not be displayed together in |  | ||||||
| the same chart; any balances not matching the sign of the first one will |  | ||||||
| be omitted. |  | ||||||
| 
 |  | ||||||
| To show only accounts above a certain depth, use the --depth option. |  | ||||||
| Otherwise, the chart can include accounts at any depth. If a parent and |  | ||||||
| child account are both displayed, the parent's balance excludes the child's. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger chart assets --depth 2 |  | ||||||
|  $ hledger chart liabilities --depth 2 |  | ||||||
|  $ hledger chart ^expenses -o balance.png --size 1000x600 --items 20 |  | ||||||
|  $ for m in 01 02 03 04 05 06 07 08 09 10 11 12; do hledger -p 2009/$m chart ^expenses --depth 2 -o expenses-2009$m.png --size 400x300; done |  | ||||||
| 
 |  | ||||||
| histogram |  | ||||||
| ''''''''' |  | ||||||
| 
 |  | ||||||
| The histogram command displays a quick bar chart showing transaction |  | ||||||
| counts, per day, week, month or other reporting interval. It is |  | ||||||
| experimental. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger histogram -p weekly dining |  | ||||||
| 
 |  | ||||||
| stats |  | ||||||
| ''''' |  | ||||||
| 
 |  | ||||||
| The stats command displays quick summary information for the ledger. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger stats |  | ||||||
| 
 |  | ||||||
| ui |  | ||||||
| ''' |  | ||||||
| 
 |  | ||||||
| (optional feature) |  | ||||||
| 
 |  | ||||||
| The ui command starts hledger's curses (full-screen, text) user interface, |  | ||||||
| which allows interactive navigation of the print/register/balance reports. |  | ||||||
| This lets you browse around your numbers and get quick insights with less |  | ||||||
| typing. |  | ||||||
| 
 |  | ||||||
| Examples: |  | ||||||
| 
 |  | ||||||
| $ hledger ui |  | ||||||
| $ hledger ui -BE food |  | ||||||
| 
 |  | ||||||
| Modifying commands |  | ||||||
| """""""""""""""""" |  | ||||||
| 
 |  | ||||||
| The following commands can alter your ledger file. |  | ||||||
| 
 |  | ||||||
| add |  | ||||||
| ''' |  | ||||||
| 
 |  | ||||||
| The add command prompts interactively for new transactions, and adds them |  | ||||||
| to the ledger. It is experimental. |  | ||||||
| 
 |  | ||||||
| Examples: |  | ||||||
| 
 |  | ||||||
| $ hledger add |  | ||||||
| $ hledger add accounts:personal:bob |  | ||||||
| 
 |  | ||||||
| web |  | ||||||
| ''' |  | ||||||
| 
 |  | ||||||
| (optional feature) |  | ||||||
| 
 |  | ||||||
| The web command starts hledger's web interface, and tries to open a web |  | ||||||
| browser to view it (if this fails, you'll have to visit the indicated url |  | ||||||
| yourself.) The web ui combines the features of the print, register, |  | ||||||
| balance and add commands. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger web |  | ||||||
|  $ hledger web --debug -f demo.ledger -p thisyear |  | ||||||
| 
 |  | ||||||
| Other commands |  | ||||||
| """""""""""""" |  | ||||||
| 
 |  | ||||||
| convert |  | ||||||
| ''''''' |  | ||||||
| 
 |  | ||||||
| The convert command reads a CSV_ file you have downloaded from your bank, |  | ||||||
| and prints out the transactions in ledger format, suitable for adding to |  | ||||||
| your ledger. It does not alter your ledger directly. |  | ||||||
| 
 |  | ||||||
| This can be a lot quicker than entering every transaction by hand. (The |  | ||||||
| downside is that you are less likely to notice if your bank makes an |  | ||||||
| error!) Use it like this:: |  | ||||||
| 
 |  | ||||||
|  $ hledger convert FILE.csv >FILE.ledger |  | ||||||
| 
 |  | ||||||
| where FILE.csv is your downloaded csv file. This will convert the csv data |  | ||||||
| using conversion rules defined in FILE.rules (auto-creating this file if |  | ||||||
| needed), and save the output into a temporary ledger file.  Then you |  | ||||||
| should review FILE.ledger for problems; update the rules and convert again |  | ||||||
| if needed; and finally copy/paste transactions which are new into your |  | ||||||
| main ledger. |  | ||||||
| 
 |  | ||||||
| .rules file |  | ||||||
| ,,,,,,,,,,, |  | ||||||
| 
 |  | ||||||
| convert requires a \*.rules file containing data definitions and rules for |  | ||||||
| assigning destination accounts to transactions; it will be auto-created if |  | ||||||
| missing. Typically you will have one csv file and one rules file per bank |  | ||||||
| account. Here's an example rules file for converting csv data from a Wells |  | ||||||
| Fargo checking account:: |  | ||||||
| 
 |  | ||||||
|  base-account assets:bank:checking |  | ||||||
|  date-field 0 |  | ||||||
|  description-field 4 |  | ||||||
|  amount-field 1 |  | ||||||
|  currency $ |  | ||||||
| 
 |  | ||||||
|  # account-assigning rules |  | ||||||
| 
 |  | ||||||
|  SPECTRUM |  | ||||||
|  expenses:health:gym |  | ||||||
| 
 |  | ||||||
|  ITUNES |  | ||||||
|  BLKBSTR=BLOCKBUSTER |  | ||||||
|  expenses:entertainment |  | ||||||
| 
 |  | ||||||
|  (TO|FROM) SAVINGS |  | ||||||
|  assets:bank:savings |  | ||||||
| 
 |  | ||||||
| This says: |  | ||||||
| 
 |  | ||||||
| - the ledger account corresponding to this csv file is assets:bank:checking |  | ||||||
| - the first csv field is the date, the second is the amount, the fifth is the description |  | ||||||
| - prepend a dollar sign to the amount field |  | ||||||
| - if description contains SPECTRUM (case-insensitive), the transaction is a gym expense |  | ||||||
| - if description contains ITUNES or BLKBSTR, the transaction is an entertainment expense; also rewrite BLKBSTR as BLOCKBUSTER |  | ||||||
| - if description contains TO SAVINGS or FROM SAVINGS, the transaction is a savings transfer |  | ||||||
| 
 |  | ||||||
| Notes: |  | ||||||
| 
 |  | ||||||
| - Lines beginning with # or ; are ignored (but avoid using inside an account rule) |  | ||||||
| 
 |  | ||||||
| - Definitions must come first, one per line, all in one paragraph.  Each |  | ||||||
|   is a name and a value separated by whitespace. Supported names are: |  | ||||||
|   base-account, date-field, status-field, code-field, description-field, |  | ||||||
|   amount-field, currency-field, currency. All are optional and will |  | ||||||
|   use defaults if not specified. |  | ||||||
| 
 |  | ||||||
| - The remainder of the file is account-assigning rules. Each is a |  | ||||||
|   paragraph consisting of one or more description-matching patterns |  | ||||||
|   (case-insensitive regular expressions), one per line, followed by the |  | ||||||
|   account name to use when the transaction's description matches any of |  | ||||||
|   these patterns. |  | ||||||
| 
 |  | ||||||
| - A match pattern may be followed by a replacement pattern, separated by |  | ||||||
|   ``=``, which rewrites the matched part of the description.  Use this if |  | ||||||
|   you want to clean up messy bank data.  To rewrite the entire description, |  | ||||||
|   use a match pattern like ``.*PAT.*=REPL``. Within a replacement pattern, |  | ||||||
|   you can refer to the matched text with ``\0`` and any regex groups |  | ||||||
|   with ``\1``, ``\2`` in the usual way. |  | ||||||
| 
 |  | ||||||
| test |  | ||||||
| '''' |  | ||||||
| 
 |  | ||||||
| This command runs hledger's internal self-tests and displays a quick |  | ||||||
| report.  The -v option shows more detail, and a pattern can be provided to |  | ||||||
| filter tests by name. It's mainly used in development, but it's also nice |  | ||||||
| to be able to run a sanity check at any time.. |  | ||||||
| 
 |  | ||||||
| Examples:: |  | ||||||
| 
 |  | ||||||
|  $ hledger test |  | ||||||
|  $ hledger test -v balance |  | ||||||
| 
 |  | ||||||
| Other features |  | ||||||
| .............. |  | ||||||
| 
 |  | ||||||
| Filter patterns |  | ||||||
| """"""""""""""" |  | ||||||
| 
 |  | ||||||
| Most commands accept one or more filter pattern arguments after the command |  | ||||||
| name, to select a subset of transactions or postings. There are two kinds |  | ||||||
| of pattern: |  | ||||||
| 
 |  | ||||||
| - an account pattern, which is a regular expression. This is matched |  | ||||||
|   against postings' accounts. Optionally, it may be prefixed with ``not:`` |  | ||||||
|   in which case the match is negated. |  | ||||||
| 
 |  | ||||||
| - a description pattern, like the above but prefixed with ``desc:``. This |  | ||||||
|   is matched against transactions' descriptions. Note, when negating a |  | ||||||
|   desc: pattern, not: goes last, eg: ``desc:not:someregexp``. |  | ||||||
| 
 |  | ||||||
| When you specify multiple filter patterns, hledger generally selects the |  | ||||||
| transactions or postings which match (or negatively match) |  | ||||||
| 
 |  | ||||||
|  *any of the account patterns* AND *any of the description patterns* |  | ||||||
| 
 |  | ||||||
| The `print <#print>`_ command selects transactions which |  | ||||||
| 
 |  | ||||||
|  *match any of the description patterns* AND |  | ||||||
|  *have any postings matching any of the positive account patterns* AND |  | ||||||
|  *have no postings matching any of the negative account patterns* |  | ||||||
| 
 |  | ||||||
| Dates |  | ||||||
| """"" |  | ||||||
| 
 |  | ||||||
| Simple dates |  | ||||||
| '''''''''''' |  | ||||||
| 
 |  | ||||||
| Within a ledger file, dates must follow a fairly simple year/month/day |  | ||||||
| format. Examples: |  | ||||||
| 
 |  | ||||||
|  ``2010/01/31`` or ``2010/1/31`` or ``2010-1-31`` or ``2010.1.31`` |  | ||||||
| 
 |  | ||||||
| The `add <#add>`_ command and the `web <#web>`_ add form, as well as |  | ||||||
| some other places, accept `smart dates <#smart-dates>`_ - more about |  | ||||||
| those below. |  | ||||||
| 
 |  | ||||||
| Default year |  | ||||||
| '''''''''''' |  | ||||||
| 
 |  | ||||||
| You can set a default year with a ``Y`` directive in the ledger, then |  | ||||||
| subsequent dates may be written as month/day. Eg:: |  | ||||||
| 
 |  | ||||||
|  Y2009 |  | ||||||
| 
 |  | ||||||
|  12/15 ... |  | ||||||
| 
 |  | ||||||
|  Y2010 |  | ||||||
| 
 |  | ||||||
|  1/31 ... |  | ||||||
| 
 |  | ||||||
| Actual and effective dates |  | ||||||
| '''''''''''''''''''''''''' |  | ||||||
| 
 |  | ||||||
| Frequently, a real-life transaction has two (or more) dates of |  | ||||||
| interest. For example, you might make a purchase on friday with a |  | ||||||
| debit card, and it might clear (take effect in your bank account) on |  | ||||||
| tuesday. It's sometimes useful to model this accurately, so that your |  | ||||||
| hledger balances match reality. So, you can specify two dates for a |  | ||||||
| transaction, the *actual* and *effective* date, separated by |  | ||||||
| ``=``. Eg:: |  | ||||||
| 
 |  | ||||||
|  2010/2/19=2010/2/23 ... |  | ||||||
| 
 |  | ||||||
| Then you can use the ``--effective`` flag to prefer the effective |  | ||||||
| (second) date, if any, in reports. This is useful for, eg, seeing a |  | ||||||
| more accurate daily balance while reconciling a bank account. |  | ||||||
| 
 |  | ||||||
| So, what do *actual* and *effective* mean, exactly ? I always assumed |  | ||||||
| that the actual date comes first, and is "the date you enacted the |  | ||||||
| transaction", while the effective date comes second, and is optional, |  | ||||||
| and is "the date the transaction took effect" (showed up in your bank |  | ||||||
| balance). |  | ||||||
| 
 |  | ||||||
| Unfortunately, this is the reverse of c++ ledger's interpretation |  | ||||||
| (cf `differences <#other-differences>`_). |  | ||||||
| However it's not *too* serious; just remember that hledger requires |  | ||||||
| the first date; allows an optional second date which the |  | ||||||
| ``--effective`` flag will select; and the meaning of "actual" and |  | ||||||
| "effective" is up to you. |  | ||||||
| 
 |  | ||||||
| The second date may omit the year if it is the same as the first's. |  | ||||||
| 
 |  | ||||||
| Smart dates |  | ||||||
| ''''''''''' |  | ||||||
| 
 |  | ||||||
| In `period expressions <#period-expressions>`_, the ``-b`` and ``-e`` |  | ||||||
| options, the `add <#add>`_ command and the `web <#web>`_ add form, |  | ||||||
| more flexible "smart dates" are allowed. Here are some examples: |  | ||||||
| 
 |  | ||||||
| - ``2009/1/1``, ``2009/01/01``, ``2009-1-1``, ``2009.1.1``, ``2009/1``, ``2009`` (january 1, 2009) |  | ||||||
| - ``1/1``, ``january``, ``jan``, ``this year`` (january 1, this year) |  | ||||||
| - ``next year`` (january 1, next year) |  | ||||||
| - ``this month`` (the 1st of the current month) |  | ||||||
| - ``this week`` (the most recent monday) |  | ||||||
| - ``last week`` (the monday of the week before this one) |  | ||||||
| - ``today``, ``yesterday``, ``tomorrow`` |  | ||||||
| 
 |  | ||||||
| Spaces are optional, so eg: ``-p lastmonth`` is valid. |  | ||||||
| 
 |  | ||||||
| Period expressions |  | ||||||
| """""""""""""""""" |  | ||||||
| 
 |  | ||||||
| hledger supports flexible "period expressions" with the ``-p/--period`` |  | ||||||
| option to select transactions within a period of time (like 2009) and/or |  | ||||||
| with a reporting interval (like weekly). hledger period expressions are |  | ||||||
| similar but not identical to c++ ledger's. |  | ||||||
| 
 |  | ||||||
| Here is a basic period expression specifying the first quarter of 2009 |  | ||||||
| (start date is always included, end date is always excluded):: |  | ||||||
| 
 |  | ||||||
|  -p "from 2009/1/1 to 2009/4/1" |  | ||||||
| 
 |  | ||||||
| Keywords like "from" and "to" are optional, and so are the spaces. Just |  | ||||||
| don't run two dates together:: |  | ||||||
| 
 |  | ||||||
|  -p2009/1/1to2009/4/1 |  | ||||||
|  -p"2009/1/1 2009/4/1" |  | ||||||
| 
 |  | ||||||
| Dates are `smart dates <#smart-dates>`_, so if the current year is 2009, the above can also |  | ||||||
| be written as:: |  | ||||||
| 
 |  | ||||||
|  -p "1/1 to 4/1" |  | ||||||
|  -p "january to apr" |  | ||||||
|  -p "this year to 4/1" |  | ||||||
| 
 |  | ||||||
| If you specify only one date, the missing start or end date will be the |  | ||||||
| earliest or latest transaction in your ledger data:: |  | ||||||
| 
 |  | ||||||
|  -p "from 2009/1/1"  (everything after january 1, 2009) |  | ||||||
|  -p "from 2009/1"    (the same) |  | ||||||
|  -p "from 2009"      (the same) |  | ||||||
|  -p "to 2009"        (everything before january 1, 2009) |  | ||||||
| 
 |  | ||||||
| A single date with no "from" or "to" defines both the start and end date like so:: |  | ||||||
| 
 |  | ||||||
|  -p "2009"           (the year 2009;    equivalent to "2009/1/1 to 2010/1/1") |  | ||||||
|  -p "2009/1"         (the month of jan; equivalent to "2009/1/1 to 2009/2/1") |  | ||||||
|  -p "2009/1/1"       (just that day;    equivalent to "2009/1/1 to 2009/1/2") |  | ||||||
| 
 |  | ||||||
| Reporting interval |  | ||||||
| '''''''''''''''''' |  | ||||||
| 
 |  | ||||||
| You can also specify a reporting interval, which causes the "register" |  | ||||||
| command to summarise the transactions in each interval. It goes before the |  | ||||||
| dates, and can be: "daily", "weekly", "monthly", "quarterly", or |  | ||||||
| "yearly". An "in" keyword is optional, and so are the dates:: |  | ||||||
| 
 |  | ||||||
|  -p "weekly from 2009/1/1 to 2009/4/1" |  | ||||||
|  -p "monthly in 2008" |  | ||||||
|  -p "monthly from 2008" |  | ||||||
|  -p "quarterly" |  | ||||||
| 
 |  | ||||||
| A reporting interval may also be specified with the -W/--weekly, |  | ||||||
| -M/--monthly, -Q/--quarterly, and -Y/--yearly options. However.. |  | ||||||
| 
 |  | ||||||
| -p overrides other flags |  | ||||||
| '''''''''''''''''''''''' |  | ||||||
| 
 |  | ||||||
| Note: any period option on the command line will override the -b, -e, -W, -Q and -Y flags. |  | ||||||
| 
 |  | ||||||
| Display expressions |  | ||||||
| """"""""""""""""""" |  | ||||||
| 
 |  | ||||||
| A display expression with the ``-d/--display`` option selects which |  | ||||||
| transactions will be displayed (unlike a `period expression |  | ||||||
| <#period-expressions>`_, which selects the transactions to be used for |  | ||||||
| calculation). |  | ||||||
| 
 |  | ||||||
| hledger currently supports a very small subset of c++ ledger's display |  | ||||||
| expressions, namely: transactions before or after a date. This is useful |  | ||||||
| for displaying your recent check register with an accurate running total. |  | ||||||
| Note the use of >= here to include the first of the month:: |  | ||||||
| 
 |  | ||||||
|  $ hledger register -d "d>=[this month]" |  | ||||||
| 
 |  | ||||||
| Depth limiting |  | ||||||
| """""""""""""" |  | ||||||
| 
 |  | ||||||
| With the ``--depth N`` option, reports will show only the uppermost |  | ||||||
| accounts in the account tree, down to level N. This is most useful with |  | ||||||
| `balance <#balance>`_ (and `chart <#chart>`_). For example:: |  | ||||||
| 
 |  | ||||||
|  $ hledger balance --depth 2 |  | ||||||
| 
 |  | ||||||
| shows a more concise balance report displaying only the top two levels of |  | ||||||
| accounts.  This example with `register <#register>`_:: |  | ||||||
| 
 |  | ||||||
|  $ hledger register --depth 1 |  | ||||||
| 
 |  | ||||||
| would show only the postings to top-level accounts, which usually means |  | ||||||
| none. |  | ||||||
| 
 |  | ||||||
| Prices |  | ||||||
| """""" |  | ||||||
| 
 |  | ||||||
| You can specify a commodity's unit price, or exchange rate, in terms of |  | ||||||
| another commodity. There are two ways. |  | ||||||
| 
 |  | ||||||
| First, you can set the price explicitly for a single posting by writing |  | ||||||
| ``@ PRICE`` after the amount. PRICE is another amount in a different |  | ||||||
| commodity. Eg, here one hundred euros was purchased at $1.35 per euro:: |  | ||||||
| 
 |  | ||||||
|     2009/1/2 x |  | ||||||
|      expenses:foreign currency       €100 @ $1.35 |  | ||||||
|      assets |  | ||||||
| 
 |  | ||||||
| Secondly, you can set the price for a commodity as of a certain date, by |  | ||||||
| entering a historical price record. These are lines beginning with "P", |  | ||||||
| appearing anywhere in the ledger between transactions.  Eg, here we say |  | ||||||
| the exchange rate for 1 euro is $1.35 on 2009/1/1 (and thereafter, until a |  | ||||||
| newer price record is found):: |  | ||||||
| 
 |  | ||||||
|     P 2009/1/1 € $1.35  ; <- historical price: P, date, commodity symbol, price in 2nd commodity (space-separated) |  | ||||||
| 
 |  | ||||||
|     2009/1/2 x |  | ||||||
|      expenses:foreign currency       €100 |  | ||||||
|      assets |  | ||||||
| 
 |  | ||||||
| The print command shows any unit prices in effect. Either example above |  | ||||||
| will show:: |  | ||||||
| 
 |  | ||||||
|  $ hledger print |  | ||||||
|  2009/01/02 x |  | ||||||
|      expenses:foreign currency  €100 @ $1.35 |  | ||||||
|      assets                     €-100 @ $1.35 |  | ||||||
| 
 |  | ||||||
| To see amounts converted to their total cost, use the ``--cost/-B`` flag |  | ||||||
| with any command:: |  | ||||||
| 
 |  | ||||||
|  $ hledger print --cost |  | ||||||
|  2009/01/02 x |  | ||||||
|      expenses:foreign currency       $135.00 |  | ||||||
|      assets                         $-135.00 |  | ||||||
| 
 |  | ||||||
| The ``--cost/-B`` flag does only one lookup step, ie it will not look up |  | ||||||
| the price of a price's commodity. |  | ||||||
| 
 |  | ||||||
| Note hledger handles prices differently from c++ ledger in one important |  | ||||||
| respect: we assume unit prices do not vary over time.  This is good for |  | ||||||
| simple reporting of foreign currency transactions, but not for tracking |  | ||||||
| fluctuating-value investments or capital gains. |  | ||||||
| 
 |  | ||||||
| Timelog reporting |  | ||||||
| """"""""""""""""" |  | ||||||
| 
 |  | ||||||
| hledger will also read timelog files in timeclock.el format.  As a |  | ||||||
| convenience, if you invoke hledger via an "hours" symlink or copy, it uses |  | ||||||
| your timelog file (~/.timelog or $TIMELOG) by default, rather than your ledger. |  | ||||||
| 
 |  | ||||||
| Timelog entries look like this:: |  | ||||||
| 
 |  | ||||||
|  i 2009/03/31 22:21:45 some:project |  | ||||||
|  o 2009/04/01 02:00:34 |  | ||||||
| 
 |  | ||||||
| The clockin description is treated as an account name. Here are some |  | ||||||
| queries to try (after downloading sample.timelog_):: |  | ||||||
| 
 |  | ||||||
|  ln -s `which hledger` ~/bin/hours            # set up "hours" in your path |  | ||||||
|  export TIMELOG=sample.timelog |  | ||||||
|  hours                                        # show all time balances |  | ||||||
|  hours -p 'last week'                         # last week |  | ||||||
|  hours -p thismonth                           # the space is optional |  | ||||||
|  hours -p 'from 1/15' register project        # project sessions since jan 15 |  | ||||||
|  hours -p 'weekly' reg --depth 1 -E           # weekly time summary |  | ||||||
| 
 |  | ||||||
| This is a useful feature, if you can find a way to efficiently record |  | ||||||
| timelog entries. The "ti" and "to" scripts may be available from the c++ |  | ||||||
| ledger 2.x repository. I use |  | ||||||
| `timeclock-x.el <http://www.emacswiki.org/emacs/timeclock-x.el>`_ and |  | ||||||
| `ledgerutils.el <http://joyful.com/repos/ledgertools/ledgerutils.el>`_  |  | ||||||
| in emacs. |  | ||||||
| 
 |  | ||||||
| Compatibility with c++ ledger |  | ||||||
| ............................. |  | ||||||
| 
 |  | ||||||
| Implementation |  | ||||||
| """""""""""""" |  | ||||||
| 
 |  | ||||||
| Unlike c++ ledger, hledger is written in the Haskell programming |  | ||||||
| language. Haskell enables a coding style known as pure lazy functional |  | ||||||
| programming, which holds the promise of more robust and maintainable |  | ||||||
| software built with fewer lines of code. Haskell also provides a more |  | ||||||
| abstracted, portable platform which can make deployment and installation |  | ||||||
| easier in some cases. Haskell also brings some new challenges such as |  | ||||||
| managing memory growth. |  | ||||||
| 
 |  | ||||||
| File format compatibility |  | ||||||
| """"""""""""""""""""""""" |  | ||||||
| 
 |  | ||||||
| hledger's file format is mostly identical with that of c++ ledger version 2, with |  | ||||||
| some features (like modifier and periodic entries) being accepted, but |  | ||||||
| ignored. There are also some subtle differences in parser behaviour (eg |  | ||||||
| comments may be permissible in different places.) C++ ledger version 3 has |  | ||||||
| introduced additional syntax, which current hledger probably fails to |  | ||||||
| parse. |  | ||||||
| 
 |  | ||||||
| Generally, it's easy to keep a ledger file that works with both hledger |  | ||||||
| and c++ledger if you avoid the more esoteric syntax. Occasionally you'll |  | ||||||
| need to make small edits to restore compatibility for one or the other. |  | ||||||
| 
 |  | ||||||
| Features not supported |  | ||||||
| """""""""""""""""""""" |  | ||||||
| 
 |  | ||||||
| c++ ledger features not currently supported include: modifier and periodic |  | ||||||
| entries, and the following c++ ledger options and commands:: |  | ||||||
| 
 |  | ||||||
|    Basic options: |  | ||||||
|    -o, --output FILE      write output to FILE |  | ||||||
|    -i, --init-file FILE   initialize ledger using FILE (default: ~/.ledgerrc) |  | ||||||
|    -a, --account NAME     use NAME for the default account (useful with QIF) |  | ||||||
|   |  | ||||||
|    Report filtering: |  | ||||||
|    -c, --current          show only current and past entries (not future) |  | ||||||
|        --period-sort EXPR sort each report period's entries by EXPR |  | ||||||
|    -L, --actual           consider only actual (non-automated) transactions |  | ||||||
|    -r, --related          calculate report using related transactions |  | ||||||
|        --budget           generate budget entries based on periodic entries |  | ||||||
|        --add-budget       show all transactions plus the budget |  | ||||||
|        --unbudgeted       show only unbudgeted transactions |  | ||||||
|        --forecast EXPR    generate forecast entries while EXPR is true |  | ||||||
|    -l, --limit EXPR       calculate only transactions matching EXPR |  | ||||||
|    -t, --amount EXPR      use EXPR to calculate the displayed amount |  | ||||||
|    -T, --total EXPR       use EXPR to calculate the displayed total |  | ||||||
|   |  | ||||||
|    Output customization: |  | ||||||
|    -n, --collapse         Only show totals in the top-most accounts. |  | ||||||
|    -s, --subtotal         other: show subtotals |  | ||||||
|    -P, --by-payee         show summarized totals by payee |  | ||||||
|    -x, --comm-as-payee    set commodity name as the payee, for reporting |  | ||||||
|        --dow              show a days-of-the-week report |  | ||||||
|    -S, --sort EXPR        sort report according to the value expression EXPR |  | ||||||
|    -w, --wide             for the default register report, use 132 columns |  | ||||||
|        --head COUNT       show only the first COUNT entries (negative inverts) |  | ||||||
|        --tail COUNT       show only the last COUNT entries (negative inverts) |  | ||||||
|        --pager PAGER      send all output through the given PAGER program |  | ||||||
|    -A, --average          report average transaction amount |  | ||||||
|    -D, --deviation        report deviation from the average |  | ||||||
|    -%, --percentage       report balance totals as a percentile of the parent |  | ||||||
|        --totals           in the "xml" report, include running total |  | ||||||
|    -j, --amount-data      print only raw amount data (useful for scripting) |  | ||||||
|    -J, --total-data       print only raw total data |  | ||||||
|    -y, --date-format STR  use STR as the date format (default: %Y/%m/%d) |  | ||||||
|    -F, --format STR       use STR as the format; for each report type, use: |  | ||||||
|        --balance-format      --register-format       --print-format |  | ||||||
|        --plot-amount-format  --plot-total-format     --equity-format |  | ||||||
|        --prices-format       --wide-register-format |  | ||||||
|   |  | ||||||
|    Commodity reporting: |  | ||||||
|        --price-db FILE    sets the price database to FILE (def: ~/.pricedb) |  | ||||||
|    -L, --price-exp MINS   download quotes only if newer than MINS (def: 1440) |  | ||||||
|    -Q, --download         download price information when needed |  | ||||||
|    -O, --quantity         report commodity totals (this is the default) |  | ||||||
|    -V, --market           report last known market value |  | ||||||
|    -g, --performance      report gain/loss for each displayed transaction |  | ||||||
|    -G, --gain             report net gain/loss |  | ||||||
|   |  | ||||||
|    Commands: |  | ||||||
|    xml      [REGEXP]...   print matching entries in XML format |  | ||||||
|    equity   [REGEXP]...   output equity entries for matching accounts |  | ||||||
|    prices   [REGEXP]...   display price history for matching commodities |  | ||||||
|    entry DATE PAYEE AMT   output a derived entry, based on the arguments |  | ||||||
| 
 |  | ||||||
| Other differences |  | ||||||
| """"""""""""""""" |  | ||||||
| 
 |  | ||||||
| * hledger recognises description and negative patterns by  "desc:" and "not:" prefixes, |  | ||||||
|   unlike ledger 3's free-form parser |  | ||||||
| * hledger doesn't require a space before command-line option values, you can write -f- |  | ||||||
| * hledger's weekly reporting intervals always start on mondays |  | ||||||
| * hledger shows start and end dates of the intervals requested, not just the span containing data |  | ||||||
| * hledger period expressions don't support "biweekly", "bimonthly", or "every N days/weeks/..."  |  | ||||||
| * hledger always shows timelog balances in hours |  | ||||||
| * hledger splits multi-day timelog sessions at midnight |  | ||||||
| * hledger doesn't track the value of commodities with varying price; |  | ||||||
|   prices are fixed as of the transaction date |  | ||||||
| * hledger print shows amounts for all postings, and shows unit prices for amounts which have them |  | ||||||
| * hledger assumes a transaction's actual date comes first, and is required, while the optional effective date comes second (cf `Actual and effective dates <#actual-and-effective-dates>`_) |  | ||||||
| * hledger does not support per-posting actual or effective dates |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| More examples and recipes |  | ||||||
| ......................... |  | ||||||
| 
 |  | ||||||
| - Here's a bash function that will run hledger chart and display |  | ||||||
|   the image in your (graphical) emacs:: |  | ||||||
| 
 |  | ||||||
|    function chart () { |  | ||||||
|      hledger chart $* && emacsclient -n hledger.png |  | ||||||
|    } |  | ||||||
| 
 |  | ||||||
|   Example:: |  | ||||||
| 
 |  | ||||||
|    $ chart food --depth 2 -p jan |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| .. ...................................................................... |  | ||||||
| 
 |  | ||||||
| .. _hledger for techies:   README2.html |  | ||||||
| .. _c++ ledger's manual:   http://joyful.com/repos/ledger/doc/ledger.html |  | ||||||
| .. _John Wiegley's ledger: http://wiki.github.com/jwiegley/ledger |  | ||||||
| .. _sample.ledger:         http://joyful.com/repos/hledger/sample.ledger |  | ||||||
| .. _sample.timelog:        http://joyful.com/repos/hledger/sample.timelog |  | ||||||
| .. _binaries:              http://hledger.org/binaries/ |  | ||||||
| .. _Haskell Platform:      http://hackage.haskell.org/platform/ |  | ||||||
| .. _CSV:                   http://en.wikipedia.org/wiki/Comma-separated_values |  | ||||||
| .. _gtk2hs:                http://www.haskell.org/gtk2hs/download/ |  | ||||||
| @ -14,7 +14,7 @@ main = hakyll "http://hledger.org" $ do | |||||||
|       ,"README2.rst" |       ,"README2.rst" | ||||||
|       ,"NEWS.rst" |       ,"NEWS.rst" | ||||||
|       ,"SCREENSHOTS.rst" |       ,"SCREENSHOTS.rst" | ||||||
|       ,"MANUAL.rst" |       ,"MANUAL.markdown" | ||||||
|       ,"CONTRIBUTORS.rst" |       ,"CONTRIBUTORS.rst" | ||||||
|       ] |       ] | ||||||
|     mapM_ static |     mapM_ static | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user