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" | ||||
|       ,"NEWS.rst" | ||||
|       ,"SCREENSHOTS.rst" | ||||
|       ,"MANUAL.rst" | ||||
|       ,"MANUAL.markdown" | ||||
|       ,"CONTRIBUTORS.rst" | ||||
|       ] | ||||
|     mapM_ static | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user