mirror of
https://github.com/simonmichael/hledger.git
synced 2024-12-29 13:22:27 +03:00
;doc: hledger: merge examples, options, commands files
[ci skip]
This commit is contained in:
parent
d60b053e11
commit
078e9c8e9c
File diff suppressed because it is too large
Load Diff
@ -1,190 +0,0 @@
|
|||||||
# COMMANDS
|
|
||||||
|
|
||||||
hledger provides a number of subcommands; `hledger` with no arguments
|
|
||||||
shows a list.
|
|
||||||
|
|
||||||
If you install additional `hledger-*` packages, or if you put programs
|
|
||||||
or scripts named `hledger-NAME` in your PATH, these will also be
|
|
||||||
listed as subcommands.
|
|
||||||
|
|
||||||
Run a subcommand by writing its name as first argument (eg `hledger
|
|
||||||
incomestatement`). You can also write one of the standard short aliases
|
|
||||||
displayed in parentheses in the command list (`hledger b`), or any
|
|
||||||
any unambiguous prefix of a command name (`hledger inc`).
|
|
||||||
|
|
||||||
Here are all the builtin commands in alphabetical order.
|
|
||||||
See also `hledger` for a more organised command list,
|
|
||||||
and `hledger CMD -h` for detailed command help.
|
|
||||||
|
|
||||||
## accounts
|
|
||||||
|
|
||||||
_include_(Hledger/Cli/Commands/Accounts.md)
|
|
||||||
|
|
||||||
## activity
|
|
||||||
|
|
||||||
_include_(Hledger/Cli/Commands/Activity.md)
|
|
||||||
|
|
||||||
## add
|
|
||||||
|
|
||||||
_include_(Hledger/Cli/Commands/Add.md)
|
|
||||||
|
|
||||||
## balance
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Balance.md}})
|
|
||||||
|
|
||||||
## balancesheet
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Balancesheet.md}})
|
|
||||||
|
|
||||||
## balancesheetequity
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Balancesheetequity.md}})
|
|
||||||
|
|
||||||
## cashflow
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Cashflow.md}})
|
|
||||||
|
|
||||||
## check-dates
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Checkdates.md}})
|
|
||||||
|
|
||||||
## check-dupes
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Checkdupes.md}})
|
|
||||||
|
|
||||||
## close
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Close.md}})
|
|
||||||
|
|
||||||
## commodities
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Commodities.md}})
|
|
||||||
|
|
||||||
## descriptions
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Descriptions.md}})
|
|
||||||
|
|
||||||
## diff
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Diff.md}})
|
|
||||||
|
|
||||||
## files
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Files.md}})
|
|
||||||
|
|
||||||
## help
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Help.md}})
|
|
||||||
|
|
||||||
## import
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Import.md}})
|
|
||||||
|
|
||||||
## incomestatement
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Incomestatement.md}})
|
|
||||||
|
|
||||||
## notes
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Notes.md}})
|
|
||||||
|
|
||||||
## payees
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Payees.md}})
|
|
||||||
|
|
||||||
## prices
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Prices.md}})
|
|
||||||
|
|
||||||
## print
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Print.md}})
|
|
||||||
|
|
||||||
## print-unique
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Printunique.md}})
|
|
||||||
|
|
||||||
## register
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Register.md}})
|
|
||||||
|
|
||||||
## register-match
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Registermatch.md}})
|
|
||||||
|
|
||||||
## rewrite
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Rewrite.md}})
|
|
||||||
|
|
||||||
## roi
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Roi.md}})
|
|
||||||
|
|
||||||
## stats
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Stats.md}})
|
|
||||||
|
|
||||||
## tags
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Tags.md}})
|
|
||||||
|
|
||||||
## test
|
|
||||||
|
|
||||||
_include_({{Hledger/Cli/Commands/Test.md}})
|
|
||||||
|
|
||||||
|
|
||||||
## Add-on Commands
|
|
||||||
|
|
||||||
hledger also searches for external add-on commands, and will include these in the commands list.
|
|
||||||
These are programs or scripts in your PATH whose name starts with `hledger-`
|
|
||||||
and ends with a recognised file extension
|
|
||||||
(currently: no extension, `bat`,`com`,`exe`, `hs`,`lhs`,`pl`,`py`,`rb`,`rkt`,`sh`).
|
|
||||||
|
|
||||||
Add-ons can be invoked like any hledger command, but there are a few things to be aware of.
|
|
||||||
Eg if the `hledger-web` add-on is installed,
|
|
||||||
|
|
||||||
- `hledger -h web` shows hledger's help, while `hledger web -h` shows hledger-web's help.
|
|
||||||
|
|
||||||
- Flags specific to the add-on must have a preceding `--` to hide them from hledger.
|
|
||||||
So `hledger web --serve --port 9000` will be rejected; you must use `hledger web -- --serve --port 9000`.
|
|
||||||
|
|
||||||
- You can always run add-ons directly if preferred: `hledger-web --serve --port 9000`.
|
|
||||||
|
|
||||||
Add-ons are a relatively easy way to add local features or experiment with new ideas.
|
|
||||||
They can be written in any language, but haskell scripts have a big advantage:
|
|
||||||
they can use the same hledger (and haskell) library functions that built-in commands do,
|
|
||||||
for command-line options, journal parsing, reporting, etc.
|
|
||||||
|
|
||||||
Two important add-ons are the hledger-ui and hledger-web user interfaces.
|
|
||||||
These are maintained and released along with hledger:
|
|
||||||
|
|
||||||
### ui
|
|
||||||
[hledger-ui](hledger-ui.html) provides an efficient terminal interface.
|
|
||||||
|
|
||||||
### web
|
|
||||||
[hledger-web](hledger-web.html) provides a simple web interface.
|
|
||||||
|
|
||||||
Third party add-ons, maintained separately from hledger, include:
|
|
||||||
|
|
||||||
### iadd
|
|
||||||
|
|
||||||
[hledger-iadd](http://hackage.haskell.org/package/hledger-iadd)
|
|
||||||
is a more interactive, terminal UI replacement for the [add command](hledger.html#add).
|
|
||||||
|
|
||||||
### interest
|
|
||||||
|
|
||||||
[hledger-interest](http://hackage.haskell.org/package/hledger-interest)
|
|
||||||
generates interest transactions for an account according to various schemes.
|
|
||||||
|
|
||||||
<!-- ### autosync -->
|
|
||||||
|
|
||||||
<!-- [hledger-autosync](https://github.com/simonmichael/hledger/blob/master/bin/hledger-autosync) -->
|
|
||||||
<!-- is a symbolic link for easily running -->
|
|
||||||
<!-- [ledger-autosync](https://pypi.python.org/pypi/ledger-autosync) if you make a symbolic -->
|
|
||||||
<!-- ledger-autosync does deduplicating conversion of OFX data and some CSV formats, -->
|
|
||||||
<!-- and can also download the data -->
|
|
||||||
<!-- [if your bank offers OFX Direct Connect](http://wiki.gnucash.org/wiki/OFX_Direct_Connect_Bank_Settings). -->
|
|
||||||
|
|
||||||
A few more experimental or old add-ons can be found in hledger's bin/
|
|
||||||
directory. These are typically prototypes and not guaranteed to work.
|
|
||||||
|
|
@ -1,377 +0,0 @@
|
|||||||
# COMMON TASKS
|
|
||||||
|
|
||||||
Here are some quick examples of how to do some basic tasks with hledger.
|
|
||||||
For more details, see the reference section below, the hledger_journal(5) manual,
|
|
||||||
or the more extensive docs at <https://hledger.org>.
|
|
||||||
|
|
||||||
## Getting help
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ hledger # show available commands
|
|
||||||
$ hledger --help # show common options
|
|
||||||
$ hledger CMD --help # show common and command options, and command help
|
|
||||||
$ hledger help # show available manuals/topics
|
|
||||||
$ hledger help hledger # show hledger manual as info/man/text (auto-chosen)
|
|
||||||
$ hledger help journal --man # show the journal manual as a man page
|
|
||||||
$ hledger help --help # show more detailed help for the help command
|
|
||||||
```
|
|
||||||
|
|
||||||
Find more docs, chat, mail list, reddit, issue tracker:
|
|
||||||
<https://hledger.org#help-feedback>
|
|
||||||
|
|
||||||
## Constructing command lines
|
|
||||||
|
|
||||||
hledger has an extensive and powerful command line interface. We
|
|
||||||
strive to keep it simple and ergonomic, but you may run into one of
|
|
||||||
the confusing real world details described in OPTIONS, below.
|
|
||||||
If that happens, here are some tips that may help:
|
|
||||||
|
|
||||||
- command-specific options must go after the command (it's fine to put all options there) (`hledger CMD OPTS ARGS`)
|
|
||||||
- running add-on executables directly simplifies command line parsing (`hledger-ui OPTS ARGS`)
|
|
||||||
- enclose "problematic" args in single quotes
|
|
||||||
- if needed, also add a backslash to hide regular expression metacharacters from the shell
|
|
||||||
- to see how a misbehaving command is being parsed, add `--debug=2`.
|
|
||||||
|
|
||||||
## Starting a journal file
|
|
||||||
|
|
||||||
hledger looks for your accounting data in a journal file, `$HOME/.hledger.journal` by default:
|
|
||||||
```shell
|
|
||||||
$ hledger stats
|
|
||||||
The hledger journal file "/Users/simon/.hledger.journal" was not found.
|
|
||||||
Please create it first, eg with "hledger add" or a text editor.
|
|
||||||
Or, specify an existing journal file with -f or LEDGER_FILE.
|
|
||||||
```
|
|
||||||
|
|
||||||
You can override this by setting the `LEDGER_FILE` environment variable.
|
|
||||||
It's a good practice to keep this important file under version control,
|
|
||||||
and to start a new file each year. So you could do something like this:
|
|
||||||
```shell
|
|
||||||
$ mkdir ~/finance
|
|
||||||
$ cd ~/finance
|
|
||||||
$ git init
|
|
||||||
Initialized empty Git repository in /Users/simon/finance/.git/
|
|
||||||
$ touch 2020.journal
|
|
||||||
$ echo "export LEDGER_FILE=$HOME/finance/2020.journal" >> ~/.bashrc
|
|
||||||
$ source ~/.bashrc
|
|
||||||
$ hledger stats
|
|
||||||
Main file : /Users/simon/finance/2020.journal
|
|
||||||
Included files :
|
|
||||||
Transactions span : to (0 days)
|
|
||||||
Last transaction : none
|
|
||||||
Transactions : 0 (0.0 per day)
|
|
||||||
Transactions last 30 days: 0 (0.0 per day)
|
|
||||||
Transactions last 7 days : 0 (0.0 per day)
|
|
||||||
Payees/descriptions : 0
|
|
||||||
Accounts : 0 (depth 0)
|
|
||||||
Commodities : 0 ()
|
|
||||||
Market prices : 0 ()
|
|
||||||
```
|
|
||||||
|
|
||||||
## Setting opening balances
|
|
||||||
|
|
||||||
Pick a starting date for which you can look up the balances of some
|
|
||||||
real-world assets (bank accounts, wallet..) and liabilities (credit cards..).
|
|
||||||
|
|
||||||
To avoid a lot of data entry, you may want to start with just one or
|
|
||||||
two accounts, like your checking account or cash wallet; and pick a
|
|
||||||
recent starting date, like today or the start of the week. You can
|
|
||||||
always come back later and add more accounts and older transactions,
|
|
||||||
eg going back to january 1st.
|
|
||||||
|
|
||||||
Add an opening balances transaction to the journal, declaring the
|
|
||||||
balances on this date. Here are two ways to do it:
|
|
||||||
|
|
||||||
- The first way: open the journal in any text editor and save an entry like this:
|
|
||||||
```journal
|
|
||||||
2020-01-01 * opening balances
|
|
||||||
assets:bank:checking $1000 = $1000
|
|
||||||
assets:bank:savings $2000 = $2000
|
|
||||||
assets:cash $100 = $100
|
|
||||||
liabilities:creditcard $-50 = $-$50
|
|
||||||
equity:opening/closing balances
|
|
||||||
```
|
|
||||||
These are start-of-day balances, ie whatever was in the account at the
|
|
||||||
end of the previous day.
|
|
||||||
|
|
||||||
The * after the date is an optional status flag.
|
|
||||||
Here it means "cleared & confirmed".
|
|
||||||
|
|
||||||
The currency symbols are optional, but usually a good idea as you'll
|
|
||||||
be dealing with multiple currencies sooner or later.
|
|
||||||
|
|
||||||
The = amounts are optional balance assertions, providing extra error checking.
|
|
||||||
|
|
||||||
- The second way: run `hledger add` and follow the prompts to record a similar transaction:
|
|
||||||
```shell
|
|
||||||
$ hledger add
|
|
||||||
Adding transactions to journal file /Users/simon/finance/2020.journal
|
|
||||||
Any command line arguments will be used as defaults.
|
|
||||||
Use tab key to complete, readline keys to edit, enter to accept defaults.
|
|
||||||
An optional (CODE) may follow transaction dates.
|
|
||||||
An optional ; COMMENT may follow descriptions or amounts.
|
|
||||||
If you make a mistake, enter < at any prompt to go one step backward.
|
|
||||||
To end a transaction, enter . when prompted.
|
|
||||||
To quit, enter . at a date prompt or press control-d or control-c.
|
|
||||||
Date [2020-02-07]: 2020-01-01
|
|
||||||
Description: * opening balances
|
|
||||||
Account 1: assets:bank:checking
|
|
||||||
Amount 1: $1000
|
|
||||||
Account 2: assets:bank:savings
|
|
||||||
Amount 2 [$-1000]: $2000
|
|
||||||
Account 3: assets:cash
|
|
||||||
Amount 3 [$-3000]: $100
|
|
||||||
Account 4: liabilities:creditcard
|
|
||||||
Amount 4 [$-3100]: $-50
|
|
||||||
Account 5: equity:opening/closing balances
|
|
||||||
Amount 5 [$-3050]:
|
|
||||||
Account 6 (or . or enter to finish this transaction): .
|
|
||||||
2020-01-01 * opening balances
|
|
||||||
assets:bank:checking $1000
|
|
||||||
assets:bank:savings $2000
|
|
||||||
assets:cash $100
|
|
||||||
liabilities:creditcard $-50
|
|
||||||
equity:opening/closing balances $-3050
|
|
||||||
|
|
||||||
Save this transaction to the journal ? [y]:
|
|
||||||
Saved.
|
|
||||||
Starting the next transaction (. or ctrl-D/ctrl-C to quit)
|
|
||||||
Date [2020-01-01]: .
|
|
||||||
```
|
|
||||||
|
|
||||||
If you're using version control, this could be a good time to commit the journal. Eg:
|
|
||||||
```shell
|
|
||||||
$ git commit -m 'initial balances' 2020.journal
|
|
||||||
```
|
|
||||||
|
|
||||||
## Recording transactions
|
|
||||||
|
|
||||||
As you spend or receive money, you can record these transactions
|
|
||||||
using one of the methods above (text editor, hledger add)
|
|
||||||
or by using the [hledger-iadd](#iadd) or [hledger-web](#web) add-ons,
|
|
||||||
or by using the [import command](#import) to convert CSV data downloaded from your bank.
|
|
||||||
|
|
||||||
Here are some simple transactions, see the hledger_journal(5) manual
|
|
||||||
and hledger.org for more ideas:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
2020/1/10 * gift received
|
|
||||||
assets:cash $20
|
|
||||||
income:gifts
|
|
||||||
|
|
||||||
2020.1.12 * farmers market
|
|
||||||
expenses:food $13
|
|
||||||
assets:cash
|
|
||||||
|
|
||||||
2020-01-15 paycheck
|
|
||||||
income:salary
|
|
||||||
assets:bank:checking $1000
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reconciling
|
|
||||||
|
|
||||||
Periodically you should reconcile - compare your hledger-reported balances
|
|
||||||
against external sources of truth, like bank statements or your bank's website -
|
|
||||||
to be sure that your ledger accurately represents the real-world balances
|
|
||||||
(and, that the real-world institutions have not made a mistake!).
|
|
||||||
This gets easy and fast with (1) practice and (2) frequency.
|
|
||||||
If you do it daily, it can take 2-10 minutes.
|
|
||||||
If you let it pile up, expect it to take longer as you hunt down errors and discrepancies.
|
|
||||||
|
|
||||||
A typical workflow:
|
|
||||||
|
|
||||||
1. Reconcile cash.
|
|
||||||
Count what's in your wallet.
|
|
||||||
Compare with what hledger reports (`hledger bal cash`).
|
|
||||||
If they are different, try to remember the missing transaction,
|
|
||||||
or look for the error in the already-recorded transactions.
|
|
||||||
A register report can be helpful (`hledger reg cash`).
|
|
||||||
If you can't find the error, add an adjustment transaction.
|
|
||||||
Eg if you have $105 after the above, and can't explain the missing $2, it could be:
|
|
||||||
```journal
|
|
||||||
2020-01-16 * adjust cash
|
|
||||||
assets:cash $-2 = $105
|
|
||||||
expenses:misc
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Reconcile checking.
|
|
||||||
Log in to your bank's website.
|
|
||||||
Compare today's (cleared) balance with hledger's cleared balance (`hledger bal checking -C`).
|
|
||||||
If they are different, track down the error or record the missing transaction(s)
|
|
||||||
or add an adjustment transaction, similar to the above.
|
|
||||||
Unlike the cash case, you can usually compare the transaction history and running balance from your bank
|
|
||||||
with the one reported by `hledger reg checking -C`.
|
|
||||||
This will be easier if you generally record transaction dates
|
|
||||||
quite similar to your bank's clearing dates.
|
|
||||||
|
|
||||||
3. Repeat for other asset/liability accounts.
|
|
||||||
|
|
||||||
Tip: instead of the register command, use hledger-ui to see a
|
|
||||||
live-updating register while you edit the journal:
|
|
||||||
`hledger-ui --watch --register checking -C`
|
|
||||||
|
|
||||||
After reconciling, it could be a good time to mark the reconciled
|
|
||||||
transactions' status as "cleared and confirmed", if you want to track
|
|
||||||
that, by adding the `*` marker.
|
|
||||||
Eg in the paycheck transaction above, insert `*` between `2020-01-15` and `paycheck`
|
|
||||||
|
|
||||||
If you're using version control, this can be another good time to commit:
|
|
||||||
```shell
|
|
||||||
$ git commit -m 'txns' 2020.journal
|
|
||||||
```
|
|
||||||
|
|
||||||
## Reporting
|
|
||||||
|
|
||||||
Here are some basic reports.
|
|
||||||
|
|
||||||
Show all transactions:
|
|
||||||
```shell
|
|
||||||
$ hledger print
|
|
||||||
2020-01-01 * opening balances
|
|
||||||
assets:bank:checking $1000
|
|
||||||
assets:bank:savings $2000
|
|
||||||
assets:cash $100
|
|
||||||
liabilities:creditcard $-50
|
|
||||||
equity:opening/closing balances $-3050
|
|
||||||
|
|
||||||
2020-01-10 * gift received
|
|
||||||
assets:cash $20
|
|
||||||
income:gifts
|
|
||||||
|
|
||||||
2020-01-12 * farmers market
|
|
||||||
expenses:food $13
|
|
||||||
assets:cash
|
|
||||||
|
|
||||||
2020-01-15 * paycheck
|
|
||||||
income:salary
|
|
||||||
assets:bank:checking $1000
|
|
||||||
|
|
||||||
2020-01-16 * adjust cash
|
|
||||||
assets:cash $-2 = $105
|
|
||||||
expenses:misc
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Show account names, and their hierarchy:
|
|
||||||
```shell
|
|
||||||
$ hledger accounts --tree
|
|
||||||
assets
|
|
||||||
bank
|
|
||||||
checking
|
|
||||||
savings
|
|
||||||
cash
|
|
||||||
equity
|
|
||||||
opening/closing balances
|
|
||||||
expenses
|
|
||||||
food
|
|
||||||
misc
|
|
||||||
income
|
|
||||||
gifts
|
|
||||||
salary
|
|
||||||
liabilities
|
|
||||||
creditcard
|
|
||||||
```
|
|
||||||
|
|
||||||
Show all account totals:
|
|
||||||
```shell
|
|
||||||
$ hledger balance
|
|
||||||
$4105 assets
|
|
||||||
$4000 bank
|
|
||||||
$2000 checking
|
|
||||||
$2000 savings
|
|
||||||
$105 cash
|
|
||||||
$-3050 equity:opening/closing balances
|
|
||||||
$15 expenses
|
|
||||||
$13 food
|
|
||||||
$2 misc
|
|
||||||
$-1020 income
|
|
||||||
$-20 gifts
|
|
||||||
$-1000 salary
|
|
||||||
$-50 liabilities:creditcard
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
|
|
||||||
Show only asset and liability balances, as a flat list, limited to depth 2:
|
|
||||||
```shell
|
|
||||||
$ hledger bal assets liabilities --flat -2
|
|
||||||
$4000 assets:bank
|
|
||||||
$105 assets:cash
|
|
||||||
$-50 liabilities:creditcard
|
|
||||||
--------------------
|
|
||||||
$4055
|
|
||||||
```
|
|
||||||
|
|
||||||
Show the same thing without negative numbers, formatted as a simple balance sheet:
|
|
||||||
```shell
|
|
||||||
$ hledger bs --flat -2
|
|
||||||
Balance Sheet 2020-01-16
|
|
||||||
|
|
||||||
|| 2020-01-16
|
|
||||||
========================++============
|
|
||||||
Assets ||
|
|
||||||
------------------------++------------
|
|
||||||
assets:bank || $4000
|
|
||||||
assets:cash || $105
|
|
||||||
------------------------++------------
|
|
||||||
|| $4105
|
|
||||||
========================++============
|
|
||||||
Liabilities ||
|
|
||||||
------------------------++------------
|
|
||||||
liabilities:creditcard || $50
|
|
||||||
------------------------++------------
|
|
||||||
|| $50
|
|
||||||
========================++============
|
|
||||||
Net: || $4055
|
|
||||||
```
|
|
||||||
The final total is your "net worth" on the end date.
|
|
||||||
(Or use `bse` for a full balance sheet with equity.)
|
|
||||||
|
|
||||||
Show income and expense totals, formatted as an income statement:
|
|
||||||
```shell
|
|
||||||
hledger is
|
|
||||||
Income Statement 2020-01-01-2020-01-16
|
|
||||||
|
|
||||||
|| 2020-01-01-2020-01-16
|
|
||||||
===============++=======================
|
|
||||||
Revenues ||
|
|
||||||
---------------++-----------------------
|
|
||||||
income:gifts || $20
|
|
||||||
income:salary || $1000
|
|
||||||
---------------++-----------------------
|
|
||||||
|| $1020
|
|
||||||
===============++=======================
|
|
||||||
Expenses ||
|
|
||||||
---------------++-----------------------
|
|
||||||
expenses:food || $13
|
|
||||||
expenses:misc || $2
|
|
||||||
---------------++-----------------------
|
|
||||||
|| $15
|
|
||||||
===============++=======================
|
|
||||||
Net: || $1005
|
|
||||||
```
|
|
||||||
The final total is your net income during this period.
|
|
||||||
|
|
||||||
Show transactions affecting your wallet, with running total:
|
|
||||||
```shell
|
|
||||||
$ hledger register cash
|
|
||||||
2020-01-01 opening balances assets:cash $100 $100
|
|
||||||
2020-01-10 gift received assets:cash $20 $120
|
|
||||||
2020-01-12 farmers market assets:cash $-13 $107
|
|
||||||
2020-01-16 adjust cash assets:cash $-2 $105
|
|
||||||
```
|
|
||||||
|
|
||||||
Show weekly posting counts as a bar chart:
|
|
||||||
```shell
|
|
||||||
$ hledger activity -W
|
|
||||||
2019-12-30 *****
|
|
||||||
2020-01-06 ****
|
|
||||||
2020-01-13 ****
|
|
||||||
```
|
|
||||||
## Migrating to a new file
|
|
||||||
|
|
||||||
At the end of the year, you may want to continue your journal in a new file,
|
|
||||||
so that old transactions don't slow down or clutter your reports,
|
|
||||||
and to help ensure the integrity of your accounting history.
|
|
||||||
See the [close command](#close).
|
|
||||||
|
|
||||||
If using version control, don't forget to `git add` the new file.
|
|
@ -1,910 +0,0 @@
|
|||||||
# OPTIONS
|
|
||||||
|
|
||||||
## General options
|
|
||||||
|
|
||||||
To see general usage help, including general options
|
|
||||||
which are supported by most hledger commands, run `hledger -h`.
|
|
||||||
|
|
||||||
General help options:
|
|
||||||
|
|
||||||
_helpoptions_
|
|
||||||
|
|
||||||
General input options:
|
|
||||||
|
|
||||||
_inputoptions_
|
|
||||||
|
|
||||||
General reporting options:
|
|
||||||
|
|
||||||
_reportingoptions_
|
|
||||||
|
|
||||||
## Command options
|
|
||||||
|
|
||||||
To see options for a particular command, including command-specific options, run: `hledger COMMAND -h`.
|
|
||||||
|
|
||||||
Command-specific options must be written after the command name, eg: `hledger print -x`.
|
|
||||||
|
|
||||||
Additionally, if the command is an [addon](#commands),
|
|
||||||
you may need to put its options after a double-hyphen, eg: `hledger ui -- --watch`.
|
|
||||||
Or, you can run the addon executable directly: `hledger-ui --watch`.
|
|
||||||
|
|
||||||
## Command arguments
|
|
||||||
|
|
||||||
Most hledger commands accept arguments after the command name,
|
|
||||||
which are often a [query](#queries), filtering the data in some way.
|
|
||||||
|
|
||||||
You can save a set of command line options/arguments in a file,
|
|
||||||
and then reuse them by writing `@FILENAME` as a command line argument.
|
|
||||||
Eg: `hledger bal @foo.args`.
|
|
||||||
(To prevent this, eg if you have an argument that begins with a literal `@`,
|
|
||||||
precede it with `--`, eg: `hledger bal -- @ARG`).
|
|
||||||
|
|
||||||
Inside the argument file, each line should contain just one option or argument.
|
|
||||||
Avoid the use of spaces, except inside quotes (or you'll see a confusing error).
|
|
||||||
Between a flag and its argument, use = (or nothing).
|
|
||||||
Bad:
|
|
||||||
|
|
||||||
assets depth:2
|
|
||||||
-X USD
|
|
||||||
|
|
||||||
Good:
|
|
||||||
|
|
||||||
assets
|
|
||||||
depth:2
|
|
||||||
-X=USD
|
|
||||||
|
|
||||||
For special characters (see below), use one less level of quoting than
|
|
||||||
you would at the command prompt.
|
|
||||||
Bad:
|
|
||||||
|
|
||||||
-X"$"
|
|
||||||
|
|
||||||
Good:
|
|
||||||
|
|
||||||
-X$
|
|
||||||
|
|
||||||
See also: [Save frequently used options](save-frequently-used-options.html).
|
|
||||||
|
|
||||||
## Queries
|
|
||||||
|
|
||||||
One of hledger's strengths is being able to quickly report on precise subsets of your data.
|
|
||||||
Most commands accept an optional query expression, written as arguments after the command name,
|
|
||||||
to filter the data by date, account name or other criteria.
|
|
||||||
The syntax is similar to a web search:
|
|
||||||
one or more space-separated search terms,
|
|
||||||
quotes to enclose whitespace,
|
|
||||||
prefixes to match specific fields,
|
|
||||||
a not: prefix to negate the match.
|
|
||||||
|
|
||||||
We do not yet support arbitrary boolean combinations of search terms;
|
|
||||||
instead most commands show transactions/postings/accounts which match (or negatively match):
|
|
||||||
|
|
||||||
- any of the description terms AND
|
|
||||||
- any of the account terms AND
|
|
||||||
- any of the status terms AND
|
|
||||||
- all the other terms.
|
|
||||||
|
|
||||||
The [print](hledger.html#print) command instead shows transactions which:
|
|
||||||
|
|
||||||
- match any of the description terms AND
|
|
||||||
- have any postings matching any of the positive account terms AND
|
|
||||||
- have no postings matching any of the negative account terms AND
|
|
||||||
- match all the other terms.
|
|
||||||
|
|
||||||
The following kinds of search terms can be used.
|
|
||||||
Remember these can also be prefixed with **`not:`**, eg to exclude a particular subaccount.
|
|
||||||
|
|
||||||
**`REGEX`, `acct:REGEX`**
|
|
||||||
: match account names by this regular expression. (With no prefix, `acct:` is assumed.)
|
|
||||||
|
|
||||||
: same as above
|
|
||||||
|
|
||||||
**`amt:N, amt:<N, amt:<=N, amt:>N, amt:>=N`**
|
|
||||||
: match postings with a single-commodity amount that is equal to, less
|
|
||||||
than, or greater than N. (Multi-commodity amounts are not tested, and
|
|
||||||
will always match.) The comparison has two modes: if N is preceded by
|
|
||||||
a + or - sign (or is 0), the two signed numbers are
|
|
||||||
compared. Otherwise, the absolute magnitudes are compared, ignoring
|
|
||||||
sign.
|
|
||||||
|
|
||||||
**`code:REGEX`**
|
|
||||||
: match by transaction code (eg check number)
|
|
||||||
|
|
||||||
**`cur:REGEX`**
|
|
||||||
: match postings or transactions including any amounts whose
|
|
||||||
currency/commodity symbol is fully matched by REGEX. (For a partial
|
|
||||||
match, use `.*REGEX.*`). Note, to match characters which are
|
|
||||||
regex-significant, like the dollar sign (`$`), you need to prepend `\`.
|
|
||||||
And when using the command line you need to add one more level of
|
|
||||||
quoting to hide it from the shell, so eg do: `hledger print cur:'\$'`
|
|
||||||
or `hledger print cur:\\$`.
|
|
||||||
|
|
||||||
**`desc:REGEX`**
|
|
||||||
: match transaction descriptions.
|
|
||||||
|
|
||||||
**`date:PERIODEXPR`**
|
|
||||||
: match dates within the specified period.
|
|
||||||
PERIODEXPR is a [period expression](hledger.html#period-expressions) (with no report interval).
|
|
||||||
Examples: `date:2016`, `date:thismonth`, `date:2000/2/1-2/15`, `date:lastweek-`.
|
|
||||||
If the `--date2` command line flag is present, this matches [secondary dates](journal.html#secondary-dates) instead.
|
|
||||||
|
|
||||||
**`date2:PERIODEXPR`**
|
|
||||||
: match secondary dates within the specified period.
|
|
||||||
|
|
||||||
**`depth:N`**
|
|
||||||
: match (or display, depending on command) accounts at or above this depth
|
|
||||||
|
|
||||||
**`note:REGEX`**
|
|
||||||
: match transaction [notes](journal.html#payee-and-note)
|
|
||||||
(part of description right of `|`, or whole description when there's no `|`)
|
|
||||||
|
|
||||||
**`payee:REGEX`**
|
|
||||||
: match transaction [payee/payer names](journal.html#payee-and-note)
|
|
||||||
(part of description left of `|`, or whole description when there's no `|`)
|
|
||||||
|
|
||||||
**`real:, real:0`**
|
|
||||||
: match real or virtual postings respectively
|
|
||||||
|
|
||||||
**`status:, status:!, status:*`**
|
|
||||||
: match unmarked, pending, or cleared transactions respectively
|
|
||||||
|
|
||||||
**`tag:REGEX[=REGEX]`**
|
|
||||||
: match by tag name, and optionally also by tag value. Note a
|
|
||||||
tag: query is considered to match a transaction if it matches any of
|
|
||||||
the postings. Also remember that postings inherit the tags of their
|
|
||||||
parent transaction.
|
|
||||||
|
|
||||||
The following special search term is used automatically in hledger-web, only:
|
|
||||||
|
|
||||||
**`inacct:ACCTNAME`**
|
|
||||||
: tells hledger-web to show the transaction register for this account.
|
|
||||||
Can be filtered further with `acct` etc.
|
|
||||||
|
|
||||||
Some of these can also be expressed as command-line options (eg `depth:2` is equivalent to `--depth 2`).
|
|
||||||
Generally you can mix options and query arguments, and the resulting query will be their intersection
|
|
||||||
(perhaps excluding the `-p/--period` option).
|
|
||||||
|
|
||||||
## Special characters in arguments and queries
|
|
||||||
|
|
||||||
In shell command lines, option and argument values which contain "problematic" characters,
|
|
||||||
ie spaces,
|
|
||||||
and also characters significant to your shell such as `<`, `>`, `(`, `)`, `|` and `$`,
|
|
||||||
should be escaped by enclosing them in quotes or by writing backslashes before the characters.
|
|
||||||
Eg:
|
|
||||||
|
|
||||||
`hledger register -p 'last year' "accounts receivable (receivable|payable)" amt:\>100`.
|
|
||||||
|
|
||||||
### More escaping
|
|
||||||
|
|
||||||
Characters significant both to the shell and in [regular expressions](#regular-expressions)
|
|
||||||
may need one extra level of escaping. These include parentheses, the pipe symbol and the dollar sign.
|
|
||||||
Eg, to match the dollar symbol, bash users should do:
|
|
||||||
|
|
||||||
`hledger balance cur:'\$'`
|
|
||||||
|
|
||||||
or:
|
|
||||||
|
|
||||||
`hledger balance cur:\\$`
|
|
||||||
|
|
||||||
### Even more escaping
|
|
||||||
|
|
||||||
When hledger runs an addon executable (eg you type `hledger ui`, hledger runs `hledger-ui`),
|
|
||||||
it de-escapes command-line options and arguments once, so you might need to *triple*-escape.
|
|
||||||
Eg in bash, running the ui command and matching the dollar sign, it's:
|
|
||||||
|
|
||||||
`hledger ui cur:'\\$'`
|
|
||||||
|
|
||||||
or:
|
|
||||||
|
|
||||||
`hledger ui cur:\\\\$`
|
|
||||||
|
|
||||||
If you asked why *four* slashes above, this may help:
|
|
||||||
|
|
||||||
----------------- --------
|
|
||||||
unescaped: `$`
|
|
||||||
escaped: `\$`
|
|
||||||
double-escaped: `\\$`
|
|
||||||
triple-escaped: `\\\\$`
|
|
||||||
----------------- --------
|
|
||||||
|
|
||||||
(The number of backslashes in fish shell is left as an exercise for the reader.)
|
|
||||||
|
|
||||||
You can always avoid the extra escaping for addons by running the addon directly:
|
|
||||||
|
|
||||||
`hledger-ui cur:\\$`
|
|
||||||
|
|
||||||
### Less escaping
|
|
||||||
|
|
||||||
Inside an [argument file](#argument-expansion),
|
|
||||||
or in the search field of hledger-ui or hledger-web,
|
|
||||||
or at a GHCI prompt,
|
|
||||||
you need one less level of escaping than at the command line.
|
|
||||||
And backslashes may work better than quotes.
|
|
||||||
Eg:
|
|
||||||
|
|
||||||
`ghci> :main balance cur:\$`
|
|
||||||
|
|
||||||
## Unicode characters
|
|
||||||
|
|
||||||
hledger is expected to handle non-ascii characters correctly:
|
|
||||||
|
|
||||||
- they should be parsed correctly in input files and on the command
|
|
||||||
line, by all hledger tools (add, iadd, hledger-web's search/add/edit
|
|
||||||
forms, etc.)
|
|
||||||
|
|
||||||
- they should be displayed correctly by all hledger tools,
|
|
||||||
and on-screen alignment should be preserved.
|
|
||||||
|
|
||||||
This requires a well-configured environment. Here are some tips:
|
|
||||||
|
|
||||||
- A system locale must be configured, and it must be one that can
|
|
||||||
decode the characters being used.
|
|
||||||
In bash, you can set a locale like this: `export LANG=en_US.UTF-8`.
|
|
||||||
There are some more details in [Troubleshooting](#troubleshooting).
|
|
||||||
This step is essential - without it, hledger will quit on encountering
|
|
||||||
a non-ascii character (as with all GHC-compiled programs).
|
|
||||||
|
|
||||||
- your terminal software (eg Terminal.app, iTerm, CMD.exe, xterm..) must support unicode
|
|
||||||
|
|
||||||
- the terminal must be using a font which includes the required unicode glyphs
|
|
||||||
|
|
||||||
- the terminal should be configured to display wide characters as double width (for report alignment)
|
|
||||||
|
|
||||||
- on Windows, for best results you should run hledger in the same kind of environment in which it was built.
|
|
||||||
Eg hledger built in the standard CMD.EXE environment (like the binaries on our download page)
|
|
||||||
might show display problems when run in a cygwin or msys terminal, and vice versa.
|
|
||||||
(See eg [#961](https://github.com/simonmichael/hledger/issues/961#issuecomment-471229644)).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## Input files
|
|
||||||
|
|
||||||
hledger reads transactions from a data file (and the add command writes to it).
|
|
||||||
By default this file is `$HOME/.hledger.journal`
|
|
||||||
(or on Windows, something like `C:/Users/USER/.hledger.journal`).
|
|
||||||
You can override this with the `$LEDGER_FILE` environment variable:
|
|
||||||
```shell
|
|
||||||
$ setenv LEDGER_FILE ~/finance/2016.journal
|
|
||||||
$ hledger stats
|
|
||||||
```
|
|
||||||
or with the `-f/--file` option:
|
|
||||||
```shell
|
|
||||||
$ hledger -f /some/file stats
|
|
||||||
```
|
|
||||||
|
|
||||||
The file name `-` (hyphen) means standard input:
|
|
||||||
```shell
|
|
||||||
$ cat some.journal | hledger -f-
|
|
||||||
```
|
|
||||||
|
|
||||||
Usually the data file is in hledger's journal format,
|
|
||||||
but it can also be one of several other formats, listed below.
|
|
||||||
hledger detects the format automatically based on the file extension,
|
|
||||||
or if that is not recognised, by trying each built-in "reader" in turn:
|
|
||||||
|
|
||||||
| Reader: | Reads: | Used for file extensions: |
|
|
||||||
|-------------|-----------------------------------------------------|-----------------------------------------------------|
|
|
||||||
| `journal` | hledger's journal format, also some Ledger journals | `.journal` `.j` `.hledger` `.ledger` |
|
|
||||||
| `timeclock` | timeclock files (precise time logging) | `.timeclock` |
|
|
||||||
| `timedot` | timedot files (approximate time logging) | `.timedot` |
|
|
||||||
| `csv` | comma-separated values (data interchange) | `.csv` |
|
|
||||||
|
|
||||||
If needed (eg to ensure correct error messages when a file has the "wrong" extension),
|
|
||||||
you can force a specific reader/format by prepending it to the file path with a colon.
|
|
||||||
Examples:
|
|
||||||
```shell
|
|
||||||
$ hledger -f csv:/some/csv-file.dat stats
|
|
||||||
$ echo 'i 2009/13/1 08:00:00' | hledger print -ftimeclock:-
|
|
||||||
```
|
|
||||||
|
|
||||||
You can also specify multiple `-f` options, to read multiple files as one big journal.
|
|
||||||
There are some limitations with this:
|
|
||||||
|
|
||||||
- directives in one file will not affect the other files
|
|
||||||
- [balance assertions](journal.html#balance-assertions) will not see any account balances from previous files
|
|
||||||
|
|
||||||
If you need those, either use the [include directive](journal.html#including-other-files),
|
|
||||||
or concatenate the files, eg: `cat a.journal b.journal | hledger -f- CMD`.
|
|
||||||
|
|
||||||
## Output destination
|
|
||||||
|
|
||||||
Some commands (print, register, stats, the balance commands)
|
|
||||||
can write their output to a destination other than the console.
|
|
||||||
This is controlled by the `-o/--output-file` option.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ hledger balance -o - # write to stdout (the default)
|
|
||||||
$ hledger balance -o FILE # write to FILE
|
|
||||||
```
|
|
||||||
|
|
||||||
## Output format
|
|
||||||
|
|
||||||
Some commands can write their output in other formats.
|
|
||||||
Eg print and register can output CSV, and the balance commands can output CSV or HTML.
|
|
||||||
This is controlled by the `-O/--output-format` option, or by specifying a `.csv` or `.html` file extension with `-o/--output-file`.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
$ hledger balance -O csv # write CSV to stdout
|
|
||||||
$ hledger balance -o FILE.csv # write CSV to FILE.csv
|
|
||||||
```
|
|
||||||
|
|
||||||
## Regular expressions
|
|
||||||
|
|
||||||
hledger uses [regular expressions](http://www.regular-expressions.info) in a number of places:
|
|
||||||
|
|
||||||
- [query terms](#queries), on the command line and in the hledger-web search form: `REGEX`, `desc:REGEX`, `cur:REGEX`, `tag:...=REGEX`
|
|
||||||
- [CSV rules](#csv-rules) conditional blocks: `if REGEX ...`
|
|
||||||
- [account alias](#rewriting-accounts) directives and options: `alias /REGEX/ = REPLACEMENT`, `--alias /REGEX/=REPLACEMENT`
|
|
||||||
|
|
||||||
hledger's regular expressions come from the
|
|
||||||
[regex-tdfa](http://hackage.haskell.org/package/regex-tdfa/docs/Text-Regex-TDFA.html)
|
|
||||||
library. In general they:
|
|
||||||
|
|
||||||
- are case insensitive
|
|
||||||
- are infix matching (do not need to match the entire thing being matched)
|
|
||||||
- are [POSIX extended regular expressions](http://www.regular-expressions.info/posix.html#ere)
|
|
||||||
- also support [GNU word boundaries](http://www.regular-expressions.info/wordboundaries.html) (\\<, \\>, \\b, \\B)
|
|
||||||
- and parenthesised [capturing groups](http://www.regular-expressions.info/refcapture.html) and numeric backreferences in replacement strings
|
|
||||||
- do not support [mode modifiers](http://www.regular-expressions.info/modifiers.html) like (?s)
|
|
||||||
|
|
||||||
Some things to note:
|
|
||||||
|
|
||||||
- In the `alias` directive and `--alias` option, regular expressions
|
|
||||||
must be enclosed in forward slashes (`/REGEX/`). Elsewhere in hledger,
|
|
||||||
these are not required.
|
|
||||||
|
|
||||||
- In queries, to match a regular expression metacharacter like `$`
|
|
||||||
as a literal character, prepend a backslash. Eg to search for amounts with the
|
|
||||||
dollar sign in hledger-web, write `cur:\$`.
|
|
||||||
|
|
||||||
- On the command line, some metacharacters like `$` have a special
|
|
||||||
meaning to the shell and so must be escaped at least once more.
|
|
||||||
See [Special characters](#special-characters).
|
|
||||||
|
|
||||||
## Smart dates
|
|
||||||
|
|
||||||
hledger's user interfaces accept a flexible "smart date" syntax (unlike dates in the journal file).
|
|
||||||
Smart dates allow some english words, can be relative to today's date,
|
|
||||||
and can have less-significant date parts omitted (defaulting to 1).
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
--------------------------------------------- -----------------------------------------------------------------------------
|
|
||||||
`2004/10/1`, `2004-01-01`, `2004.9.1` exact date, several separators allowed. Year is 4+ digits, month is 1-12, day is 1-31
|
|
||||||
`2004` start of year
|
|
||||||
`2004/10` start of month
|
|
||||||
`10/1` month and day in current year
|
|
||||||
`21` day in current month
|
|
||||||
`october, oct` start of month in current year
|
|
||||||
`yesterday, today, tomorrow` -1, 0, 1 days from today
|
|
||||||
`last/this/next day/week/month/quarter/year` -1, 0, 1 periods from the current period
|
|
||||||
`20181201` 8 digit YYYYMMDD with valid year month and day
|
|
||||||
`201812` 6 digit YYYYMM with valid year and month
|
|
||||||
--------------------------------------------- -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
Counterexamples - malformed digit sequences might give surprising results:
|
|
||||||
|
|
||||||
--------------------------------------------- -----------------------------------------------------------------------------
|
|
||||||
`201813` 6 digits with an invalid month is parsed as start of 6-digit year
|
|
||||||
`20181301` 8 digits with an invalid month is parsed as start of 8-digit year
|
|
||||||
`20181232` 8 digits with an invalid day gives an error
|
|
||||||
`201801012` 9+ digits beginning with a valid YYYYMMDD gives an error
|
|
||||||
--------------------------------------------- -----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
## Report start & end date
|
|
||||||
|
|
||||||
Most hledger reports show the full span of time represented by the journal data, by default.
|
|
||||||
So, the effective report start and end dates will be the earliest and latest transaction or posting dates found in the journal.
|
|
||||||
|
|
||||||
Often you will want to see a shorter time span, such as the current month.
|
|
||||||
You can specify a start and/or end date using
|
|
||||||
[`-b/--begin`](#reporting-options),
|
|
||||||
[`-e/--end`](#reporting-options),
|
|
||||||
[`-p/--period`](#period-expressions)
|
|
||||||
or a [`date:` query](#queries) (described below).
|
|
||||||
All of these accept the [smart date](#smart-dates) syntax.
|
|
||||||
|
|
||||||
Some notes:
|
|
||||||
|
|
||||||
- As in Ledger, end dates are exclusive, so you need to write the date *after*
|
|
||||||
the last day you want to include.
|
|
||||||
- As noted in [reporting options](#general-options):
|
|
||||||
among start/end dates specified with *options*, the last (i.e. right-most)
|
|
||||||
option takes precedence.
|
|
||||||
- The effective report start and end dates are the intersection of the
|
|
||||||
start/end dates from options and that from `date:` queries.
|
|
||||||
That is, `date:2019-01 date:2019 -p'2000 to 2030'` yields January 2019, the
|
|
||||||
smallest common time span.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
----------------------------------- -------------------------------------------------------------------------------------------
|
|
||||||
`-b 2016/3/17` begin on St. Patrick's day 2016
|
|
||||||
`-e 12/1` end at the start of december 1st of the current year (11/30 will be the last date included)
|
|
||||||
`-b thismonth` all transactions on or after the 1st of the current month
|
|
||||||
`-p thismonth` all transactions in the current month
|
|
||||||
`date:2016/3/17-` the above written as queries instead
|
|
||||||
`date:-12/1`
|
|
||||||
`date:thismonth-`
|
|
||||||
`date:thismonth`
|
|
||||||
---
|
|
||||||
|
|
||||||
## Report intervals
|
|
||||||
|
|
||||||
A report interval can be specified so that commands like
|
|
||||||
[register](#register), [balance](#balance) and [activity](#activity) will divide their
|
|
||||||
reports into multiple subperiods. The basic intervals can be
|
|
||||||
selected with one of `-D/--daily`, `-W/--weekly`, `-M/--monthly`,
|
|
||||||
`-Q/--quarterly`, or `-Y/--yearly`. More complex intervals may be
|
|
||||||
specified with a [period expression](#period-expressions).
|
|
||||||
Report intervals can not be specified with a [query](#queries).
|
|
||||||
|
|
||||||
## Period expressions
|
|
||||||
|
|
||||||
The `-p/--period` option accepts period expressions, a shorthand way
|
|
||||||
of expressing a start date, end date, and/or report interval all at
|
|
||||||
once.
|
|
||||||
|
|
||||||
Here's a basic period expression specifying the first quarter of 2009. Note,
|
|
||||||
hledger always treats start dates as inclusive and end dates as exclusive:
|
|
||||||
|
|
||||||
`-p "from 2009/1/1 to 2009/4/1"`
|
|
||||||
|
|
||||||
Keywords like "from" and "to" are optional, and so are the spaces, as long
|
|
||||||
as you don't run two dates together. "to" can also be written as "-".
|
|
||||||
These are equivalent to the above:
|
|
||||||
|
|
||||||
------------------------------
|
|
||||||
`-p "2009/1/1 2009/4/1"`
|
|
||||||
`-p2009/1/1to2009/4/1`
|
|
||||||
`-p2009/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 4/1"`
|
|
||||||
`-p "january-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 journal:
|
|
||||||
|
|
||||||
---------------------------- ---------------------------------
|
|
||||||
`-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"
|
|
||||||
--------------------- ------------------------------------------------------
|
|
||||||
|
|
||||||
The argument of `-p` can also begin with, or be, a [report interval](#report-intervals) expression.
|
|
||||||
The basic report intervals are `daily`, `weekly`, `monthly`, `quarterly`, or `yearly`,
|
|
||||||
which have the same effect as the `-D`,`-W`,`-M`,`-Q`, or `-Y` flags.
|
|
||||||
Between report interval and start/end dates (if any), the word `in` is optional.
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
`-p "weekly from 2009/1/1 to 2009/4/1"`
|
|
||||||
`-p "monthly in 2008"`
|
|
||||||
`-p "quarterly"`
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
Note that `weekly`, `monthly`, `quarterly` and `yearly` intervals will
|
|
||||||
always start on the first day on week, month, quarter or year
|
|
||||||
accordingly, and will end on the last day of same period, even if
|
|
||||||
associated period expression specifies different explicit start and end date.
|
|
||||||
|
|
||||||
For example:
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
`-p "weekly from 2009/1/1 to 2009/4/1"` -- starts on 2008/12/29, closest preceding Monday
|
|
||||||
`-p "monthly in 2008/11/25"` -- starts on 2018/11/01
|
|
||||||
`-p "quarterly from 2009-05-05 to 2009-06-01"` - starts on 2009/04/01, ends on 2009/06/30, which are first and last days of Q2 2009
|
|
||||||
`-p "yearly from 2009-12-29"` - starts on 2009/01/01, first day of 2009
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
The following more complex report intervals are also supported:
|
|
||||||
`biweekly`,
|
|
||||||
`bimonthly`,
|
|
||||||
`every day|week|month|quarter|year`,
|
|
||||||
`every N days|weeks|months|quarters|years`.
|
|
||||||
|
|
||||||
|
|
||||||
All of these will start on the first day of the requested period and end on the last one, as described above.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
`-p "bimonthly from 2008"` -- periods will have boundaries on 2008/01/01, 2008/03/01, ...
|
|
||||||
`-p "every 2 weeks"` -- starts on closest preceding Monday
|
|
||||||
`-p "every 5 month from 2009/03"` -- periods will have boundaries on 2009/03/01, 2009/08/01, ...
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
If you want intervals that start on arbitrary day of your choosing and span a week, month or year, you need to use any of the following:
|
|
||||||
|
|
||||||
`every Nth day of week`,
|
|
||||||
`every <weekday>`,
|
|
||||||
`every Nth day [of month]`,
|
|
||||||
`every Nth weekday [of month]`,
|
|
||||||
`every MM/DD [of year]`,
|
|
||||||
`every Nth MMM [of year]`,
|
|
||||||
`every MMM Nth [of year]`.
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
------------------------------------------
|
|
||||||
`-p "every 2nd day of week"` -- periods will go from Tue to Tue
|
|
||||||
`-p "every Tue"` -- same
|
|
||||||
`-p "every 15th day"` -- period boundaries will be on 15th of each month
|
|
||||||
`-p "every 2nd Monday"` -- period boundaries will be on second Monday of each month
|
|
||||||
`-p "every 11/05"` -- yearly periods with boundaries on 5th of Nov
|
|
||||||
`-p "every 5th Nov"` -- same
|
|
||||||
`-p "every Nov 5th"` -- same
|
|
||||||
------------------------------------------
|
|
||||||
|
|
||||||
|
|
||||||
Show historical balances at end of 15th each month (N is exclusive end date):
|
|
||||||
|
|
||||||
`hledger balance -H -p "every 16th day"`
|
|
||||||
|
|
||||||
Group postings from start of wednesday to end of next tuesday (N is start date and exclusive end date):
|
|
||||||
|
|
||||||
`hledger register checking -p "every 3rd day of week"`
|
|
||||||
|
|
||||||
## Depth limiting
|
|
||||||
|
|
||||||
With the `--depth N` option (short form: `-N`), commands like [account](#account), [balance](#balance)
|
|
||||||
and [register](#register) will show only the uppermost accounts in the account
|
|
||||||
tree, down to level N. Use this when you want a summary with less detail.
|
|
||||||
This flag has the same effect as a `depth:` query argument
|
|
||||||
(so `-2`, `--depth=2` or `depth:2` are basically equivalent).
|
|
||||||
|
|
||||||
## Pivoting
|
|
||||||
|
|
||||||
Normally hledger sums amounts, and organizes them in a hierarchy, based on account name.
|
|
||||||
The `--pivot FIELD` option causes it to sum and organize hierarchy based on the value of some other field instead.
|
|
||||||
FIELD can be:
|
|
||||||
`code`, `description`, `payee`, `note`,
|
|
||||||
or the full name (case insensitive) of any [tag](journal.html#tags).
|
|
||||||
As with account names, values containing `colon:separated:parts` will be displayed hierarchically in reports.
|
|
||||||
|
|
||||||
`--pivot` is a general option affecting all reports; you can think of hledger transforming
|
|
||||||
the journal before any other processing, replacing every posting's account name with
|
|
||||||
the value of the specified field on that posting, inheriting it from the transaction
|
|
||||||
or using a blank value if it's not present.
|
|
||||||
|
|
||||||
An example:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
2016/02/16 Member Fee Payment
|
|
||||||
assets:bank account 2 EUR
|
|
||||||
income:member fees -2 EUR ; member: John Doe
|
|
||||||
```
|
|
||||||
Normal balance report showing account names:
|
|
||||||
```shell
|
|
||||||
$ hledger balance
|
|
||||||
2 EUR assets:bank account
|
|
||||||
-2 EUR income:member fees
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
Pivoted balance report, using member: tag values instead:
|
|
||||||
```shell
|
|
||||||
$ hledger balance --pivot member
|
|
||||||
2 EUR
|
|
||||||
-2 EUR John Doe
|
|
||||||
--------------------
|
|
||||||
0
|
|
||||||
```
|
|
||||||
One way to show only amounts with a member: value (using a [query](#queries), described below):
|
|
||||||
```shell
|
|
||||||
$ hledger balance --pivot member tag:member=.
|
|
||||||
-2 EUR John Doe
|
|
||||||
--------------------
|
|
||||||
-2 EUR
|
|
||||||
```
|
|
||||||
Another way (the acct: query matches against the pivoted "account name"):
|
|
||||||
```shell
|
|
||||||
$ hledger balance --pivot member acct:.
|
|
||||||
-2 EUR John Doe
|
|
||||||
--------------------
|
|
||||||
-2 EUR
|
|
||||||
```
|
|
||||||
|
|
||||||
## Valuation
|
|
||||||
|
|
||||||
### -B: Cost
|
|
||||||
|
|
||||||
The `-B/--cost` flag converts amounts to their cost (or selling price) at transaction time,
|
|
||||||
if they have a [transaction price](journal.html#transaction-prices) specified.
|
|
||||||
This flag is equivalent to `--value=cost`, described below.
|
|
||||||
|
|
||||||
### -V: Market value
|
|
||||||
|
|
||||||
The `-V/--market` flag converts reported amounts to their market value in a default valuation commodity,
|
|
||||||
using the [market prices](journal.html#market-prices) in effect on a default valuation date.
|
|
||||||
For single period reports, the valuation date is today (equivalent to `--value=now`);
|
|
||||||
for [multiperiod reports](#report-intervals), it is the last day of each subperiod (equivalent to `--value=end`).
|
|
||||||
|
|
||||||
The default valuation commodity is the one referenced in the latest
|
|
||||||
applicable market price dated on or before the valuation date.
|
|
||||||
If most of your P declarations lead to a single home currency, this will usually be what you want.
|
|
||||||
(To specify the commodity, see -X below.)
|
|
||||||
|
|
||||||
Note that in hledger, market prices are always declared explicitly with P directives;
|
|
||||||
we do not infer them from [transaction prices](journal.html#transaction-prices) as Ledger does.
|
|
||||||
|
|
||||||
Here's a quick example of -V:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
; one euro is worth this many dollars from nov 1
|
|
||||||
P 2016/11/01 € $1.10
|
|
||||||
|
|
||||||
; purchase some euros on nov 3
|
|
||||||
2016/11/3
|
|
||||||
assets:euros €100
|
|
||||||
assets:checking
|
|
||||||
|
|
||||||
; the euro is worth fewer dollars by dec 21
|
|
||||||
P 2016/12/21 € $1.03
|
|
||||||
```
|
|
||||||
How many euros do I have ?
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j bal -N euros
|
|
||||||
€100 assets:euros
|
|
||||||
```
|
|
||||||
What are they worth at end of nov 3 ?
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j bal -N euros -V -e 2016/11/4
|
|
||||||
$110.00 assets:euros
|
|
||||||
```
|
|
||||||
What are they worth after 2016/12/21 ? (no report end date specified, defaults to today)
|
|
||||||
```shell
|
|
||||||
$ hledger -f t.j bal -N euros -V
|
|
||||||
$103.00 assets:euros
|
|
||||||
```
|
|
||||||
|
|
||||||
### -X: Market value in specified commodity
|
|
||||||
|
|
||||||
The `-X/--exchange` option is like `-V`, except it specifies the target commodity you would like to convert to.
|
|
||||||
It is equivalent to `--value=now,COMM` or `--value=end,COMM`.
|
|
||||||
|
|
||||||
### --value: Flexible valuation
|
|
||||||
|
|
||||||
*(experimental, added 201905)*
|
|
||||||
|
|
||||||
`-B`, `-V` and `-X` are special cases of the more general `--value` option:
|
|
||||||
|
|
||||||
--value=TYPE[,COMM] TYPE is cost, end, now or YYYY-MM-DD.
|
|
||||||
COMM is an optional commodity symbol.
|
|
||||||
Shows amounts converted to:
|
|
||||||
- cost commodity using transaction prices (then optionally to COMM using market prices at period end(s))
|
|
||||||
- default valuation commodity (or COMM) using market prices at period end(s)
|
|
||||||
- default valuation commodity (or COMM) using current market prices
|
|
||||||
- default valuation commodity (or COMM) using market prices at some date
|
|
||||||
|
|
||||||
The TYPE part basically selects either "cost", or "market value" plus a valuation date:
|
|
||||||
|
|
||||||
`--value=cost`
|
|
||||||
: Convert amounts to cost, using the prices recorded in transactions.
|
|
||||||
|
|
||||||
`--value=end`
|
|
||||||
: Convert amounts to their value in a default valuation commodity, using market prices
|
|
||||||
on the last day of the report period (or if unspecified, the journal's end date);
|
|
||||||
or in multiperiod reports, market prices on the last day of each subperiod.
|
|
||||||
|
|
||||||
`--value=now`
|
|
||||||
: Convert amounts to their value in default valuation commodity using current market prices
|
|
||||||
(as of when report is generated).
|
|
||||||
|
|
||||||
`--value=YYYY-MM-DD`
|
|
||||||
: Convert amounts to their value in default valuation commodity using market prices
|
|
||||||
on this date.
|
|
||||||
|
|
||||||
The default valuation commodity is the commodity mentioned in the most
|
|
||||||
recent applicable market price declaration. When all your price
|
|
||||||
declarations lead to a single home currency, this will usually do what
|
|
||||||
you want.
|
|
||||||
|
|
||||||
To select a different valuation commodity, add the optional `,COMM` part:
|
|
||||||
a comma, then the target commodity's symbol. Eg: **`--value=now,EUR`**.
|
|
||||||
hledger will do its best to convert amounts to this commodity, using:
|
|
||||||
|
|
||||||
- declared prices (from source commodity to valuation commodity)
|
|
||||||
- reverse prices (declared prices from valuation to source commodity, inverted)
|
|
||||||
- indirect prices (prices calculated from the shortest chain of declared or reverse prices from source to valuation commodity)
|
|
||||||
|
|
||||||
in that order.
|
|
||||||
|
|
||||||
Here are some examples showing the effect of `--value` as seen with `print`:
|
|
||||||
|
|
||||||
```journal
|
|
||||||
P 2000-01-01 A 1 B
|
|
||||||
P 2000-02-01 A 2 B
|
|
||||||
P 2000-03-01 A 3 B
|
|
||||||
P 2000-04-01 A 4 B
|
|
||||||
|
|
||||||
2000-01-01
|
|
||||||
(a) 1 A @ 5 B
|
|
||||||
|
|
||||||
2000-02-01
|
|
||||||
(a) 1 A @ 6 B
|
|
||||||
|
|
||||||
2000-03-01
|
|
||||||
(a) 1 A @ 7 B
|
|
||||||
```
|
|
||||||
|
|
||||||
Show the cost of each posting:
|
|
||||||
```shell
|
|
||||||
$ hledger -f- print --value=cost
|
|
||||||
2000-01-01
|
|
||||||
(a) 5 B
|
|
||||||
|
|
||||||
2000-02-01
|
|
||||||
(a) 6 B
|
|
||||||
|
|
||||||
2000-03-01
|
|
||||||
(a) 7 B
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Show the value as of the last day of the report period (2000-02-29):
|
|
||||||
```shell
|
|
||||||
$ hledger -f- print --value=end date:2000/01-2000/03
|
|
||||||
2000-01-01
|
|
||||||
(a) 2 B
|
|
||||||
|
|
||||||
2000-02-01
|
|
||||||
(a) 2 B
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
With no report period specified, that shows the value as of the last day of the journal (2000-03-01):
|
|
||||||
```shell
|
|
||||||
$ hledger -f- print --value=end
|
|
||||||
2000-01-01
|
|
||||||
(a) 3 B
|
|
||||||
|
|
||||||
2000-02-01
|
|
||||||
(a) 3 B
|
|
||||||
|
|
||||||
2000-03-01
|
|
||||||
(a) 3 B
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Show the current value (the 2000-04-01 price is still in effect today):
|
|
||||||
```shell
|
|
||||||
$ hledger -f- print --value=now
|
|
||||||
2000-01-01
|
|
||||||
(a) 4 B
|
|
||||||
|
|
||||||
2000-02-01
|
|
||||||
(a) 4 B
|
|
||||||
|
|
||||||
2000-03-01
|
|
||||||
(a) 4 B
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
Show the value on 2000/01/15:
|
|
||||||
```shell
|
|
||||||
$ hledger -f- print --value=2000-01-15
|
|
||||||
2000-01-01
|
|
||||||
(a) 1 B
|
|
||||||
|
|
||||||
2000-02-01
|
|
||||||
(a) 1 B
|
|
||||||
|
|
||||||
2000-03-01
|
|
||||||
(a) 1 B
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
You may need to explicitly set a commodity's display style, when reverse prices are used.
|
|
||||||
Eg this output might be surprising:
|
|
||||||
```
|
|
||||||
P 2000-01-01 A 2B
|
|
||||||
|
|
||||||
2000-01-01
|
|
||||||
a 1B
|
|
||||||
b
|
|
||||||
```
|
|
||||||
```
|
|
||||||
$ hledger print -x -X A
|
|
||||||
2000-01-01
|
|
||||||
a 0
|
|
||||||
b 0
|
|
||||||
|
|
||||||
```
|
|
||||||
Explanation: because there's no amount or commodity directive specifying a display style
|
|
||||||
for A, 0.5A gets the default style, which shows no decimal digits. Because the displayed
|
|
||||||
amount looks like zero, the commodity symbol and minus sign are not displayed either.
|
|
||||||
Adding a commodity directive sets a more useful display style for A:
|
|
||||||
```
|
|
||||||
P 2000-01-01 A 2B
|
|
||||||
commodity 0.00A
|
|
||||||
|
|
||||||
2000-01-01
|
|
||||||
a 1B
|
|
||||||
b
|
|
||||||
```
|
|
||||||
```
|
|
||||||
$ hledger print -X A
|
|
||||||
2000-01-01
|
|
||||||
a 0.50A
|
|
||||||
b -0.50A
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
### Effect of --value on reports
|
|
||||||
|
|
||||||
Here is a reference for how `--value` currently affects each part of hledger's reports.
|
|
||||||
It's work in progress, but may be useful for troubleshooting or reporting bugs.
|
|
||||||
See also the definitions and notes below.
|
|
||||||
If you find problems, please report them, ideally with a reproducible example.
|
|
||||||
Related:
|
|
||||||
[#329](https://github.com/simonmichael/hledger/issues/329),
|
|
||||||
[#1083](https://github.com/simonmichael/hledger/issues/1083).
|
|
||||||
|
|
||||||
| Report type | `-B`, `--value=cost` | `-V`, `-X` | `--value=end` | `--value=DATE`, `--value=now` |
|
|
||||||
|:------------------------------------------------|:----------------------------------------------|:-------------------------------------------------|:---------------------------------------------------|:----------------------------------------|
|
|
||||||
| **print** | | | | |
|
|
||||||
| posting amounts | cost | value at report end or today | value at report or journal end | value at DATE/today |
|
|
||||||
| balance assertions / assignments | unchanged | unchanged | unchanged | unchanged |
|
|
||||||
| <br> | | | | |
|
|
||||||
| **register** | | | | |
|
|
||||||
| starting balance (with -H) | cost | value at day before report or journal start | value at day before report or journal start | value at DATE/today |
|
|
||||||
| posting amounts (no report interval) | cost | value at report end or today | value at report or journal end | value at DATE/today |
|
|
||||||
| summary posting amounts (with report interval) | summarised cost | value at period ends | value at period ends | value at DATE/today |
|
|
||||||
| running total/average | sum/average of displayed values | sum/average of displayed values | sum/average of displayed values | sum/average of displayed values |
|
|
||||||
| <br> | | | | |
|
|
||||||
| **balance (bs, bse, cf, is..)** | | | | |
|
|
||||||
| balances (no report interval) | sums of costs | value at report end or today of sums of postings | value at report or journal end of sums of postings | value at DATE/today of sums of postings |
|
|
||||||
| balances (with report interval) | sums of costs | value at period ends of sums of postings | value at period ends of sums of postings | value at DATE/today of sums of postings |
|
|
||||||
| starting balances (with report interval and -H) | sums of costs of postings before report start | sums of postings before report start | sums of postings before report start | sums of postings before report start |
|
|
||||||
| budget amounts with --budget | like balances | like balances | like balances | like balances |
|
|
||||||
| grand total (no report interval) | sum of displayed values | sum of displayed values | sum of displayed values | sum of displayed values |
|
|
||||||
| row totals/averages (with report interval) | sums/averages of displayed values | sums/averages of displayed values | sums/averages of displayed values | sums/averages of displayed values |
|
|
||||||
| column totals | sums of displayed values | sums of displayed values | sums of displayed values | sums of displayed values |
|
|
||||||
| grand total/average | sum/average of column totals | sum/average of column totals | sum/average of column totals | sum/average of column totals |
|
|
||||||
| <br> | | | | |
|
|
||||||
|
|
||||||
**Additional notes**
|
|
||||||
|
|
||||||
*cost*
|
|
||||||
: calculated using price(s) recorded in the transaction(s).
|
|
||||||
|
|
||||||
*value*
|
|
||||||
: market value using available market price declarations, or the unchanged amount if no conversion rate can be found.
|
|
||||||
|
|
||||||
*report start*
|
|
||||||
: the first day of the report period specified with -b or -p or date:, otherwise today.
|
|
||||||
|
|
||||||
*report or journal start*
|
|
||||||
: the first day of the report period specified with -b or -p or date:, otherwise the earliest transaction date in the journal, otherwise today.
|
|
||||||
|
|
||||||
*report end*
|
|
||||||
: the last day of the report period specified with -e or -p or date:, otherwise today.
|
|
||||||
|
|
||||||
*report or journal end*
|
|
||||||
: the last day of the report period specified with -e or -p or date:, otherwise the latest transaction date in the journal, otherwise today.
|
|
||||||
|
|
||||||
*report interval*
|
|
||||||
: a flag (-D/-W/-M/-Q/-Y) or period expression that activates the report's multi-period mode (whether showing one or many subperiods).
|
|
||||||
|
|
||||||
|
|
||||||
### Combining -B, -V, -X, --value
|
|
||||||
|
|
||||||
The rightmost of these flags wins.
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user