summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.md4
-rw-r--r--hledger-lib.cabal4
-rw-r--r--hledger_csv.52
-rw-r--r--hledger_csv.info582
-rw-r--r--hledger_csv.txt207
-rw-r--r--hledger_journal.52
-rw-r--r--hledger_journal.info1079
-rw-r--r--hledger_journal.txt461
-rw-r--r--hledger_timeclock.52
-rw-r--r--hledger_timeclock.info36
-rw-r--r--hledger_timeclock.txt2
-rw-r--r--hledger_timedot.52
-rw-r--r--hledger_timedot.info67
-rw-r--r--hledger_timedot.txt20
14 files changed, 1351 insertions, 1119 deletions
diff --git a/CHANGES.md b/CHANGES.md
index 1860555..4573dc2 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,6 +1,10 @@
Internal/api/developer-ish changes in the hledger-lib (and hledger) packages.
For user-visible changes, see the hledger package changelog.
+# 1.20.4 2021-01-29
+
+- See hledger.
+
# 1.20.3 2021-01-14
- See hledger.
diff --git a/hledger-lib.cabal b/hledger-lib.cabal
index 5997d22..3af1af1 100644
--- a/hledger-lib.cabal
+++ b/hledger-lib.cabal
@@ -4,10 +4,10 @@ cabal-version: 1.12
--
-- see: https://github.com/sol/hpack
--
--- hash: 84b9a4a7bf3049275178ede9a44418e46548ddce8bdbd182d32caccb5cb51f3f
+-- hash: 3f8656e682d0ff102bad0022b06b881b2de2ca72cf342fd31090a33f7d87b692
name: hledger-lib
-version: 1.20.3
+version: 1.20.4
synopsis: A reusable library providing the core functionality of hledger
description: A reusable library containing hledger's core functionality.
This is used by most hledger* packages so that they support the same
diff --git a/hledger_csv.5 b/hledger_csv.5
index cc2b912..da1f4b5 100644
--- a/hledger_csv.5
+++ b/hledger_csv.5
@@ -1,6 +1,6 @@
.\"t
-.TH "HLEDGER_CSV" "5" "December 2020" "hledger-lib-1.20.3 " "hledger User Manuals"
+.TH "HLEDGER_CSV" "5" "December 2020" "hledger-lib-1.20.4 " "hledger User Manuals"
diff --git a/hledger_csv.info b/hledger_csv.info
index e85038a..10b62d8 100644
--- a/hledger_csv.info
+++ b/hledger_csv.info
@@ -1,7 +1,8 @@
-This is hledger_csv.info, produced by makeinfo version 6.7 from stdin.
+This is hledger-lib/hledger_csv.info, produced by makeinfo version 4.8
+from stdin.

-File: hledger_csv.info, Node: Top, Next: EXAMPLES, Up: (dir)
+File: hledger_csv.info, Node: Top, Up: (dir)
hledger_csv(5)
**************
@@ -15,44 +16,44 @@ transaction.
(To learn about _writing_ CSV, see CSV output.)
- We describe each CSV file's format with a corresponding _rules file_.
-By default this is named like the CSV file with a '.rules' extension
-added. Eg when reading 'FILE.csv', hledger also looks for
-'FILE.csv.rules' in the same directory as 'FILE.csv'. You can specify a
-different rules file with the '--rules-file' option. If a rules file is
-not found, hledger will create a sample rules file, which you'll need to
-adjust.
+ We describe each CSV file's format with a corresponding _rules
+file_. By default this is named like the CSV file with a `.rules'
+extension added. Eg when reading `FILE.csv', hledger also looks for
+`FILE.csv.rules' in the same directory as `FILE.csv'. You can specify a
+different rules file with the `--rules-file' option. If a rules file is
+not found, hledger will create a sample rules file, which you'll need
+to adjust.
This file contains rules describing the CSV data (header line, fields
layout, date format etc.), and how to construct hledger journal entries
-(transactions) from it. Often there will also be a list of conditional
-rules for categorising transactions based on their descriptions. Here's
+(transactions) from it. Often there will also be a list of conditional
+rules for categorising transactions based on their descriptions. Here's
an overview of the CSV rules; these are described more fully below,
after the examples:
-*'skip'* skip one or more header lines or
- matched CSV records
-*'fields'* name CSV fields, assign them to hledger
+*`skip'* skip one or more header lines or matched
+ CSV records
+*`fields'* name CSV fields, assign them to hledger
fields
*field assignment* assign a value to one hledger field,
with interpolation
-*'separator'* a custom field separator
-*'if' block* apply some rules to CSV records matched
+*`separator'* a custom field separator
+*`if' block* apply some rules to CSV records matched
by patterns
-*'if' table* apply some rules to CSV records matched
+*`if' table* apply some rules to CSV records matched
by patterns, alternate syntax
-*'end'* skip the remaining CSV records
-*'date-format'* how to parse dates in CSV records
-*'decimal-mark'* the decimal mark used in CSV amounts,
- if ambiguous
-*'newest-first'* disambiguate record order when there's
+*`end'* skip the remaining CSV records
+*`date-format'* how to parse dates in CSV records
+*`decimal-mark'* the decimal mark used in CSV amounts, if
+ ambiguous
+*`newest-first'* disambiguate record order when there's
only one date
-*'include'* inline another CSV rules file
-*'balance-type'* choose which type of balance
- assignments to use
+*`include'* inline another CSV rules file
+*`balance-type'* choose which type of balance assignments
+ to use
- Note, for best error messages when reading CSV files, use a '.csv',
-'.tsv' or '.ssv' file extension or file prefix - see File Extension
+ Note, for best error messages when reading CSV files, use a `.csv',
+`.tsv' or `.ssv' file extension or file prefix - see File Extension
below.
There's an introductory Convert CSV files tutorial on hledger.org.
@@ -69,7 +70,7 @@ File: hledger_csv.info, Node: EXAMPLES, Next: CSV RULES, Prev: Top, Up: Top
1 EXAMPLES
**********
-Here are some sample hledger CSV rules files. See also the full
+Here are some sample hledger CSV rules files. See also the full
collection at:
https://github.com/simonmichael/hledger/tree/master/examples/csv
@@ -88,16 +89,19 @@ File: hledger_csv.info, Node: Basic, Next: Bank of Ireland, Up: EXAMPLES
At minimum, the rules file must identify the date and amount fields, and
often it also specifies the date format and how many header lines there
-are. Here's a simple CSV file and a rules file for it:
+are. Here's a simple CSV file and a rules file for it:
+
Date, Description, Id, Amount
12/11/2019, Foo, 123, 10.23
+
# basic.csv.rules
skip 1
fields date, description, _, amount
date-format %d/%m/%Y
+
$ hledger print -f basic.csv
2019-11-12 Foo
expenses:unknown 10.23
@@ -115,10 +119,12 @@ Here's a CSV with two amount fields (Debit and Credit), and a balance
field, which we can use to add balance assertions, which is not
necessary but provides extra error checking:
+
Date,Details,Debit,Credit,Balance
07/12/2012,LODGMENT 529898,,10.0,131.21
07/12/2012,PAYMENT,5,,126
+
# bankofireland-checking.csv.rules
# skip the header line
@@ -145,6 +151,7 @@ currency EUR
# set the base account for all txns
account1 assets:bank:boi:checking
+
$ hledger -f bankofireland-checking.csv print
2012-12-07 LODGMENT 529898
assets:bank:boi:checking EUR10.0 = EUR131.2
@@ -165,13 +172,15 @@ File: hledger_csv.info, Node: Amazon, Next: Paypal, Prev: Bank of Ireland, U
==========
Here we convert amazon.com order history, and use an if block to
-generate a third posting if there's a fee. (In practice you'd probably
+generate a third posting if there's a fee. (In practice you'd probably
get this data from your bank instead, but it's an example.)
+
"Date","Type","To/From","Name","Status","Amount","Fees","Transaction ID"
"Jul 29, 2012","Payment","To","Foo.","Completed","$20.00","$0.00","16000000000000DGLNJPI1P9B8DKPVHL"
"Jul 30, 2012","Payment","To","Adapteva, Inc.","Completed","$25.00","$1.00","17LA58JSKRD4HDGLNJPI1P9B8DKPVHL"
+
# amazon-orders.csv.rules
# skip one header line
@@ -206,6 +215,7 @@ if %fees [1-9]
account3 expenses:fees
amount3 %fees
+
$ hledger -f amazon-orders.csv print
2012-07-29 (16000000000000DGLNJPI1P9B8DKPVHL) To Foo. ; status:Completed
assets:amazon
@@ -225,6 +235,7 @@ File: hledger_csv.info, Node: Paypal, Prev: Amazon, Up: EXAMPLES
Here's a real-world rules file for (customised) Paypal CSV, with some
Paypal-specific rules, and a second rules file included:
+
"Date","Time","TimeZone","Name","Type","Status","Currency","Gross","Fee","Net","From Email Address","To Email Address","Transaction ID","Item Title","Item ID","Reference Txn ID","Receipt ID","Balance","Note"
"10/01/2019","03:46:20","PDT","Calm Radio","Subscription Payment","Completed","USD","-6.99","0.00","-6.99","simon@joyful.com","memberships@calmradio.com","60P57143A8206782E","MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month","","I-R8YLY094FJYR","","-6.99",""
"10/01/2019","03:46:20","PDT","","Bank Deposit to PP Account ","Pending","USD","6.99","0.00","6.99","","simon@joyful.com","0TU1544T080463733","","","60P57143A8206782E","","0.00",""
@@ -234,6 +245,7 @@ Paypal-specific rules, and a second rules file included:
"10/19/2019","03:02:12","PDT","","Bank Deposit to PP Account ","Pending","USD","2.00","0.00","2.00","","simon@joyful.com","3XJ107139A851061F","","","K9U43044RY432050M","","0.00",""
"10/22/2019","05:07:06","PDT","Noble Benefactor","Subscription Payment","Completed","USD","10.00","-0.59","9.41","noble@bene.fac.tor","simon@joyful.com","6L8L1662YP1334033","Joyful Systems","","I-KC9VBGY2GWDB","","9.41",""
+
# paypal-custom.csv.rules
# Tips:
@@ -316,6 +328,7 @@ Bank Deposit to PP Account
if Currency Conversion
account2 equity:currency conversion
+
# common.rules
if
@@ -339,6 +352,7 @@ if Google
account2 expenses:online:apps
description google | music
+
$ hledger -f paypal-custom.csv print
2019-10-01 (60P57143A8206782E) Calm Radio MONTHLY - $1 for the first 2 Months: Me - Order 99309. Item total: $1.00 USD first 2 months, then $6.99 / Month ; itemid:, fromemail:simon@joyful.com, toemail:memberships@calmradio.com, time:03:46:20, type:Subscription Payment, status:Completed
assets:online:paypal $-6.99 = $-6.99
@@ -377,7 +391,7 @@ File: hledger_csv.info, Node: CSV RULES, Next: TIPS, Prev: EXAMPLES, Up: Top
***********
The following kinds of rule can appear in the rules file, in any order.
-Blank lines and lines beginning with '#' or ';' are ignored.
+Blank lines and lines beginning with `#' or `;' are ignored.
* Menu:
@@ -397,15 +411,16 @@ Blank lines and lines beginning with '#' or ';' are ignored.

File: hledger_csv.info, Node: skip, Next: fields, Up: CSV RULES
-2.1 'skip'
+2.1 `skip'
==========
+
skip N
- The word "skip" followed by a number (or no number, meaning 1) tells
+The word "skip" followed by a number (or no number, meaning 1) tells
hledger to ignore this many non-empty lines preceding the CSV data.
-(Empty/blank lines are skipped automatically.) You'll need this
-whenever your CSV data contains header lines.
+(Empty/blank lines are skipped automatically.) You'll need this whenever
+your CSV data contains header lines.
It also has a second purpose: it can be used inside if blocks to
ignore certain CSV records (described below).
@@ -413,35 +428,38 @@ ignore certain CSV records (described below).

File: hledger_csv.info, Node: fields, Next: field assignment, Prev: skip, Up: CSV RULES
-2.2 'fields'
+2.2 `fields'
============
+
fields FIELDNAME1, FIELDNAME2, ...
- A fields list (the word "fields" followed by comma-separated field
-names) is the quick way to assign CSV field values to hledger fields.
-It does two things:
+A fields list (the word "fields" followed by comma-separated field
+names) is the quick way to assign CSV field values to hledger fields. It
+does two things:
- 1. it names the CSV fields. This is optional, but can be convenient
+ 1. it names the CSV fields. This is optional, but can be convenient
later for interpolating them.
2. when you use a standard hledger field name, it assigns the CSV
value to that part of the hledger transaction.
+
Here's an example that says "use the 1st, 2nd and 4th fields as the
transaction's date, description and amount; name the last two fields for
later reference; and ignore the others":
+
fields date, description, , amount, , , somefield, anotherfield
- Field names may not contain whitespace. Fields you don't care about
-can be left unnamed. Currently there must be least two items (there
+ Field names may not contain whitespace. Fields you don't care about
+can be left unnamed. Currently there must be least two items (there
must be at least one comma).
Note, always use comma in the fields list, even if your CSV uses
another separator character.
- Here are the standard hledger field/pseudo-field names. For more
+ Here are the standard hledger field/pseudo-field names. For more
about the transaction parts they refer to, see the manual for hledger's
journal format.
@@ -456,7 +474,7 @@ File: hledger_csv.info, Node: Transaction field names, Next: Posting field nam
2.2.1 Transaction field names
-----------------------------
-'date', 'date2', 'status', 'code', 'description', 'comment' can be used
+`date', `date2', `status', `code', `description', `comment' can be used
to form the transaction's first line.

@@ -479,12 +497,12 @@ File: hledger_csv.info, Node: account, Next: amount, Up: Posting field names
2.2.2.1 account
...............
-'accountN', where N is 1 to 99, causes a posting to be generated, with
+`accountN', where N is 1 to 99, causes a posting to be generated, with
that account name.
- Most often there are two postings, so you'll want to set 'account1'
-and 'account2'. Typically 'account1' is associated with the CSV file,
-and is set once with a top-level assignment, while 'account2' is set
+ Most often there are two postings, so you'll want to set `account1'
+and `account2'. Typically `account1' is associated with the CSV file,
+and is set once with a top-level assignment, while `account2' is set
based on each transaction's description, and in conditional blocks.
If a posting's account name is left unset but its amount is set (see
@@ -497,14 +515,14 @@ File: hledger_csv.info, Node: amount, Next: currency, Prev: account, Up: Pos
2.2.2.2 amount
..............
-'amountN' sets posting N's amount. If the CSV uses separate fields for
-inflows and outflows, you can use 'amountN-in' and 'amountN-out'
-instead. By assigning to 'amount1', 'amount2', ... etc. you can
+`amountN' sets posting N's amount. If the CSV uses separate fields for
+inflows and outflows, you can use `amountN-in' and `amountN-out'
+instead. By assigning to `amount1', `amount2', ... etc. you can
generate anywhere from 0 to 99 postings.
There is also an older, unnumbered form of these names, suitable for
2-posting transactions, which sets both posting 1's and (negated)
-posting 2's amount: 'amount', or 'amount-in' and 'amount-out'. This is
+posting 2's amount: `amount', or `amount-in' and `amount-out'. This is
still supported because it keeps pre-hledger-1.17 csv rules files
working, and because it can be more succinct, and because it converts
posting 2's amount to cost if there's a transaction price, which can be
@@ -512,11 +530,11 @@ useful.
If you have an existing rules file using the unnumbered form, you
might want to use the numbered form in certain conditional blocks,
-without having to update and retest all the old rules. To facilitate
-this, posting 1 ignores 'amount'/'amount-in'/'amount-out' if any of
-'amount1'/'amount1-in'/'amount1-out' are assigned, and posting 2 ignores
-them if any of 'amount2'/'amount2-in'/'amount2-out' are assigned,
-avoiding conflicts.
+without having to update and retest all the old rules. To facilitate
+this, posting 1 ignores `amount'/`amount-in'/`amount-out' if any of
+`amount1'/`amount1-in'/`amount1-out' are assigned, and posting 2
+ignores them if any of `amount2'/`amount2-in'/`amount2-out' are
+assigned, avoiding conflicts.

File: hledger_csv.info, Node: currency, Next: balance, Prev: amount, Up: Posting field names
@@ -525,8 +543,8 @@ File: hledger_csv.info, Node: currency, Next: balance, Prev: amount, Up: Pos
................
If the CSV has the currency symbol in a separate field (ie, not part of
-the amount field), you can use 'currencyN' to prepend it to posting N's
-amount. Or, 'currency' with no number affects all postings.
+the amount field), you can use `currencyN' to prepend it to posting N's
+amount. Or, `currency' with no number affects all postings.

File: hledger_csv.info, Node: balance, Next: comment, Prev: currency, Up: Posting field names
@@ -534,14 +552,14 @@ File: hledger_csv.info, Node: balance, Next: comment, Prev: currency, Up: Po
2.2.2.4 balance
...............
-'balanceN' sets a balance assertion amount (or if the posting amount is
+`balanceN' sets a balance assertion amount (or if the posting amount is
left empty, a balance assignment) on posting N.
- Also, for compatibility with hledger <1.17: 'balance' with no number
-is equivalent to 'balance1'.
+ Also, for compatibility with hledger <1.17: `balance' with no number
+is equivalent to `balance1'.
You can adjust the type of assertion/assignment with the
-'balance-type' rule (see below).
+`balance-type' rule (see below).

File: hledger_csv.info, Node: comment, Prev: balance, Up: Posting field names
@@ -549,7 +567,7 @@ File: hledger_csv.info, Node: comment, Prev: balance, Up: Posting field names
2.2.2.5 comment
...............
-Finally, 'commentN' sets a comment on the Nth posting. Comments can
+Finally, `commentN' sets a comment on the Nth posting. Comments can
also contain tags, as usual.
See TIPS below for more about setting amounts and currency.
@@ -560,14 +578,16 @@ File: hledger_csv.info, Node: field assignment, Next: separator, Prev: fields
2.3 field assignment
====================
+
HLEDGERFIELDNAME FIELDVALUE
- Instead of or in addition to a fields list, you can use a "field
+Instead of or in addition to a fields list, you can use a "field
assignment" rule to set the value of a single hledger field, by writing
its name (any of the standard hledger field names above) followed by a
-text value. The value may contain interpolated CSV fields, referenced
-by their 1-based position in the CSV record ('%N'), or by the name they
-were given in the fields list ('%CSVFIELDNAME'). Some examples:
+text value. The value may contain interpolated CSV fields, referenced by
+their 1-based position in the CSV record (`%N'), or by the name they
+were given in the fields list (`%CSVFIELDNAME'). Some examples:
+
# set the amount to the 4th CSV field, with " USD" appended
amount %4 USD
@@ -575,41 +595,45 @@ amount %4 USD
# combine three fields to make a comment, containing note: and date: tags
comment note: %somefield - %anotherfield, date: %1
- Interpolation strips outer whitespace (so a CSV value like '" 1 "'
-becomes '1' when interpolated) (#1051). See TIPS below for more about
+ Interpolation strips outer whitespace (so a CSV value like `" 1 "'
+becomes `1' when interpolated) (#1051). See TIPS below for more about
referencing other fields.

File: hledger_csv.info, Node: separator, Next: if block, Prev: field assignment, Up: CSV RULES
-2.4 'separator'
+2.4 `separator'
===============
-You can use the 'separator' rule to read other kinds of
-character-separated data. The argument is any single separator
-character, or the words 'tab' or 'space' (case insensitive). Eg, for
+You can use the `separator' rule to read other kinds of
+character-separated data. The argument is any single separator
+character, or the words `tab' or `space' (case insensitive). Eg, for
comma-separated values (CSV):
+
separator ,
or for semicolon-separated values (SSV):
+
separator ;
or for tab-separated values (TSV):
+
separator TAB
- If the input file has a '.csv', '.ssv' or '.tsv' file extension (or a
-'csv:', 'ssv:', 'tsv:' prefix), the appropriate separator will be
+ If the input file has a `.csv', `.ssv' or `.tsv' file extension (or
+a `csv:', `ssv:', `tsv:' prefix), the appropriate separator will be
inferred automatically, and you won't need this rule.

File: hledger_csv.info, Node: if block, Next: if table, Prev: separator, Up: CSV RULES
-2.5 'if' block
+2.5 `if' block
==============
+
if MATCHER
RULE
@@ -620,10 +644,9 @@ MATCHER
RULE
RULE
- Conditional blocks ("if blocks") are a block of rules that are
-applied only to CSV records which match certain patterns. They are
-often used for customising account names based on transaction
-descriptions.
+Conditional blocks ("if blocks") are a block of rules that are applied
+only to CSV records which match certain patterns. They are often used
+for customising account names based on transaction descriptions.
* Menu:
@@ -640,20 +663,21 @@ File: hledger_csv.info, Node: Matching the whole record, Next: Matching indivi
Each MATCHER can be a record matcher, which looks like this:
+
REGEX
REGEX is a case-insensitive regular expression which tries to match
-anywhere within the CSV record. It is a POSIX ERE (extended regular
-expression) that also supports GNU word boundaries ('\b', '\B', '\<',
-'\>'), and nothing else. If you have trouble, be sure to check our
+anywhere within the CSV record. It is a POSIX ERE (extended regular
+expression) that also supports GNU word boundaries (`\b', `\B', `\<',
+`\>'), and nothing else. If you have trouble, be sure to check our
https://hledger.org/hledger.html#regular-expressions doc.
Important note: the record that is matched is not the original
record, but a synthetic one, with any enclosing double quotes (but not
enclosing whitespace) removed, and always comma-separated (which means
-that a field containing a comma will appear like two fields). Eg, if
-the original record is '2020-01-01; "Acme, Inc."; 1,000', the REGEX will
-actually see '2020-01-01,Acme, Inc., 1,000').
+that a field containing a comma will appear like two fields). Eg, if the
+original record is `2020-01-01; "Acme, Inc."; 1,000', the REGEX will
+actually see `2020-01-01,Acme, Inc., 1,000').

File: hledger_csv.info, Node: Matching individual fields, Next: Combining matchers, Prev: Matching the whole record, Up: if block
@@ -663,11 +687,12 @@ File: hledger_csv.info, Node: Matching individual fields, Next: Combining matc
Or, MATCHER can be a field matcher, like this:
+
%CSVFIELD REGEX
- which matches just the content of a particular CSV field. CSVFIELD
+ which matches just the content of a particular CSV field. CSVFIELD
is a percent sign followed by the field's name or column number, like
-'%date' or '%1'.
+`%date' or `%1'.

File: hledger_csv.info, Node: Combining matchers, Next: Rules applied on successful match, Prev: Matching individual fields, Up: if block
@@ -678,9 +703,10 @@ File: hledger_csv.info, Node: Combining matchers, Next: Rules applied on succe
A single matcher can be written on the same line as the "if"; or
multiple matchers can be written on the following lines, non-indented.
Multiple matchers are OR'd (any one of them can match), unless one
-begins with an '&' symbol, in which case it is AND'ed with the previous
+begins with an `&' symbol, in which case it is AND'ed with the previous
matcher.
+
if
MATCHER
& MATCHER
@@ -693,19 +719,23 @@ File: hledger_csv.info, Node: Rules applied on successful match, Prev: Combini
---------------------------------------
After the patterns there should be one or more rules to apply, all
-indented by at least one space. Three kinds of rule are allowed in
+indented by at least one space. Three kinds of rule are allowed in
conditional blocks:
* field assignments (to set a hledger field)
+
* skip (to skip the matched CSV record)
+
* end (to skip all remaining CSV records).
Examples:
+
# if the CSV record contains "groceries", set account2 to "expenses:groceries"
if groceries
account2 expenses:groceries
+
# if the CSV record contains any of these patterns, set account2 and comment as shown
if
monthly service fee
@@ -717,26 +747,28 @@ banking thru software

File: hledger_csv.info, Node: if table, Next: end, Prev: if block, Up: CSV RULES
-2.6 'if' table
+2.6 `if' table
==============
+
if,CSVFIELDNAME1,CSVFIELDNAME2,...,CSVFIELDNAMEn
MATCHER1,VALUE11,VALUE12,...,VALUE1n
MATCHER2,VALUE21,VALUE22,...,VALUE2n
MATCHER3,VALUE31,VALUE32,...,VALUE3n
<empty line>
- Conditional tables ("if tables") are a different syntax to specify
-field assignments that will be applied only to CSV records which match
-certain patterns.
+Conditional tables ("if tables") are a different syntax to specify field
+assignments that will be applied only to CSV records which match certain
+patterns.
MATCHER could be either field or record matcher, as described above.
When MATCHER matches, values from that row would be assigned to the CSV
-fields named on the 'if' line, in the same order.
+fields named on the `if' line, in the same order.
- Therefore 'if' table is exactly equivalent to a sequence of of 'if'
+ Therefore `if' table is exactly equivalent to a sequence of of `if'
blocks:
+
if MATCHER1
CSVFIELDNAME1 VALUE11
CSVFIELDNAME2 VALUE12
@@ -759,17 +791,18 @@ if MATCHER3
empty) values for all the listed fields.
Rules would be checked and applied in the order they are listed in
-the table and, like with 'if' blocks, later rules (in the same or
-another table) or 'if' blocks could override the effect of any rule.
+the table and, like with `if' blocks, later rules (in the same or
+another table) or `if' blocks could override the effect of any rule.
Instead of ',' you can use a variety of other non-alphanumeric
-characters as a separator. First character after 'if' is taken to be
-the separator for the rest of the table. It is the responsibility of
+characters as a separator. First character after `if' is taken to be
+the separator for the rest of the table. It is the responsibility of
the user to ensure that separator does not occur inside MATCHERs and
values - there is no way to escape separator.
Example:
+
if,account2,comment
atm transaction fee,expenses:business:banking,deductible? check it
%description groceries,expenses:groceries,
@@ -778,12 +811,13 @@ atm transaction fee,expenses:business:banking,deductible? check it

File: hledger_csv.info, Node: end, Next: date-format, Prev: if table, Up: CSV RULES
-2.7 'end'
+2.7 `end'
=========
This rule can be used inside if blocks (only), to make hledger stop
reading this CSV file and move on to the next input file, or to command
-execution. Eg:
+execution. Eg:
+
# ignore everything following the first empty record
if ,,,,
@@ -792,27 +826,32 @@ if ,,,,

File: hledger_csv.info, Node: date-format, Next: decimal-mark, Prev: end, Up: CSV RULES
-2.8 'date-format'
+2.8 `date-format'
=================
+
date-format DATEFMT
- This is a helper for the 'date' (and 'date2') fields. If your CSV
-dates are not formatted like 'YYYY-MM-DD', 'YYYY/MM/DD' or 'YYYY.MM.DD',
+This is a helper for the `date' (and `date2') fields. If your CSV dates
+are not formatted like `YYYY-MM-DD', `YYYY/MM/DD' or `YYYY.MM.DD',
you'll need to add a date-format rule describing them with a strptime
date parsing pattern, which must parse the CSV date value completely.
Some examples:
+
# MM/DD/YY
date-format %m/%d/%y
+
# D/M/YYYY
# The - makes leading zeros optional.
date-format %-d/%-m/%Y
+
# YYYY-Mmm-DD
date-format %Y-%h-%d
+
# M/D/YYYY HH:MM AM some other junk
# Note the time and junk must be fully parsed, though only the date is used.
date-format %-m/%-d/%Y %l:%M %p some other junk
@@ -823,17 +862,19 @@ https://hackage.haskell.org/package/time/docs/Data-Time-Format.html#v:formatTime

File: hledger_csv.info, Node: decimal-mark, Next: newest-first, Prev: date-format, Up: CSV RULES
-2.9 'decimal-mark'
+2.9 `decimal-mark'
==================
+
decimal-mark .
- or:
+or:
+
decimal-mark ,
hledger automatically accepts either period or comma as a decimal
-mark when parsing numbers (cf Amounts). However if any numbers in the
+mark when parsing numbers (cf Amounts). However if any numbers in the
CSV contain digit group marks, such as thousand-separating commas, you
should declare the decimal mark explicitly with this rule, to avoid
misparsed numbers.
@@ -841,21 +882,24 @@ misparsed numbers.

File: hledger_csv.info, Node: newest-first, Next: include, Prev: decimal-mark, Up: CSV RULES
-2.10 'newest-first'
+2.10 `newest-first'
===================
-hledger always sorts the generated transactions by date. Transactions
-on the same date should appear in the same order as their CSV records,
-as hledger can usually auto-detect whether the CSV's normal order is
-oldest first or newest first. But if all of the following are true:
+hledger always sorts the generated transactions by date. Transactions on
+the same date should appear in the same order as their CSV records, as
+hledger can usually auto-detect whether the CSV's normal order is oldest
+first or newest first. But if all of the following are true:
* the CSV might sometimes contain just one day of data (all records
having the same date)
- * the CSV records are normally in reverse chronological order (newest
- at the top)
+
+ * the CSV records are normally in reverse chronological order
+ (newest at the top)
+
* and you care about preserving the order of same-day transactions
- then, you should add the 'newest-first' rule as a hint. Eg:
+ then, you should add the `newest-first' rule as a hint. Eg:
+
# tell hledger explicitly that the CSV is normally newest first
newest-first
@@ -863,16 +907,18 @@ newest-first

File: hledger_csv.info, Node: include, Next: balance-type, Prev: newest-first, Up: CSV RULES
-2.11 'include'
+2.11 `include'
==============
+
include RULESFILE
- This includes the contents of another CSV rules file at this point.
-'RULESFILE' is an absolute file path or a path relative to the current
-file's directory. This can be useful for sharing common rules between
+This includes the contents of another CSV rules file at this point.
+`RULESFILE' is an absolute file path or a path relative to the current
+file's directory. This can be useful for sharing common rules between
several rules files, eg:
+
# someaccount.csv.rules
## someaccount-specific rules
@@ -886,21 +932,23 @@ include categorisation.rules

File: hledger_csv.info, Node: balance-type, Prev: include, Up: CSV RULES
-2.12 'balance-type'
+2.12 `balance-type'
===================
Balance assertions generated by assigning to balanceN are of the simple
-'=' type by default, which is a single-commodity, subaccount-excluding
-assertion. You may find the subaccount-including variants more useful,
-eg if you have created some virtual subaccounts of checking to help with
-budgeting. You can select a different type of assertion with the
-'balance-type' rule:
+`=' type by default, which is a single-commodity, subaccount-excluding
+assertion. You may find the subaccount-including variants more useful,
+eg if you have created some virtual subaccounts of checking to help
+with budgeting. You can select a different type of assertion with the
+`balance-type' rule:
+
# balance assertions will consider all commodities and all subaccounts
balance-type ==*
Here are the balance assertion types for quick reference:
+
= single commodity, exclude subaccounts
=* single commodity, include subaccounts
== multi commodity, exclude subaccounts
@@ -932,15 +980,16 @@ File: hledger_csv.info, Node: Rapid feedback, Next: Valid CSV, Up: TIPS
==================
It's a good idea to get rapid feedback while creating/troubleshooting
-CSV rules. Here's a good way, using entr from
+CSV rules. Here's a good way, using entr from
http://eradman.com/entrproject :
+
$ ls foo.csv* | entr bash -c 'echo ----; hledger -f foo.csv print desc:SOMEDESC'
- A desc: query (eg) is used to select just one, or a few, transactions
-of interest. "bash -c" is used to run multiple commands, so we can echo
-a separator each time the command re-runs, making it easier to read the
-output.
+ A desc: query (eg) is used to select just one, or a few,
+transactions of interest. "bash -c" is used to run multiple commands,
+so we can echo a separator each time the command re-runs, making it
+easier to read the output.

File: hledger_csv.info, Node: Valid CSV, Next: File Extension, Prev: Rapid feedback, Up: TIPS
@@ -948,10 +997,11 @@ File: hledger_csv.info, Node: Valid CSV, Next: File Extension, Prev: Rapid fe
3.2 Valid CSV
=============
-hledger accepts CSV conforming to RFC 4180. When CSV values are
-enclosed in quotes, note:
+hledger accepts CSV conforming to RFC 4180. When CSV values are enclosed
+in quotes, note:
* they must be double quotes (not single quotes)
+
* spaces outside the quotes are not allowed

@@ -961,14 +1011,16 @@ File: hledger_csv.info, Node: File Extension, Next: Reading multiple CSV files
==================
To help hledger identify the format and show the right error messages,
-CSV/SSV/TSV files should normally be named with a '.csv', '.ssv' or
-'.tsv' filename extension. Or, the file path should be prefixed with
-'csv:', 'ssv:' or 'tsv:'. Eg:
+CSV/SSV/TSV files should normally be named with a `.csv', `.ssv' or
+`.tsv' filename extension. Or, the file path should be prefixed with
+`csv:', `ssv:' or `tsv:'. Eg:
+
$ hledger -f foo.ssv print
or:
+
$ cat foo | hledger -f ssv:- foo
You can override the file extension with a separator rule if needed.
@@ -980,9 +1032,9 @@ File: hledger_csv.info, Node: Reading multiple CSV files, Next: Valid transact
3.4 Reading multiple CSV files
==============================
-If you use multiple '-f' options to read multiple CSV files at once,
+If you use multiple `-f' options to read multiple CSV files at once,
hledger will look for a correspondingly-named rules file for each CSV
-file. But if you use the '--rules-file' option, that rules file will be
+file. But if you use the `--rules-file' option, that rules file will be
used for all the CSV files.

@@ -999,9 +1051,10 @@ the problem entry.
There is one exception: balance assertions, if you have generated
them, will not be checked, since normally these will work only when the
-CSV data is part of the main journal. If you do need to check balance
+CSV data is part of the main journal. If you do need to check balance
assertions generated from CSV right away, pipe into another hledger:
+
$ hledger -f file.csv print | hledger -f- print

@@ -1015,23 +1068,25 @@ transactions, the new file may overlap with the old one, containing some
of the same records.
The import command will (a) detect the new transactions, and (b)
-append just those transactions to your main journal. It is idempotent,
+append just those transactions to your main journal. It is idempotent,
so you don't have to remember how many times you ran it or with which
-version of the CSV. (It keeps state in a hidden '.latest.FILE.csv'
-file.) This is the easiest way to import CSV data. Eg:
+version of the CSV. (It keeps state in a hidden `.latest.FILE.csv'
+file.) This is the easiest way to import CSV data. Eg:
+
# download the latest CSV files, then run this command.
# Note, no -f flags needed here.
$ hledger import *.csv [--dry]
- This method works for most CSV files. (Where records have a stable
+ This method works for most CSV files. (Where records have a stable
chronological order, and new records appear only at the new end.)
A number of other tools and workflows, hledger-specific and
-otherwise, exist for converting, deduplicating, classifying and managing
-CSV data. See:
+otherwise, exist for converting, deduplicating, classifying and
+managing CSV data. See:
* https://hledger.org -> sidebar -> real world setups
+
* https://plaintextaccounting.org -> data import/conversion

@@ -1042,25 +1097,28 @@ File: hledger_csv.info, Node: Setting amounts, Next: Setting currency/commodit
A posting amount can be set in one of these ways:
- * by assigning (with a fields list or field assignment) to 'amountN'
- (posting N's amount) or 'amount' (posting 1's amount)
+ * by assigning (with a fields list or field assignment) to `amountN'
+ (posting N's amount) or `amount' (posting 1's amount)
- * by assigning to 'amountN-in' and 'amountN-out' (or 'amount-in' and
- 'amount-out'). For each CSV record, whichever of these has a
- non-zero value will be used, with appropriate sign. If both
+ * by assigning to `amountN-in' and `amountN-out' (or `amount-in' and
+ `amount-out'). For each CSV record, whichever of these has a
+ non-zero value will be used, with appropriate sign. If both
contain a non-zero value, this may not work.
- * by assigning to 'balanceN' (or 'balance') instead of the above,
- setting the amount indirectly via a balance assignment. If you do
+ * by assigning to `balanceN' (or `balance') instead of the above,
+ setting the amount indirectly via a balance assignment. If you do
this the default account name may be wrong, so you should set that
explicitly.
+
There is some special handling for an amount's sign:
* If an amount value is parenthesised, it will be de-parenthesised
and sign-flipped.
+
* If an amount value begins with a double minus sign, those cancel
out and are removed.
+
* If an amount value begins with a plus sign, that will be removed

@@ -1072,43 +1130,51 @@ File: hledger_csv.info, Node: Setting currency/commodity, Next: Referencing ot
If the currency/commodity symbol is included in the CSV's amount
field(s):
+
2020-01-01,foo,$123.00
you don't have to do anything special for the commodity symbol, it
-will be assigned as part of the amount. Eg:
+will be assigned as part of the amount. Eg:
+
fields date,description,amount
+
2020-01-01 foo
expenses:unknown $123.00
income:unknown $-123.00
If the currency is provided as a separate CSV field:
+
2020-01-01,foo,USD,123.00
- You can assign that to the 'currency' pseudo-field, which has the
+ You can assign that to the `currency' pseudo-field, which has the
special effect of prepending itself to every amount in the transaction
(on the left, with no separating space):
+
fields date,description,currency,amount
+
2020-01-01 foo
expenses:unknown USD123.00
income:unknown USD-123.00
Or, you can use a field assignment to construct the amount yourself,
-with more control. Eg to put the symbol on the right, and separated by
-a space:
+with more control. Eg to put the symbol on the right, and separated by a
+space:
+
fields date,description,cur,amt
amount %amt %cur
+
2020-01-01 foo
expenses:unknown 123.00 USD
income:unknown -123.00 USD
- Note we used a temporary field name ('cur') that is not 'currency' -
+ Note we used a temporary field name (`cur') that is not `currency' -
that would trigger the prepending effect, which we don't want here.

@@ -1118,10 +1184,11 @@ File: hledger_csv.info, Node: Referencing other fields, Next: How CSV rules ar
============================
In field assignments, you can interpolate only CSV fields, not hledger
-fields. In the example below, there's both a CSV field and a hledger
+fields. In the example below, there's both a CSV field and a hledger
field named amount1, but %amount1 always means the CSV field, not the
hledger field:
+
# Name the third CSV field "amount1"
fields date,description,amount1
@@ -1134,14 +1201,16 @@ comment %amount1
Here, since there's no CSV amount1 field, %amount1 will produce a
literal "amount1":
+
fields date,description,csvamount
amount1 %csvamount USD
# Can't interpolate amount1 here
comment %amount1
When there are multiple field assignments to the same hledger field,
-only the last one takes effect. Here, comment's value will be be B, or
-C if "something" is matched, but never A:
+only the last one takes effect. Here, comment's value will be be B, or C
+if "something" is matched, but never A:
+
comment A
comment B
@@ -1155,122 +1224,129 @@ File: hledger_csv.info, Node: How CSV rules are evaluated, Prev: Referencing o
================================
Here's how to think of CSV rules being evaluated (if you really need
-to). First,
+to). First,
- * 'include' - all includes are inlined, from top to bottom, depth
- first. (At each include point the file is inlined and scanned for
+ * `include' - all includes are inlined, from top to bottom, depth
+ first. (At each include point the file is inlined and scanned for
further includes, recursively, before proceeding.)
- Then "global" rules are evaluated, top to bottom. If a rule is
+ Then "global" rules are evaluated, top to bottom. If a rule is
repeated, the last one wins:
- * 'skip' (at top level)
- * 'date-format'
- * 'newest-first'
- * 'fields' - names the CSV fields, optionally sets up initial
+ * `skip' (at top level)
+
+ * `date-format'
+
+ * `newest-first'
+
+ * `fields' - names the CSV fields, optionally sets up initial
assignments to hledger fields
Then for each CSV record in turn:
- * test all 'if' blocks. If any of them contain a 'end' rule, skip
- all remaining CSV records. Otherwise if any of them contain a
- 'skip' rule, skip that many CSV records. If there are multiple
- matched 'skip' rules, the first one wins.
- * collect all field assignments at top level and in matched 'if'
- blocks. When there are multiple assignments for a field, keep only
+ * test all `if' blocks. If any of them contain a `end' rule, skip
+ all remaining CSV records. Otherwise if any of them contain a
+ `skip' rule, skip that many CSV records. If there are multiple
+ matched `skip' rules, the first one wins.
+
+ * collect all field assignments at top level and in matched `if'
+ blocks. When there are multiple assignments for a field, keep only
the last one.
+
* compute a value for each hledger field - either the one that was
assigned to it (and interpolate the %CSVFIELDNAME references), or a
default
+
* generate a synthetic hledger transaction from these values.
This is all part of the CSV reader, one of several readers hledger
-can use to parse input files. When all files have been read
+can use to parse input files. When all files have been read
successfully, the transactions are passed as input to whichever hledger
command the user specified.
+

Tag Table:
-Node: Top72
-Node: EXAMPLES2756
-Ref: #examples2862
-Node: Basic3070
-Ref: #basic3170
-Node: Bank of Ireland3712
-Ref: #bank-of-ireland3847
-Node: Amazon5309
-Ref: #amazon5427
-Node: Paypal7146
-Ref: #paypal7240
+Node: Top84
+Node: EXAMPLES2746
+Ref: #examples2852
+Node: Basic3059
+Ref: #basic3159
+Node: Bank of Ireland3703
+Ref: #bank-of-ireland3838
+Node: Amazon5303
+Ref: #amazon5421
+Node: Paypal7142
+Ref: #paypal7236
Node: CSV RULES14884
Ref: #csv-rules14993
Node: skip15305
Ref: #skip15398
-Node: fields15773
-Ref: #fields15895
-Node: Transaction field names17060
-Ref: #transaction-field-names17220
-Node: Posting field names17331
-Ref: #posting-field-names17483
-Node: account17553
-Ref: #account17669
-Node: amount18206
-Ref: #amount18337
-Node: currency19444
-Ref: #currency19579
-Node: balance19785
-Ref: #balance19919
-Node: comment20236
-Ref: #comment20353
-Node: field assignment20516
-Ref: #field-assignment20659
-Node: separator21477
-Ref: #separator21612
-Node: if block22152
-Ref: #if-block22277
-Node: Matching the whole record22678
-Ref: #matching-the-whole-record22853
-Node: Matching individual fields23657
-Ref: #matching-individual-fields23861
-Node: Combining matchers24085
-Ref: #combining-matchers24281
-Node: Rules applied on successful match24594
-Ref: #rules-applied-on-successful-match24785
-Node: if table25439
-Ref: #if-table25558
-Node: end27296
-Ref: #end27408
-Node: date-format27632
-Ref: #date-format27764
-Node: decimal-mark28513
-Ref: #decimal-mark28656
-Node: newest-first28995
-Ref: #newest-first29136
-Node: include29819
-Ref: #include29950
-Node: balance-type30394
-Ref: #balance-type30514
-Node: TIPS31214
-Ref: #tips31296
-Node: Rapid feedback31552
-Ref: #rapid-feedback31669
-Node: Valid CSV32129
-Ref: #valid-csv32259
-Node: File Extension32451
-Ref: #file-extension32603
-Node: Reading multiple CSV files33032
-Ref: #reading-multiple-csv-files33217
-Node: Valid transactions33458
-Ref: #valid-transactions33636
-Node: Deduplicating importing34264
-Ref: #deduplicating-importing34443
-Node: Setting amounts35476
-Ref: #setting-amounts35645
-Node: Setting currency/commodity36632
-Ref: #setting-currencycommodity36824
-Node: Referencing other fields37998
-Ref: #referencing-other-fields38198
-Node: How CSV rules are evaluated39095
-Ref: #how-csv-rules-are-evaluated39268
+Node: fields15770
+Ref: #fields15892
+Node: Transaction field names17053
+Ref: #transaction-field-names17213
+Node: Posting field names17324
+Ref: #posting-field-names17476
+Node: account17546
+Ref: #account17662
+Node: amount18198
+Ref: #amount18329
+Node: currency19430
+Ref: #currency19565
+Node: balance19770
+Ref: #balance19904
+Node: comment20221
+Ref: #comment20338
+Node: field assignment20500
+Ref: #field-assignment20643
+Node: separator21457
+Ref: #separator21592
+Node: if block22134
+Ref: #if-block22259
+Node: Matching the whole record22657
+Ref: #matching-the-whole-record22832
+Node: Matching individual fields23636
+Ref: #matching-individual-fields23840
+Node: Combining matchers24064
+Ref: #combining-matchers24260
+Node: Rules applied on successful match24574
+Ref: #rules-applied-on-successful-match24765
+Node: if table25422
+Ref: #if-table25541
+Node: end27277
+Ref: #end27389
+Node: date-format27613
+Ref: #date-format27745
+Node: decimal-mark28495
+Ref: #decimal-mark28638
+Node: newest-first28975
+Ref: #newest-first29116
+Node: include29799
+Ref: #include29930
+Node: balance-type30372
+Ref: #balance-type30492
+Node: TIPS31192
+Ref: #tips31274
+Node: Rapid feedback31530
+Ref: #rapid-feedback31647
+Node: Valid CSV32106
+Ref: #valid-csv32236
+Node: File Extension32428
+Ref: #file-extension32580
+Node: Reading multiple CSV files33009
+Ref: #reading-multiple-csv-files33194
+Node: Valid transactions33434
+Ref: #valid-transactions33612
+Node: Deduplicating importing34240
+Ref: #deduplicating-importing34419
+Node: Setting amounts35451
+Ref: #setting-amounts35620
+Node: Setting currency/commodity36607
+Ref: #setting-currencycommodity36799
+Node: Referencing other fields37979
+Ref: #referencing-other-fields38179
+Node: How CSV rules are evaluated39077
+Ref: #how-csv-rules-are-evaluated39250

End Tag Table
diff --git a/hledger_csv.txt b/hledger_csv.txt
index ccb55da..766402d 100644
--- a/hledger_csv.txt
+++ b/hledger_csv.txt
@@ -24,8 +24,9 @@ DESCRIPTION
layout, date format etc.), and how to construct hledger journal entries
(transactions) from it. Often there will also be a list of conditional
rules for categorising transactions based on their descriptions.
- Here's an overview of the CSV rules; these are described more fully be-
- low, after the examples:
+ Here's an overview of the CSV rules; these are described more fully
+ below, after the examples:
+
skip skip one or more header lines or matched
CSV records
@@ -366,8 +367,8 @@ CSV RULES
can be left unnamed. Currently there must be least two items (there
must be at least one comma).
- Note, always use comma in the fields list, even if your CSV uses an-
- other separator character.
+ Note, always use comma in the fields list, even if your CSV uses
+ another separator character.
Here are the standard hledger field/pseudo-field names. For more about
the transaction parts they refer to, see the manual for hledger's jour-
@@ -405,26 +406,26 @@ CSV RULES
2's amount to cost if there's a transaction price, which can be useful.
If you have an existing rules file using the unnumbered form, you might
- want to use the numbered form in certain conditional blocks, without
- having to update and retest all the old rules. To facilitate this,
- posting 1 ignores amount/amount-in/amount-out if any of
+ want to use the numbered form in certain conditional blocks, without
+ having to update and retest all the old rules. To facilitate this,
+ posting 1 ignores amount/amount-in/amount-out if any of
amount1/amount1-in/amount1-out are assigned, and posting 2 ignores them
- if any of amount2/amount2-in/amount2-out are assigned, avoiding con-
+ if any of amount2/amount2-in/amount2-out are assigned, avoiding con-
flicts.
currency
If the CSV has the currency symbol in a separate field (ie, not part of
- the amount field), you can use currencyN to prepend it to posting N's
+ the amount field), you can use currencyN to prepend it to posting N's
amount. Or, currency with no number affects all postings.
balance
- balanceN sets a balance assertion amount (or if the posting amount is
+ balanceN sets a balance assertion amount (or if the posting amount is
left empty, a balance assignment) on posting N.
- Also, for compatibility with hledger <1.17: balance with no number is
+ Also, for compatibility with hledger <1.17: balance with no number is
equivalent to balance1.
- You can adjust the type of assertion/assignment with the balance-type
+ You can adjust the type of assertion/assignment with the balance-type
rule (see below).
comment
@@ -436,11 +437,11 @@ CSV RULES
field assignment
HLEDGERFIELDNAME FIELDVALUE
- Instead of or in addition to a fields list, you can use a "field as-
- signment" rule to set the value of a single hledger field, by writing
- its name (any of the standard hledger field names above) followed by a
- text value. The value may contain interpolated CSV fields, referenced
- by their 1-based position in the CSV record (%N), or by the name they
+ Instead of or in addition to a fields list, you can use a "field
+ assignment" rule to set the value of a single hledger field, by writing
+ its name (any of the standard hledger field names above) followed by a
+ text value. The value may contain interpolated CSV fields, referenced
+ by their 1-based position in the CSV record (%N), or by the name they
were given in the fields list (%CSVFIELDNAME). Some examples:
# set the amount to the 4th CSV field, with " USD" appended
@@ -449,14 +450,14 @@ CSV RULES
# combine three fields to make a comment, containing note: and date: tags
comment note: %somefield - %anotherfield, date: %1
- Interpolation strips outer whitespace (so a CSV value like " 1 " be-
- comes 1 when interpolated) (#1051). See TIPS below for more about ref-
- erencing other fields.
+ Interpolation strips outer whitespace (so a CSV value like " 1 "
+ becomes 1 when interpolated) (#1051). See TIPS below for more about
+ referencing other fields.
separator
- You can use the separator rule to read other kinds of character-sepa-
- rated data. The argument is any single separator character, or the
- words tab or space (case insensitive). Eg, for comma-separated values
+ You can use the separator rule to read other kinds of character-sepa-
+ rated data. The argument is any single separator character, or the
+ words tab or space (case insensitive). Eg, for comma-separated values
(CSV):
separator ,
@@ -469,7 +470,7 @@ CSV RULES
separator TAB
- If the input file has a .csv, .ssv or .tsv file extension (or a csv:,
+ If the input file has a .csv, .ssv or .tsv file extension (or a csv:,
ssv:, tsv: prefix), the appropriate separator will be inferred automat-
ically, and you won't need this rule.
@@ -484,8 +485,8 @@ CSV RULES
RULE
RULE
- Conditional blocks ("if blocks") are a block of rules that are applied
- only to CSV records which match certain patterns. They are often used
+ Conditional blocks ("if blocks") are a block of rules that are applied
+ only to CSV records which match certain patterns. They are often used
for customising account names based on transaction descriptions.
Matching the whole record
@@ -493,32 +494,32 @@ CSV RULES
REGEX
- REGEX is a case-insensitive regular expression which tries to match
- anywhere within the CSV record. It is a POSIX ERE (extended regular
- expression) that also supports GNU word boundaries (\b, \B, \<, \>),
+ REGEX is a case-insensitive regular expression which tries to match
+ anywhere within the CSV record. It is a POSIX ERE (extended regular
+ expression) that also supports GNU word boundaries (\b, \B, \<, \>),
and nothing else. If you have trouble, be sure to check our
https://hledger.org/hledger.html#regular-expressions doc.
- Important note: the record that is matched is not the original record,
- but a synthetic one, with any enclosing double quotes (but not enclos-
+ Important note: the record that is matched is not the original record,
+ but a synthetic one, with any enclosing double quotes (but not enclos-
ing whitespace) removed, and always comma-separated (which means that a
- field containing a comma will appear like two fields). Eg, if the
- original record is 2020-01-01; "Acme, Inc."; 1,000, the REGEX will ac-
- tually see 2020-01-01,Acme, Inc., 1,000).
+ field containing a comma will appear like two fields). Eg, if the
+ original record is 2020-01-01; "Acme, Inc."; 1,000, the REGEX will
+ actually see 2020-01-01,Acme, Inc., 1,000).
Matching individual fields
Or, MATCHER can be a field matcher, like this:
%CSVFIELD REGEX
- which matches just the content of a particular CSV field. CSVFIELD is
- a percent sign followed by the field's name or column number, like
+ which matches just the content of a particular CSV field. CSVFIELD is
+ a percent sign followed by the field's name or column number, like
%date or %1.
Combining matchers
A single matcher can be written on the same line as the "if"; or multi-
ple matchers can be written on the following lines, non-indented. Mul-
- tiple matchers are OR'd (any one of them can match), unless one begins
+ tiple matchers are OR'd (any one of them can match), unless one begins
with an & symbol, in which case it is AND'ed with the previous matcher.
if
@@ -527,9 +528,9 @@ CSV RULES
RULE
Rules applied on successful match
- After the patterns there should be one or more rules to apply, all in-
- dented by at least one space. Three kinds of rule are allowed in con-
- ditional blocks:
+ After the patterns there should be one or more rules to apply, all
+ indented by at least one space. Three kinds of rule are allowed in
+ conditional blocks:
o field assignments (to set a hledger field)
@@ -586,17 +587,17 @@ CSV RULES
...
CSVFIELDNAMEn VALUE3n
- Each line starting with MATCHER should contain enough (possibly empty)
+ Each line starting with MATCHER should contain enough (possibly empty)
values for all the listed fields.
- Rules would be checked and applied in the order they are listed in the
+ Rules would be checked and applied in the order they are listed in the
table and, like with if blocks, later rules (in the same or another ta-
ble) or if blocks could override the effect of any rule.
- Instead of ',' you can use a variety of other non-alphanumeric charac-
+ Instead of ',' you can use a variety of other non-alphanumeric charac-
ters as a separator. First character after if is taken to be the sepa-
- rator for the rest of the table. It is the responsibility of the user
- to ensure that separator does not occur inside MATCHERs and values -
+ rator for the rest of the table. It is the responsibility of the user
+ to ensure that separator does not occur inside MATCHERs and values -
there is no way to escape separator.
Example:
@@ -607,7 +608,7 @@ CSV RULES
2020/01/12.*Plumbing LLC,expenses:house:upkeep,emergency plumbing call-out
end
- This rule can be used inside if blocks (only), to make hledger stop
+ This rule can be used inside if blocks (only), to make hledger stop
reading this CSV file and move on to the next input file, or to command
execution. Eg:
@@ -618,10 +619,10 @@ CSV RULES
date-format
date-format DATEFMT
- This is a helper for the date (and date2) fields. If your CSV dates
- are not formatted like YYYY-MM-DD, YYYY/MM/DD or YYYY.MM.DD, you'll
- need to add a date-format rule describing them with a strptime date
- parsing pattern, which must parse the CSV date value completely. Some
+ This is a helper for the date (and date2) fields. If your CSV dates
+ are not formatted like YYYY-MM-DD, YYYY/MM/DD or YYYY.MM.DD, you'll
+ need to add a date-format rule describing them with a strptime date
+ parsing pattern, which must parse the CSV date value completely. Some
examples:
# MM/DD/YY
@@ -649,22 +650,22 @@ CSV RULES
decimal-mark ,
- hledger automatically accepts either period or comma as a decimal mark
- when parsing numbers (cf Amounts). However if any numbers in the CSV
- contain digit group marks, such as thousand-separating commas, you
- should declare the decimal mark explicitly with this rule, to avoid
+ hledger automatically accepts either period or comma as a decimal mark
+ when parsing numbers (cf Amounts). However if any numbers in the CSV
+ contain digit group marks, such as thousand-separating commas, you
+ should declare the decimal mark explicitly with this rule, to avoid
misparsed numbers.
newest-first
- hledger always sorts the generated transactions by date. Transactions
- on the same date should appear in the same order as their CSV records,
- as hledger can usually auto-detect whether the CSV's normal order is
+ hledger always sorts the generated transactions by date. Transactions
+ on the same date should appear in the same order as their CSV records,
+ as hledger can usually auto-detect whether the CSV's normal order is
oldest first or newest first. But if all of the following are true:
- o the CSV might sometimes contain just one day of data (all records
+ o the CSV might sometimes contain just one day of data (all records
having the same date)
- o the CSV records are normally in reverse chronological order (newest
+ o the CSV records are normally in reverse chronological order (newest
at the top)
o and you care about preserving the order of same-day transactions
@@ -677,9 +678,9 @@ CSV RULES
include
include RULESFILE
- This includes the contents of another CSV rules file at this point.
- RULESFILE is an absolute file path or a path relative to the current
- file's directory. This can be useful for sharing common rules between
+ This includes the contents of another CSV rules file at this point.
+ RULESFILE is an absolute file path or a path relative to the current
+ file's directory. This can be useful for sharing common rules between
several rules files, eg:
# someaccount.csv.rules
@@ -694,10 +695,10 @@ CSV RULES
balance-type
Balance assertions generated by assigning to balanceN are of the simple
- = type by default, which is a single-commodity, subaccount-excluding
+ = type by default, which is a single-commodity, subaccount-excluding
assertion. You may find the subaccount-including variants more useful,
- eg if you have created some virtual subaccounts of checking to help
- with budgeting. You can select a different type of assertion with the
+ eg if you have created some virtual subaccounts of checking to help
+ with budgeting. You can select a different type of assertion with the
balance-type rule:
# balance assertions will consider all commodities and all subaccounts
@@ -712,29 +713,29 @@ CSV RULES
TIPS
Rapid feedback
- It's a good idea to get rapid feedback while creating/troubleshooting
+ It's a good idea to get rapid feedback while creating/troubleshooting
CSV rules. Here's a good way, using entr from http://eradman.com/entr-
project :
$ ls foo.csv* | entr bash -c 'echo ----; hledger -f foo.csv print desc:SOMEDESC'
- A desc: query (eg) is used to select just one, or a few, transactions
- of interest. "bash -c" is used to run multiple commands, so we can
- echo a separator each time the command re-runs, making it easier to
+ A desc: query (eg) is used to select just one, or a few, transactions
+ of interest. "bash -c" is used to run multiple commands, so we can
+ echo a separator each time the command re-runs, making it easier to
read the output.
Valid CSV
- hledger accepts CSV conforming to RFC 4180. When CSV values are en-
- closed in quotes, note:
+ hledger accepts CSV conforming to RFC 4180. When CSV values are
+ enclosed in quotes, note:
o they must be double quotes (not single quotes)
o spaces outside the quotes are not allowed
File Extension
- To help hledger identify the format and show the right error messages,
- CSV/SSV/TSV files should normally be named with a .csv, .ssv or .tsv
- filename extension. Or, the file path should be prefixed with csv:,
+ To help hledger identify the format and show the right error messages,
+ CSV/SSV/TSV files should normally be named with a .csv, .ssv or .tsv
+ filename extension. Or, the file path should be prefixed with csv:,
ssv: or tsv:. Eg:
$ hledger -f foo.ssv print
@@ -743,48 +744,48 @@ TIPS
$ cat foo | hledger -f ssv:- foo
- You can override the file extension with a separator rule if needed.
+ You can override the file extension with a separator rule if needed.
See also: Input files in the hledger manual.
Reading multiple CSV files
- If you use multiple -f options to read multiple CSV files at once,
- hledger will look for a correspondingly-named rules file for each CSV
- file. But if you use the --rules-file option, that rules file will be
+ If you use multiple -f options to read multiple CSV files at once,
+ hledger will look for a correspondingly-named rules file for each CSV
+ file. But if you use the --rules-file option, that rules file will be
used for all the CSV files.
Valid transactions
After reading a CSV file, hledger post-processes and validates the gen-
erated journal entries as it would for a journal file - balancing them,
- applying balance assignments, and canonicalising amount styles. Any
- errors at this stage will be reported in the usual way, displaying the
+ applying balance assignments, and canonicalising amount styles. Any
+ errors at this stage will be reported in the usual way, displaying the
problem entry.
There is one exception: balance assertions, if you have generated them,
- will not be checked, since normally these will work only when the CSV
- data is part of the main journal. If you do need to check balance as-
- sertions generated from CSV right away, pipe into another hledger:
+ will not be checked, since normally these will work only when the CSV
+ data is part of the main journal. If you do need to check balance
+ assertions generated from CSV right away, pipe into another hledger:
$ hledger -f file.csv print | hledger -f- print
Deduplicating, importing
- When you download a CSV file periodically, eg to get your latest bank
- transactions, the new file may overlap with the old one, containing
+ When you download a CSV file periodically, eg to get your latest bank
+ transactions, the new file may overlap with the old one, containing
some of the same records.
The import command will (a) detect the new transactions, and (b) append
just those transactions to your main journal. It is idempotent, so you
- don't have to remember how many times you ran it or with which version
- of the CSV. (It keeps state in a hidden .latest.FILE.csv file.) This
+ don't have to remember how many times you ran it or with which version
+ of the CSV. (It keeps state in a hidden .latest.FILE.csv file.) This
is the easiest way to import CSV data. Eg:
# download the latest CSV files, then run this command.
# Note, no -f flags needed here.
$ hledger import *.csv [--dry]
- This method works for most CSV files. (Where records have a stable
+ This method works for most CSV files. (Where records have a stable
chronological order, and new records appear only at the new end.)
- A number of other tools and workflows, hledger-specific and otherwise,
+ A number of other tools and workflows, hledger-specific and otherwise,
exist for converting, deduplicating, classifying and managing CSV data.
See:
@@ -795,16 +796,16 @@ TIPS
Setting amounts
A posting amount can be set in one of these ways:
- o by assigning (with a fields list or field assignment) to amountN
+ o by assigning (with a fields list or field assignment) to amountN
(posting N's amount) or amount (posting 1's amount)
- o by assigning to amountN-in and amountN-out (or amount-in and amount-
- out). For each CSV record, whichever of these has a non-zero value
- will be used, with appropriate sign. If both contain a non-zero
+ o by assigning to amountN-in and amountN-out (or amount-in and amount-
+ out). For each CSV record, whichever of these has a non-zero value
+ will be used, with appropriate sign. If both contain a non-zero
value, this may not work.
- o by assigning to balanceN (or balance) instead of the above, setting
- the amount indirectly via a balance assignment. If you do this the
+ o by assigning to balanceN (or balance) instead of the above, setting
+ the amount indirectly via a balance assignment. If you do this the
default account name may be wrong, so you should set that explicitly.
There is some special handling for an amount's sign:
@@ -900,8 +901,8 @@ TIPS
(At each include point the file is inlined and scanned for further
includes, recursively, before proceeding.)
- Then "global" rules are evaluated, top to bottom. If a rule is re-
- peated, the last one wins:
+ Then "global" rules are evaluated, top to bottom. If a rule is
+ repeated, the last one wins:
o skip (at top level)
@@ -914,8 +915,8 @@ TIPS
Then for each CSV record in turn:
- o test all if blocks. If any of them contain a end rule, skip all re-
- maining CSV records. Otherwise if any of them contain a skip rule,
+ o test all if blocks. If any of them contain a end rule, skip all
+ remaining CSV records. Otherwise if any of them contain a skip rule,
skip that many CSV records. If there are multiple matched skip
rules, the first one wins.
@@ -923,9 +924,9 @@ TIPS
When there are multiple assignments for a field, keep only the last
one.
- o compute a value for each hledger field - either the one that was as-
- signed to it (and interpolate the %CSVFIELDNAME references), or a de-
- fault
+ o compute a value for each hledger field - either the one that was
+ assigned to it (and interpolate the %CSVFIELDNAME references), or a
+ default
o generate a synthetic hledger transaction from these values.
@@ -958,4 +959,4 @@ SEE ALSO
-hledger-lib-1.20.3 December 2020 HLEDGER_CSV(5)
+hledger-lib-1.20.4 December 2020 HLEDGER_CSV(5)
diff --git a/hledger_journal.5 b/hledger_journal.5
index 47dc69d..c1b6c53 100644
--- a/hledger_journal.5
+++ b/hledger_journal.5
@@ -1,6 +1,6 @@
.\"t
-.TH "HLEDGER_JOURNAL" "5" "December 2020" "hledger-lib-1.20.3 " "hledger User Manuals"
+.TH "HLEDGER_JOURNAL" "5" "December 2020" "hledger-lib-1.20.4 " "hledger User Manuals"
diff --git a/hledger_journal.info b/hledger_journal.info
index 75a33e1..a94b728 100644
--- a/hledger_journal.info
+++ b/hledger_journal.info
@@ -1,8 +1,8 @@
-This is hledger_journal.info, produced by makeinfo version 6.7 from
-stdin.
+This is hledger-lib/hledger_journal.info, produced by makeinfo version
+4.8 from stdin.

-File: hledger_journal.info, Node: Top, Next: TRANSACTIONS, Up: (dir)
+File: hledger_journal.info, Node: Top, Up: (dir)
hledger_journal(5)
******************
@@ -10,30 +10,30 @@ hledger_journal(5)
hledger's default file format, representing a General Journal.
hledger's usual data source is a plain text file containing journal
-entries in hledger journal format. This file represents a standard
-accounting general journal. I use file names ending in '.journal', but
-that's not required. The journal file contains a number of transaction
+entries in hledger journal format. This file represents a standard
+accounting general journal. I use file names ending in `.journal', but
+that's not required. The journal file contains a number of transaction
entries, each describing a transfer of money (or any commodity) between
two or more named accounts, in a simple format readable by both hledger
and humans.
hledger's journal format is a compatible subset, mostly, of ledger's
journal format, so hledger can work with compatible ledger journal files
-as well. It's safe, and encouraged, to run both hledger and ledger on
+as well. It's safe, and encouraged, to run both hledger and ledger on
the same journal file, eg to validate the results you're getting.
You can use hledger without learning any more about this file; just
use the add or web or import commands to create and update it.
Many users, though, edit the journal file with a text editor, and
-track changes with a version control system such as git. Editor addons
+track changes with a version control system such as git. Editor addons
such as ledger-mode or hledger-mode for Emacs, vim-ledger for Vim, and
hledger-vscode for Visual Studio Code, make this easier, adding colour,
-formatting, tab completion, and useful commands. See Editor
+formatting, tab completion, and useful commands. See Editor
configuration at hledger.org for the full list.
Here's a description of each part of the file format (and hledger's
-data model). These are mostly in the order you'll use them, but in some
+data model). These are mostly in the order you'll use them, but in some
cases related concepts have been grouped together for easy reference, or
linked before they are introduced, so feel free to skip over anything
that looks unnecessary right now.
@@ -63,25 +63,30 @@ File: hledger_journal.info, Node: TRANSACTIONS, Next: DATES, Prev: Top, Up:
1 TRANSACTIONS
**************
-Transactions are the main unit of information in a journal file. They
+Transactions are the main unit of information in a journal file. They
represent events, typically a movement of some quantity of commodities
between two or more named accounts.
Each transaction is recorded as a journal entry, beginning with a
-simple date in column 0. This can be followed by any of the following
+simple date in column 0. This can be followed by any of the following
optional fields, separated by spaces:
- * a status character (empty, '!', or '*')
+ * a status character (empty, `!', or `*')
+
* a code (any short number or text, enclosed in parentheses)
+
* a description (any remaining text until end of line or a semicolon)
+
* a comment (any remaining text following a semicolon until end of
line, and any following indented lines beginning with a semicolon)
+
* 0 or more indented _posting_ lines, describing what was transferred
- and the accounts involved (indented comment lines are also allowed,
- but not blank lines or non-indented lines).
+ and the accounts involved (indented comment lines are also
+ allowed, but not blank lines or non-indented lines).
Here's a simple journal file containing one transaction:
+
2008/01/01 income
assets:bank:checking $1
income:salary $-1
@@ -104,12 +109,12 @@ File: hledger_journal.info, Node: Simple dates, Next: Secondary dates, Up: DA
2.1 Simple dates
================
-Dates in the journal file use _simple dates_ format: 'YYYY-MM-DD' or
-'YYYY/MM/DD' or 'YYYY.MM.DD', with leading zeros optional. The year may
+Dates in the journal file use _simple dates_ format: `YYYY-MM-DD' or
+`YYYY/MM/DD' or `YYYY.MM.DD', with leading zeros optional. The year may
be omitted, in which case it will be inferred from the context: the
-current transaction, the default year set with a default year directive,
-or the current date when the command is run. Some examples:
-'2010-01-31', '2010/01/31', '2010.1.31', '1/31'.
+current transaction, the default year set with a default year
+directive, or the current date when the command is run. Some examples:
+`2010-01-31', `2010/01/31', `2010.1.31', `1/31'.
(The UI also accepts simple dates, as well as the more flexible smart
dates documented in the hledger manual.)
@@ -121,32 +126,35 @@ File: hledger_journal.info, Node: Secondary dates, Next: Posting dates, Prev:
===================
Real-life transactions sometimes involve more than one date - eg the
-date you write a cheque, and the date it clears in your bank. When you
+date you write a cheque, and the date it clears in your bank. When you
want to model this, for more accurate daily balances, you can specify
individual posting dates.
Or, you can use the older _secondary date_ feature (Ledger calls it
-auxiliary date or effective date). Note: we support this for
+auxiliary date or effective date). Note: we support this for
compatibility, but I usually recommend avoiding this feature; posting
dates are almost always clearer and simpler.
A secondary date is written after the primary date, following an
-equals sign. If the year is omitted, the primary date's year is
-assumed. When running reports, the primary (left) date is used by
-default, but with the '--date2' flag (or '--aux-date' or '--effective'),
+equals sign. If the year is omitted, the primary date's year is
+assumed. When running reports, the primary (left) date is used by
+default, but with the `--date2' flag (or `--aux-date' or `--effective'),
the secondary (right) date will be used instead.
The meaning of secondary dates is up to you, but it's best to follow
-a consistent rule. Eg "primary = the bank's clearing date, secondary =
+a consistent rule. Eg "primary = the bank's clearing date, secondary =
date the transaction was initiated, if different", as shown here:
+
2010/2/23=2/19 movie ticket
expenses:cinema $10
assets:checking
+
$ hledger register checking
2010-02-23 movie ticket assets:checking $-10 $-10
+
$ hledger register checking --date2
2010-02-19 movie ticket assets:checking $-10 $-10
@@ -158,31 +166,34 @@ File: hledger_journal.info, Node: Posting dates, Prev: Secondary dates, Up: D
You can give individual postings a different date from their parent
transaction, by adding a posting comment containing a tag (see below)
-like 'date:DATE'. This is probably the best way to control posting
-dates precisely. Eg in this example the expense should appear in May
+like `date:DATE'. This is probably the best way to control posting
+dates precisely. Eg in this example the expense should appear in May
reports, and the deduction from checking should be reported on 6/1 for
easy bank reconciliation:
+
2015/5/30
expenses:food $10 ; food purchased on saturday 5/30
assets:checking ; bank cleared it on monday, date:6/1
+
$ hledger -f t.j register food
2015-05-30 expenses:food $10 $10
+
$ hledger -f t.j register checking
2015-06-01 assets:checking $-10 $-10
DATE should be a simple date; if the year is not specified it will
-use the year of the transaction's date. You can set the secondary date
-similarly, with 'date2:DATE2'. The 'date:' or 'date2:' tags must have a
-valid simple date value if they are present, eg a 'date:' tag with no
+use the year of the transaction's date. You can set the secondary date
+similarly, with `date2:DATE2'. The `date:' or `date2:' tags must have a
+valid simple date value if they are present, eg a `date:' tag with no
value is not allowed.
Ledger's earlier, more compact bracketed date syntax is also
-supported: '[DATE]', '[DATE=DATE2]' or '[=DATE2]'. hledger will attempt
-to parse any square-bracketed sequence of the '0123456789/-.='
-characters in this way. With this syntax, DATE infers its year from the
+supported: `[DATE]', `[DATE=DATE2]' or `[=DATE2]'. hledger will attempt
+to parse any square-bracketed sequence of the `0123456789/-.='
+characters in this way. With this syntax, DATE infers its year from the
transaction and DATE2 infers its year from DATE.

@@ -197,43 +208,42 @@ description or posting account name, separated from it by a space,
indicating one of three statuses:
mark status
-
------------------
+-----------------
unmarked
-'!' pending
-'*' cleared
+`!' pending
+`*' cleared
- When reporting, you can filter by status with the '-U/--unmarked',
-'-P/--pending', and '-C/--cleared' flags; or the 'status:', 'status:!',
-and 'status:*' queries; or the U, P, C keys in hledger-ui.
+ When reporting, you can filter by status with the `-U/--unmarked',
+`-P/--pending', and `-C/--cleared' flags; or the `status:', `status:!',
+and `status:*' queries; or the U, P, C keys in hledger-ui.
Note, in Ledger and in older versions of hledger, the "unmarked"
-state is called "uncleared". As of hledger 1.3 we have renamed it to
+state is called "uncleared". As of hledger 1.3 we have renamed it to
unmarked for clarity.
To replicate Ledger and old hledger's behaviour of also matching
pending, combine -U and -P.
Status marks are optional, but can be helpful eg for reconciling with
-real-world accounts. Some editor modes provide highlighting and
-shortcuts for working with status. Eg in Emacs ledger-mode, you can
+real-world accounts. Some editor modes provide highlighting and
+shortcuts for working with status. Eg in Emacs ledger-mode, you can
toggle transaction status with C-c C-e, or posting status with C-c C-c.
What "uncleared", "pending", and "cleared" actually mean is up to
you. Here's one suggestion:
status meaning
---------------------------------------------------------------------------
+--------------------------------------------------------------------------
uncleared recorded but not yet reconciled; needs review
pending tentatively reconciled (if needed, eg during a big
reconciliation)
cleared complete, reconciled as far as possible, and considered
correct
- With this scheme, you would use '-PC' to see the current balance at
-your bank, '-U' to see things which will probably hit your bank soon
-(like uncashed checks), and no flags to see the most up-to-date state of
-your finances.
+ With this scheme, you would use `-PC' to see the current balance at
+your bank, `-U' to see things which will probably hit your bank soon
+(like uncashed checks), and no flags to see the most up-to-date state
+of your finances.

File: hledger_journal.info, Node: DESCRIPTION, Next: COMMENTS, Prev: STATUS, Up: Top
@@ -242,9 +252,9 @@ File: hledger_journal.info, Node: DESCRIPTION, Next: COMMENTS, Prev: STATUS,
*************
A transaction's description is the rest of the line following the date
-and status mark (or until a comment begins). Sometimes called the
+and status mark (or until a comment begins). Sometimes called the
"narration" in traditional bookkeeping, it can be used for whatever you
-wish, or left blank. Transaction descriptions can be queried, unlike
+wish, or left blank. Transaction descriptions can be queried, unlike
comments.
* Menu:
@@ -257,11 +267,11 @@ File: hledger_journal.info, Node: Payee and note, Up: DESCRIPTION
4.1 Payee and note
==================
-You can optionally include a '|' (pipe) character in descriptions to
+You can optionally include a `|' (pipe) character in descriptions to
subdivide the description into separate fields for payee/payer name on
-the left (up to the first '|') and an additional note field on the right
-(after the first '|'). This may be worthwhile if you need to do more
-precise querying and pivoting by payee or by note.
+the left (up to the first `|') and an additional note field on the
+right (after the first `|'). This may be worthwhile if you need to do
+more precise querying and pivoting by payee or by note.

File: hledger_journal.info, Node: COMMENTS, Next: TAGS, Prev: DESCRIPTION, Up: Top
@@ -269,19 +279,20 @@ File: hledger_journal.info, Node: COMMENTS, Next: TAGS, Prev: DESCRIPTION, U
5 COMMENTS
**********
-Lines in the journal beginning with a semicolon (';') or hash ('#') or
-star ('*') are comments, and will be ignored. (Star comments cause
+Lines in the journal beginning with a semicolon (`;') or hash (`#') or
+star (`*') are comments, and will be ignored. (Star comments cause
org-mode nodes to be ignored, allowing emacs users to fold and navigate
their journals with org-mode or orgstruct-mode.)
You can attach comments to a transaction by writing them after the
description and/or indented on the following lines (before the
-postings). Similarly, you can attach comments to an individual posting
+postings). Similarly, you can attach comments to an individual posting
by writing them after the amount and/or indented on the following lines.
-Transaction and posting comments must begin with a semicolon (';').
+Transaction and posting comments must begin with a semicolon (`;').
Some examples:
+
# a file comment
; another file comment
* also a file comment, useful in org/orgstruct mode
@@ -300,8 +311,8 @@ end comment
; another comment line for posting 2
; a file comment (because not indented)
- You can also comment larger regions of a file using 'comment' and
-'end comment' directives.
+ You can also comment larger regions of a file using `comment' and
+`end comment' directives.

File: hledger_journal.info, Node: TAGS, Next: POSTINGS, Prev: COMMENTS, Up: Top
@@ -315,29 +326,35 @@ transactions, which you can then search or pivot on.
A simple tag is a word (which may contain hyphens) followed by a full
colon, written inside a transaction or posting comment line:
+
2017/1/16 bought groceries ; sometag:
Tags can have a value, which is the text after the colon, up to the
next comma or end of line, with leading/trailing whitespace removed:
+
expenses:food $10 ; a-posting-tag: the tag value
Note this means hledger's tag values can not contain commas or
newlines. Ending at commas means you can write multiple short tags on
one line, comma separated:
+
assets:checking ; a comment containing tag1:, tag2: some value ...
Here,
- * "'a comment containing'" is just comment text, not a tag
- * "'tag1'" is a tag with no value
- * "'tag2'" is another tag, whose value is "'some value ...'"
+ * "`a comment containing'" is just comment text, not a tag
+
+ * "`tag1'" is a tag with no value
+
+ * "`tag2'" is another tag, whose value is "`some value ...'"
Tags in a transaction comment affect the transaction and all of its
-postings, while tags in a posting comment affect only that posting. For
-example, the following transaction has three tags ('A', 'TAG2',
-'third-tag') and the posting has four (those plus 'posting-tag'):
+postings, while tags in a posting comment affect only that posting. For
+example, the following transaction has three tags (`A', `TAG2',
+`third-tag') and the posting has four (those plus `posting-tag'):
+
1/1 a transaction ; A:, TAG2:
; third-tag: a third transaction tag, <- with a value
@@ -353,25 +370,27 @@ File: hledger_journal.info, Node: POSTINGS, Next: ACCOUNT NAMES, Prev: TAGS,
**********
A posting is an addition of some amount to, or removal of some amount
-from, an account. Each posting line begins with at least one space or
+from, an account. Each posting line begins with at least one space or
tab (2 or 4 spaces is common), followed by:
- * (optional) a status character (empty, '!', or '*'), followed by a
+ * (optional) a status character (empty, `!', or `*'), followed by a
space
- * (required) an account name (any text, optionally containing *single
- spaces*, until end of line or a double space)
+
+ * (required) an account name (any text, optionally containing
+ *single spaces*, until end of line or a double space)
+
* (optional) *two or more spaces* or tabs followed by an amount.
Positive amounts are being added to the account, negative amounts are
being removed.
- The amounts within a transaction must always sum up to zero. As a
+ The amounts within a transaction must always sum up to zero. As a
convenience, one amount may be left blank; it will be inferred so as to
balance the transaction.
Be sure to note the unusual two-space delimiter between account name
-and amount. This makes it easy to write account names containing
-spaces. But if you accidentally leave only one space (or tab) before
+and amount. This makes it easy to write account names containing
+spaces. But if you accidentally leave only one space (or tab) before
the amount, the amount will be considered part of the account name.
* Menu:
@@ -389,17 +408,19 @@ posting_ or _unbalanced posting_, which means it is exempt from the
usual rule that a transaction's postings must balance add up to zero.
This is not part of double entry accounting, so you might choose to
-avoid this feature. Or you can use it sparingly for certain special
-cases where it can be convenient. Eg, you could set opening balances
+avoid this feature. Or you can use it sparingly for certain special
+cases where it can be convenient. Eg, you could set opening balances
without using a balancing equity account:
+
1/1 opening balances
(assets:checking) $1000
(assets:savings) $2000
- A posting with a bracketed account name is called a _balanced virtual
-posting_. The balanced virtual postings in a transaction must add up to
-zero (separately from other postings). Eg:
+ A posting with a bracketed account name is called a _balanced
+virtual posting_. The balanced virtual postings in a transaction must
+add up to zero (separately from other postings). Eg:
+
1/1 buy food with cash, update budget envelope subaccounts, & something else
assets:cash $-10 ; <- these balance
@@ -410,8 +431,8 @@ zero (separately from other postings). Eg:
(something:else) $5 ; <- not required to balance
Ordinary non-parenthesised, non-bracketed postings are called _real
-postings_. You can exclude virtual postings from reports with the
-'-R/--real' flag or 'real:1' query.
+postings_. You can exclude virtual postings from reports with the
+`-R/--real' flag or `real:1' query.

File: hledger_journal.info, Node: ACCOUNT NAMES, Next: AMOUNTS, Prev: POSTINGS, Up: Top
@@ -420,13 +441,12 @@ File: hledger_journal.info, Node: ACCOUNT NAMES, Next: AMOUNTS, Prev: POSTING
***************
Account names typically have several parts separated by a full colon,
-from which hledger derives a hierarchical chart of accounts. They can
-be anything you like, but in finance there are traditionally five
-top-level accounts: 'assets', 'liabilities', 'income', 'expenses', and
-'equity'.
+from which hledger derives a hierarchical chart of accounts. They can be
+anything you like, but in finance there are traditionally five top-level
+accounts: `assets', `liabilities', `income', `expenses', and `equity'.
- Account names may contain single spaces, eg: 'assets:accounts
-receivable'. Because of this, they must always be followed by *two or
+ Account names may contain single spaces, eg: `assets:accounts
+receivable'. Because of this, they must always be followed by *two or
more spaces* (or newline).
Account names can be aliased.
@@ -437,18 +457,19 @@ File: hledger_journal.info, Node: AMOUNTS, Next: TRANSACTION PRICES, Prev: AC
9 AMOUNTS
*********
-After the account name, there is usually an amount. (Important: between
+After the account name, there is usually an amount. (Important: between
account name and amount, there must be *two or more spaces*.)
hledger's amount format is flexible, supporting several international
-formats. Here are some examples. Amounts have a number (the
-"quantity"):
+formats. Here are some examples. Amounts have a number (the "quantity"):
+
1
- ..and usually a currency or commodity name (the "commodity"). This
-is a symbol, word, or phrase, to the left or right of the quantity, with
-or without a separating space:
+ ..and usually a currency or commodity name (the "commodity"). This
+is a symbol, word, or phrase, to the left or right of the quantity,
+with or without a separating space:
+
$1
4000 AAPL
@@ -456,28 +477,33 @@ $1
If the commodity name contains spaces, numbers, or punctuation, it
must be enclosed in double quotes:
+
3 "no. 42 green apples"
Amounts can be preceded by a minus sign (or a plus sign, though plus
is the default), The sign can be written before or after a left-side
commodity symbol:
+
-$1
$-1
One or more spaces between the sign and the number are acceptable
when parsing (but they won't be displayed in output):
+
+ $1
$- 1
Scientific E notation is allowed:
+
1E-6
EUR 1E3
A decimal mark can be written as a period or a comma:
+
1.23
1,23456780000009
@@ -497,13 +523,15 @@ In the integer part of the quantity (left of the decimal mark), groups
of digits can optionally be separated by a "digit group mark" - a space,
comma, or period (different from the decimal mark):
+
$1,000,000.00
EUR 2.000.000,00
INR 9,99,99,999.00
1 000 000.9455
Note, a number containing a single group mark and no decimal mark is
-ambiguous. Are these group marks or decimal marks ?
+ambiguous. Are these group marks or decimal marks ?
+
1,000
1.000
@@ -515,6 +543,7 @@ explicitly declare the decimal mark (and optionally a digit group mark).
Note, these formats ("amount styles") are specific to each commodity, so
if your data uses multiple formats, hledger can handle it:
+
commodity $1,000.00
commodity EUR 1.000,00
commodity INR 9,99,99,999.00
@@ -527,8 +556,8 @@ File: hledger_journal.info, Node: Commodity display style, Next: Rounding, Pr
===========================
For each commodity, hledger chooses a consistent style to use when
-displaying amounts. (Except price amounts, which are always displayed
-as written). The display style is chosen as follows:
+displaying amounts. (Except price amounts, which are always displayed as
+written). The display style is chosen as follows:
* If there is a commodity directive (or default commodity directive)
for the commodity, its style is used (see examples above).
@@ -537,26 +566,30 @@ as written). The display style is chosen as follows:
seen in the journal.
* Or if there are no such amounts in the journal, a default style is
- used (like '$1000.00').
+ used (like `$1000.00').
+
A style is inferred from the journal amounts in a commodity as
follows:
* Use the general style (decimal mark, symbol placement) of the first
amount
+
* Use the first-seen digit group style (digit group mark, digit group
sizes), if any
+
* Use the maximum number of decimal places of all.
Transaction price amounts don't affect the commodity display style
directly, but occasionally they can do so indirectly (eg when a
-posting's amount is inferred using a transaction price). If you find
+posting's amount is inferred using a transaction price). If you find
this causing problems, use a commodity directive to fix the display
style.
In summary, each commodity's amounts will be normalised to
- * the style declared by a 'commodity' directive
+ * the style declared by a `commodity' directive
+
* or, the style of the first posting amount in the journal, with the
first-seen digit group style and the maximum-seen number of decimal
places.
@@ -573,10 +606,10 @@ File: hledger_journal.info, Node: Rounding, Prev: Commodity display style, Up
Amounts are stored internally as decimal numbers with up to 255 decimal
places, and displayed with the number of decimal places specified by the
-commodity display style. Note, hledger uses banker's rounding: it
-rounds to the nearest even number, eg 0.5 displayed with zero decimal
-places is "0"). (Guaranteed since hledger 1.17.1; in older versions
-this could vary if hledger was built with Decimal < 0.5.1.)
+commodity display style. Note, hledger uses banker's rounding: it rounds
+to the nearest even number, eg 0.5 displayed with zero decimal places is
+"0"). (Guaranteed since hledger 1.17.1; in older versions this could
+vary if hledger was built with Decimal < 0.5.1.)

File: hledger_journal.info, Node: TRANSACTION PRICES, Next: LOT PRICES LOT DATES, Prev: AMOUNTS, Up: Top
@@ -585,22 +618,24 @@ File: hledger_journal.info, Node: TRANSACTION PRICES, Next: LOT PRICES LOT DAT
*********************
Within a transaction, you can note an amount's price in another
-commodity. This can be used to document the cost (in a purchase) or
-selling price (in a sale). For example, transaction prices are useful
-to record purchases of a foreign currency. Note transaction prices are
-fixed at the time of the transaction, and do not change over time. See
+commodity. This can be used to document the cost (in a purchase) or
+selling price (in a sale). For example, transaction prices are useful to
+record purchases of a foreign currency. Note transaction prices are
+fixed at the time of the transaction, and do not change over time. See
also market prices, which represent prevailing exchange rates on a
certain date.
There are several ways to record a transaction price:
- 1. Write the price per unit, as '@ UNITPRICE' after the amount:
+ 1. Write the price per unit, as `@ UNITPRICE' after the amount:
+
2009/1/1
assets:euros €100 @ $1.35 ; one hundred euros purchased at $1.35 each
assets:dollars ; balancing amount is -$135.00
- 2. Write the total price, as '@@ TOTALPRICE' after the amount:
+ 2. Write the total price, as `@@ TOTALPRICE' after the amount:
+
2009/1/1
assets:euros €100 @@ $135 ; one hundred euros purchased at $135 for the lot
@@ -609,22 +644,25 @@ certain date.
3. Specify amounts for all postings, using exactly two commodities,
and let hledger infer the price that balances the transaction:
+
2009/1/1
assets:euros €100 ; one hundred euros purchased
assets:dollars $-135 ; for $135
- 4. Like 1, but the '@' is parenthesised, i.e. '(@)'; this is for
+ 4. Like 1, but the `@' is parenthesised, i.e. `(@)'; this is for
compatibility with Ledger journals (Virtual posting costs), and is
equivalent to 1 in hledger.
- 5. Like 2, but as in 4 the '@@' is parenthesised, i.e. '(@@)'; in
+ 5. Like 2, but as in 4 the `@@' is parenthesised, i.e. `(@@)'; in
hledger, this is equivalent to 2.
- Use the '-B/--cost' flag to convert amounts to their transaction
-price's commodity, if any. (mnemonic: "B" is from "cost Basis", as in
-Ledger). Eg here is how -B affects the balance report for the example
+
+ Use the `-B/--cost' flag to convert amounts to their transaction
+price's commodity, if any. (mnemonic: "B" is from "cost Basis", as in
+Ledger). Eg here is how -B affects the balance report for the example
above:
+
$ hledger bal -N --flat
$-135 assets:dollars
€100 assets:euros
@@ -634,13 +672,15 @@ $ hledger bal -N --flat -B
Note -B is sensitive to the order of postings when a transaction
price is inferred: the inferred price will be in the commodity of the
-last amount. So if example 3's postings are reversed, while the
+last amount. So if example 3's postings are reversed, while the
transaction is equivalent, -B shows something different:
+
2009/1/1
assets:dollars $-135 ; 135 dollars sold
assets:euros €100 ; for 100 euros
+
$ hledger bal -N --flat -B
€-100 assets:dollars # <- the dollars' selling price
€100 assets:euros
@@ -652,13 +692,13 @@ File: hledger_journal.info, Node: LOT PRICES LOT DATES, Next: BALANCE ASSERTIO
************************
Ledger allows another kind of price, lot price (four variants:
-'{UNITPRICE}', '{{TOTALPRICE}}', '{=FIXEDUNITPRICE}',
-'{{=FIXEDTOTALPRICE}}'), and/or a lot date ('[DATE]') to be specified.
+`{UNITPRICE}', `{{TOTALPRICE}}', `{=FIXEDUNITPRICE}',
+`{{=FIXEDTOTALPRICE}}'), and/or a lot date (`[DATE]') to be specified.
These are normally used to select a lot when selling investments.
hledger will parse these, for compatibility with Ledger journals, but
-currently ignores them. A transaction price, lot price and/or lot date
-may appear in any order, after the posting amount and before the balance
-assertion if any.
+currently ignores them. A transaction price, lot price and/or lot date
+may appear in any order, after the posting amount and before the
+balance assertion if any.

File: hledger_journal.info, Node: BALANCE ASSERTIONS, Next: BALANCE ASSIGNMENTS, Prev: LOT PRICES LOT DATES, Up: Top
@@ -666,11 +706,12 @@ File: hledger_journal.info, Node: BALANCE ASSERTIONS, Next: BALANCE ASSIGNMENT
12 BALANCE ASSERTIONS
*********************
-hledger supports Ledger-style balance assertions in journal files.
-These look like, for example, '= EXPECTEDBALANCE' following a posting's
-amount. Eg here we assert the expected dollar balance in accounts a and
+hledger supports Ledger-style balance assertions in journal files. These
+look like, for example, `= EXPECTEDBALANCE' following a posting's
+amount. Eg here we assert the expected dollar balance in accounts a and
b after each posting:
+
2013/1/1
a $1 =$1
b =$-1
@@ -680,12 +721,12 @@ b after each posting:
b $-1 =$-2
After reading a journal file, hledger will check all balance
-assertions and report an error if any of them fail. Balance assertions
+assertions and report an error if any of them fail. Balance assertions
can protect you from, eg, inadvertently disrupting reconciled balances
-while cleaning up old entries. You can disable them temporarily with
-the '-I/--ignore-assertions' flag, which can be useful for
-troubleshooting or for reading Ledger files. (Note: this flag currently
-does not disable balance assignments, below).
+while cleaning up old entries. You can disable them temporarily with the
+`-I/--ignore-assertions' flag, which can be useful for troubleshooting
+or for reading Ledger files. (Note: this flag currently does not
+disable balance assignments, below).
* Menu:
@@ -705,17 +746,17 @@ File: hledger_journal.info, Node: Assertions and ordering, Next: Assertions an
============================
hledger sorts an account's postings and assertions first by date and
-then (for postings on the same day) by parse order. Note this is
+then (for postings on the same day) by parse order. Note this is
different from Ledger, which sorts assertions only by parse order.
(Also, Ledger assertions do not see the accumulated effect of repeated
postings to the same account within a transaction.)
So, hledger balance assertions keep working if you reorder
-differently-dated transactions within the journal. But if you reorder
+differently-dated transactions within the journal. But if you reorder
same-dated transactions or postings, assertions might break and require
-updating. This order dependence does bring an advantage: precise
-control over the order of postings and assertions within a day, so you
-can assert intra-day balances.
+updating. This order dependence does bring an advantage: precise control
+over the order of postings and assertions within a day, so you can
+assert intra-day balances.

File: hledger_journal.info, Node: Assertions and included files, Next: Assertions and multiple -f options, Prev: Assertions and ordering, Up: BALANCE ASSERTIONS
@@ -723,8 +764,8 @@ File: hledger_journal.info, Node: Assertions and included files, Next: Asserti
12.2 Assertions and included files
==================================
-With included files, things are a little more complicated. Including
-preserves the ordering of postings and assertions. If you have multiple
+With included files, things are a little more complicated. Including
+preserves the ordering of postings and assertions. If you have multiple
postings to an account on the same day, split across different files,
and you also want to assert the account's balance on the same day,
you'll have to put the assertion in the right file.
@@ -736,7 +777,7 @@ File: hledger_journal.info, Node: Assertions and multiple -f options, Next: As
=======================================
Balance assertions don't work well across files specified with multiple
--f options. Use include or concatenate the files instead.
+-f options. Use include or concatenate the files instead.

File: hledger_journal.info, Node: Assertions and commodities, Next: Assertions and prices, Prev: Assertions and multiple -f options, Up: BALANCE ASSERTIONS
@@ -746,17 +787,18 @@ File: hledger_journal.info, Node: Assertions and commodities, Next: Assertions
The asserted balance must be a simple single-commodity amount, and in
fact the assertion checks only this commodity's balance within the
-(possibly multi-commodity) account balance. This is how assertions work
-in Ledger also. We could call this a "partial" balance assertion.
+(possibly multi-commodity) account balance. This is how assertions work
+in Ledger also. We could call this a "partial" balance assertion.
To assert the balance of more than one commodity in an account, you
can write multiple postings, each asserting one commodity's balance.
You can make a stronger "total" balance assertion by writing a double
-equals sign ('== EXPECTEDBALANCE'). This asserts that there are no
+equals sign (`== EXPECTEDBALANCE'). This asserts that there are no
other unasserted commodities in the account (or, that their balance is
0).
+
2013/1/1
a $1
a 1€
@@ -773,9 +815,10 @@ other unasserted commodities in the account (or, that their balance is
a 0 == $1
It's not yet possible to make a complete assertion about a balance
-that has multiple commodities. One workaround is to isolate each
+that has multiple commodities. One workaround is to isolate each
commodity into its own subaccount:
+
2013/1/1
a:usd $1
a:euro 1€
@@ -795,13 +838,14 @@ File: hledger_journal.info, Node: Assertions and prices, Next: Assertions and
Balance assertions ignore transaction prices, and should normally be
written without one:
+
2019/1/1
(a) $1 @ €1 = $1
We do allow prices to be written there, however, and print shows
them, even though they don't affect whether the assertion passes or
-fails. This is for backward compatibility (hledger's close command used
-to generate balance assertions with prices), and because balance
+fails. This is for backward compatibility (hledger's close command
+used to generate balance assertions with prices), and because balance
_assignments_ do use them (see below).

@@ -810,11 +854,12 @@ File: hledger_journal.info, Node: Assertions and subaccounts, Next: Assertions
12.6 Assertions and subaccounts
===============================
-The balance assertions above ('=' and '==') do not count the balance
-from subaccounts; they check the account's exclusive balance only. You
-can assert the balance including subaccounts by writing '=*' or '==*',
+The balance assertions above (`=' and `==') do not count the balance
+from subaccounts; they check the account's exclusive balance only. You
+can assert the balance including subaccounts by writing `=*' or `==*',
eg:
+
2019/1/1
equity:opening balances
checking:a 5
@@ -828,8 +873,7 @@ File: hledger_journal.info, Node: Assertions and virtual postings, Next: Asser
====================================
Balance assertions are checked against all postings, both real and
-virtual. They are not affected by the '--real/-R' flag or 'real:'
-query.
+virtual. They are not affected by the `--real/-R' flag or `real:' query.

File: hledger_journal.info, Node: Assertions and precision, Prev: Assertions and virtual postings, Up: BALANCE ASSERTIONS
@@ -838,8 +882,8 @@ File: hledger_journal.info, Node: Assertions and precision, Prev: Assertions a
=============================
Balance assertions compare the exactly calculated amounts, which are not
-always what is shown by reports. Eg a commodity directive may limit the
-display precision, but this will not affect balance assertions. Balance
+always what is shown by reports. Eg a commodity directive may limit the
+display precision, but this will not affect balance assertions. Balance
assertion failure messages show exact amounts.

@@ -848,12 +892,13 @@ File: hledger_journal.info, Node: BALANCE ASSIGNMENTS, Next: DIRECTIVES, Prev
13 BALANCE ASSIGNMENTS
**********************
-Ledger-style balance assignments are also supported. These are like
+Ledger-style balance assignments are also supported. These are like
balance assertions, but with no posting amount on the left side of the
equals sign; instead it is calculated automatically so as to satisfy the
-assertion. This can be a convenience during data entry, eg when setting
+assertion. This can be a convenience during data entry, eg when setting
opening balances:
+
; starting a new journal, set asset account balances
2016/1/1 opening balances
assets:checking = $409.32
@@ -863,6 +908,7 @@ opening balances:
or when adjusting a balance to reality:
+
; no cash left; update balance, record any untracked spending as a generic expense
2016/1/15
assets:cash = $0
@@ -871,7 +917,7 @@ opening balances:
The calculated amount depends on the account's balance in the
commodity at that point (which depends on the previously-dated postings
of the commodity to that account since the last balance assertion or
-assignment). Note that using balance assignments makes your journal a
+assignment). Note that using balance assignments makes your journal a
little less explicit; to know the exact amount posted, you have to run
hledger or do the calculations yourself, instead of just reading it.
@@ -888,9 +934,11 @@ File: hledger_journal.info, Node: Balance assignments and prices, Up: BALANCE
A transaction price in a balance assignment will cause the calculated
amount to have that price attached:
+
2019/1/1
(a) = $1 @ €2
+
$ hledger print --explicit
2019-01-01
(a) $1 @ €2 = $1 @ €2
@@ -902,34 +950,34 @@ File: hledger_journal.info, Node: DIRECTIVES, Next: PERIODIC TRANSACTIONS, Pr
*************
A directive is a line in the journal beginning with a special keyword,
-that influences how the journal is processed. hledger's directives are
+that influences how the journal is processed. hledger's directives are
based on a subset of Ledger's, but there are many differences (and also
some differences between hledger versions).
Directives' behaviour and interactions can get a little bit complex,
so here is a table summarising the directives and their effects, with
-links to more detailed docs. Note part of this table is hidden when
+links to more detailed docs. Note part of this table is hidden when
viewed in a web browser - scroll it sideways to see more.
-directiveend subdirectivespurpose can affect (as of
+directiveend subdirectivespurpose can affect (as of
directive 2018/06)
------------------------------------------------------------------------------
-'account' any document account names, all entries in
- text declare account types & all files, before
- display order or after
-'alias' 'end rewrite account names following entries
+-----------------------------------------------------------------------------
+`account' any document account names, all entries in all
+ text declare account types & files, before or
+ display order after
+`alias' `end rewrite account names following entries
aliases' until end of
current file or
end directive
-'apply 'end prepend a common parent to following entries
+`apply `end prepend a common parent to following entries
account' apply account names until end of
account' current file or
end directive
-'comment''end ignore part of journal following entries
+`comment'`end ignore part of journal following entries
comment' until end of
current file or
end directive
-'commodity' 'format'declare a commodity and its number notation:
+`commodity' `format'declare a commodity and its number notation:
number notation & display following entries
style in that commodity
in all files ;
@@ -937,11 +985,10 @@ account' apply account names until end of
amounts of that
commodity in
reports
-'D' declare a commodity to be default
- used for commodityless commodity:
- amounts, and its number following
- notation & display style commodityless
- entries until end
+`D' declare a commodity to be default commodity:
+ used for commodityless following
+ amounts, and its number commodityless
+ notation & display style entries until end
of current file;
number notation:
following entries
@@ -952,36 +999,36 @@ account' apply account names until end of
amounts of that
commodity in
reports
-'include' include entries/directives what the included
+`include' include entries/directives what the included
from another file directives affect
-'P' declare a market price for amounts of that
- a commodity commodity in
+`P' declare a market price for a amounts of that
+ commodity commodity in
reports, when -V
is used
-'Y' declare a year for yearless following entries
+`Y' declare a year for yearless following entries
dates until end of
current file
-'=' declare an auto posting all entries in
+`=' declare an auto posting all entries in
rule, adding postings to parent/current/child
other transactions files (but not
- sibling files,
- see #1212)
+ sibling files, see
+ #1212)
And some definitions:
subdirectiveoptional indented directive line immediately following a parent
directive
number how to interpret numbers when parsing journal entries (the
-notationidentity of the decimal separator character). (Currently each
+notationidentity of the decimal separator character). (Currently each
commodity can have its own notation, even in the same file.)
-displayhow to display amounts of a commodity in reports (symbol side
-style and spacing, digit groups, decimal separator, decimal places)
-directivewhich entries and (when there are multiple files) which files
-scope are affected by a directive
+displayhow to display amounts of a commodity in reports (symbol side and
+style spacing, digit groups, decimal separator, decimal places)
+directivewhich entries and (when there are multiple files) which files are
+scope affected by a directive
As you can see, directives vary in which journal entries and files
they affect, and whether they are focussed on input (parsing) or output
-(reports). Some directives have multiple effects.
+(reports). Some directives have multiple effects.
* Menu:
@@ -1002,18 +1049,18 @@ File: hledger_journal.info, Node: Directives and multiple files, Next: Comment
14.1 Directives and multiple files
==================================
-If you use multiple '-f'/'--file' options, or the 'include' directive,
-hledger will process multiple input files. But note that directives
+If you use multiple `-f'/`--file' options, or the `include' directive,
+hledger will process multiple input files. But note that directives
which affect input (see above) typically last only until the end of the
file in which they occur.
This may seem inconvenient, but it's intentional; it makes reports
-stable and deterministic, independent of the order of input. Otherwise
+stable and deterministic, independent of the order of input. Otherwise
you could see different numbers if you happened to write -f options in a
different order, or if you moved includes around while cleaning up your
files.
- It can be surprising though; for example, it means that 'alias'
+ It can be surprising though; for example, it means that `alias'
directives do not affect parent or sibling files (see below).

@@ -1022,9 +1069,9 @@ File: hledger_journal.info, Node: Comment blocks, Next: Including other files,
14.2 Comment blocks
===================
-A line containing just 'comment' starts a commented region of the file,
-and a line containing just 'end comment' (or the end of the current
-file) ends it. See also comments.
+A line containing just `comment' starts a commented region of the file,
+and a line containing just `end comment' (or the end of the current
+file) ends it. See also comments.

File: hledger_journal.info, Node: Including other files, Next: Default year, Prev: Comment blocks, Up: DIRECTIVES
@@ -1035,6 +1082,7 @@ File: hledger_journal.info, Node: Including other files, Next: Default year,
You can pull in the content of additional files by writing an include
directive, like this:
+
include FILEPATH
Only journal files can include, and only journal, timeclock or
@@ -1043,19 +1091,19 @@ timedot files can be included (not CSV files, currently).
If the file path does not begin with a slash, it is relative to the
current file's folder.
- A tilde means home directory, eg: 'include ~/main.journal'.
+ A tilde means home directory, eg: `include ~/main.journal'.
The path may contain glob patterns to match multiple files, eg:
-'include *.journal'.
+`include *.journal'.
- There is limited support for recursive wildcards: '**/' (the slash is
-required) matches 0 or more subdirectories. It's not super convenient
+ There is limited support for recursive wildcards: `**/' (the slash
+is required) matches 0 or more subdirectories. It's not super convenient
since you have to avoid include cycles and including directories, but
-this can be done, eg: 'include */**/*.journal'.
+this can be done, eg: `include */**/*.journal'.
The path may also be prefixed to force a specific file format,
overriding the file extension (as described in hledger.1 -> Input
-files): 'include timedot:~/notes/2020*.md'.
+files): `include timedot:~/notes/2020*.md'.

File: hledger_journal.info, Node: Default year, Next: Declaring commodities, Prev: Including other files, Up: DIRECTIVES
@@ -1064,9 +1112,10 @@ File: hledger_journal.info, Node: Default year, Next: Declaring commodities,
=================
You can set a default year to be used for subsequent dates which don't
-specify a year. This is a line beginning with 'Y' followed by the year.
+specify a year. This is a line beginning with `Y' followed by the year.
Eg:
+
Y2009 ; set default year to 2009
12/15 ; equivalent to 2009/12/15
@@ -1089,25 +1138,27 @@ File: hledger_journal.info, Node: Declaring commodities, Next: Default commodi
14.5 Declaring commodities
==========================
-The 'commodity' directive has several functions:
+The `commodity' directive has several functions:
- 1. It declares commodities which may be used in the journal. This is
+ 1. It declares commodities which may be used in the journal. This is
currently not enforced, but can serve as documentation.
- 2. It declares what decimal mark character (period or comma) to expect
- when parsing input - useful to disambiguate international number
- formats in your data. (Without this, hledger will parse both
- '1,000' and '1.000' as 1).
+ 2. It declares what decimal mark character (period or comma) to
+ expect when parsing input - useful to disambiguate international
+ number formats in your data. (Without this, hledger will parse
+ both `1,000' and `1.000' as 1).
3. It declares a commodity's display style in output - decimal and
digit group marks, number of decimal places, symbol placement etc.
+
You are likely to run into one of the problems solved by commodity
directives, sooner or later, so it's a good idea to just always use them
to declare your commodities.
- A commodity directive is just the word 'commodity' followed by an
-amount. It may be written on a single line, like this:
+ A commodity directive is just the word `commodity' followed by an
+amount. It may be written on a single line, like this:
+
; commodity EXAMPLEAMOUNT
@@ -1116,10 +1167,11 @@ amount. It may be written on a single line, like this:
; separating thousands with comma.
commodity 1,000.0000 AAAA
- or on multiple lines, using the "format" subdirective. (In this case
+ or on multiple lines, using the "format" subdirective. (In this case
the commodity symbol appears twice and should be the same in both
places.):
+
; commodity SYMBOL
; format EXAMPLEAMOUNT
@@ -1130,11 +1182,11 @@ commodity INR
format INR 1,00,00,000.00
The quantity of the amount does not matter; only the format is
-significant. The number must include a decimal mark: either a period or
+significant. The number must include a decimal mark: either a period or
a comma, followed by 0 or more decimal digits.
Note hledger normally uses banker's rounding, so 0.5 displayed with
-zero decimal digits is "0". (More at Commodity display style.)
+zero decimal digits is "0". (More at Commodity display style.)
* Menu:
@@ -1146,10 +1198,10 @@ File: hledger_journal.info, Node: Commodity error checking, Up: Declaring comm
14.5.1 Commodity error checking
-------------------------------
-In strict mode, enabled with the '-s'/'--strict' flag, hledger will
-report an error if a commodity symbol is used that has not been declared
-by a 'commodity' directive. This works similarly to account error
-checking, see the notes there for more details.
+In strict mode, enabled with the `-s'/`--strict' flag, hledger will
+report an error if a commodity symbol is used that has not been
+declared by a `commodity' directive. This works similarly to account
+error checking, see the notes there for more details.

File: hledger_journal.info, Node: Default commodity, Next: Declaring market prices, Prev: Declaring commodities, Up: DIRECTIVES
@@ -1157,18 +1209,19 @@ File: hledger_journal.info, Node: Default commodity, Next: Declaring market pr
14.6 Default commodity
======================
-The 'D' directive sets a default commodity, to be used for amounts
-without a commodity symbol (ie, plain numbers). This commodity will be
-applied to all subsequent commodity-less amounts, or until the next 'D'
-directive. (Note, this is different from Ledger's 'D'.)
+The `D' directive sets a default commodity, to be used for amounts
+without a commodity symbol (ie, plain numbers). This commodity will be
+applied to all subsequent commodity-less amounts, or until the next `D'
+directive. (Note, this is different from Ledger's `D'.)
+
+ For compatibility/historical reasons, `D' also acts like a
+`commodity' directive, setting the commodity's display style (for
+output) and decimal mark (for parsing input). As with `commodity', the
+amount must always be written with a decimal mark (period or comma).
+If both directives are used, `commodity''s style takes precedence.
- For compatibility/historical reasons, 'D' also acts like a
-'commodity' directive, setting the commodity's display style (for
-output) and decimal mark (for parsing input). As with 'commodity', the
-amount must always be written with a decimal mark (period or comma). If
-both directives are used, 'commodity''s style takes precedence.
+ The syntax is `D AMOUNT'. Eg:
- The syntax is 'D AMOUNT'. Eg:
; commodity-less amounts should be treated as dollars
; (and displayed with the dollar sign on the left, thousands separators and two decimal places)
@@ -1184,29 +1237,33 @@ File: hledger_journal.info, Node: Declaring market prices, Next: Declaring acc
14.7 Declaring market prices
============================
-The 'P' directive declares a market price, which is an exchange rate
-between two commodities on a certain date. (In Ledger, they are called
-"historical prices".) These are often obtained from a stock exchange,
+The `P' directive declares a market price, which is an exchange rate
+between two commodities on a certain date. (In Ledger, they are called
+"historical prices".) These are often obtained from a stock exchange,
cryptocurrency exchange, or the foreign exchange market.
Here is the format:
+
P DATE COMMODITYA COMMODITYBAMOUNT
* DATE is a simple date
+
* COMMODITYA is the symbol of the commodity being priced
+
* COMMODITYBAMOUNT is an amount (symbol and quantity) in a second
- commodity, giving the price in commodity B of one unit of commodity
- A.
+ commodity, giving the price in commodity B of one unit of
+ commodity A.
These two market price directives say that one euro was worth 1.35 US
dollars during 2009, and $1.40 from 2010 onward:
+
P 2009/1/1 € $1.35
P 2010/1/1 € $1.40
- The '-V', '-X' and '--value' flags use these market prices to show
-amount values in another commodity. See Valuation.
+ The `-V', `-X' and `--value' flags use these market prices to show
+amount values in another commodity. See Valuation.

File: hledger_journal.info, Node: Declaring accounts, Next: Rewriting accounts, Prev: Declaring market prices, Up: DIRECTIVES
@@ -1214,27 +1271,33 @@ File: hledger_journal.info, Node: Declaring accounts, Next: Rewriting accounts
14.8 Declaring accounts
=======================
-'account' directives can be used to declare accounts (ie, the places
-that amounts are transferred from and to). Though not required, these
+`account' directives can be used to declare accounts (ie, the places
+that amounts are transferred from and to). Though not required, these
declarations can provide several benefits:
* They can document your intended chart of accounts, providing a
reference.
+
* They can help hledger know your accounts' types (asset, liability,
equity, revenue, expense), useful for reports like balancesheet and
incomestatement.
+
* They control account display order in reports, allowing
non-alphabetic sorting (eg Revenues to appear above Expenses).
+
* They can store extra information about accounts (account numbers,
notes, etc.)
+
* They help with account name completion in the add command,
hledger-iadd, hledger-web, ledger-mode etc.
+
* In strict mode, they restrict which accounts may be posted to by
transactions, which helps detect typos.
- The simplest form is just the word 'account' followed by a
+ The simplest form is just the word `account' followed by a
hledger-style account name, eg this account directive declares the
-'assets:bank:checking' account:
+`assets:bank:checking' account:
+
account assets:bank:checking
@@ -1253,24 +1316,27 @@ File: hledger_journal.info, Node: Account error checking, Next: Account commen
-----------------------------
By default, accounts come into existence when a transaction references
-them by name. This is convenient, but it means hledger can't warn you
-when you mis-spell an account name in the journal. Usually you'll find
+them by name. This is convenient, but it means hledger can't warn you
+when you mis-spell an account name in the journal. Usually you'll find
the error later, as an extra account in balance reports, or an incorrect
balance when reconciling.
- In strict mode, enabled with the '-s'/'--strict' flag, hledger will
+ In strict mode, enabled with the `-s'/`--strict' flag, hledger will
report an error if any transaction uses an account name that has not
-been declared by an account directive. Some notes:
+been declared by an account directive. Some notes:
* The declaration is case-sensitive; transactions must use the
correct account name capitalisation.
+
* The account directive's scope is "whole file and below" (see
- directives). This means it affects all of the current file, and
- any files it includes, but not parent or sibling files. The
- position of account directives within the file does not matter,
- though it's usual to put them at the top.
- * Accounts can only be declared in 'journal' files (but will affect
+ directives). This means it affects all of the current file, and any
+ files it includes, but not parent or sibling files. The position of
+ account directives within the file does not matter, though it's
+ usual to put them at the top.
+
+ * Accounts can only be declared in `journal' files (but will affect
included files in other formats).
+
* It's currently not possible to declare "all possible subaccounts"
with a wildcard; every account posted to must be declared.
@@ -1284,10 +1350,12 @@ Comments, beginning with a semicolon, can be added:
* on the same line, *after two or more spaces* (because ; is allowed
in account names)
+
* on the next lines, indented
An example of both:
+
account assets:bank:checking ; same-line comment, note 2+ spaces before ;
; next-line comment
; another with tag, acctno:12345 (not used yet)
@@ -1303,11 +1371,13 @@ File: hledger_journal.info, Node: Account subdirectives, Next: Account types,
We also allow (and ignore) Ledger-style indented subdirectives, just for
compatibility.:
+
account assets:bank:checking
format blah blah ; <- subdirective, ignored
Here is the full syntax of account directives:
+
account ACCTNAME [ACCTTYPE] [;COMMENT]
[;COMMENTS]
[LEDGER-STYLE SUBDIRECTIVES, IGNORED]
@@ -1321,16 +1391,16 @@ File: hledger_journal.info, Node: Account types, Next: Account display order,
hledger recognises five main types of account, corresponding to the
account classes in the accounting equation:
- 'Asset', 'Liability', 'Equity', 'Revenue', 'Expense'.
+ `Asset', `Liability', `Equity', `Revenue', `Expense'.
These account types are important for controlling which accounts
appear in the balancesheet, balancesheetequity, incomestatement reports
(and probably for other things in future).
- Additionally, we recognise the 'Cash' type, which is also an 'Asset',
-and which causes accounts to appear in the cashflow report. ("Cash"
-here means liquid assets, eg bank balances but typically not investments
-or receivables.)
+ Additionally, we recognise the `Cash' type, which is also an
+`Asset', and which causes accounts to appear in the cashflow report.
+("Cash" here means liquid assets, eg bank balances but typically not
+investments or receivables.)
* Menu:
@@ -1346,13 +1416,14 @@ File: hledger_journal.info, Node: Declaring account types, Next: Auto-detected
................................
Generally, to make these reports work you should declare your top-level
-accounts and their types, using account directives with 'type:' tags.
+accounts and their types, using account directives with `type:' tags.
- The tag's value should be one of: 'Asset', 'Liability', 'Equity',
-'Revenue', 'Expense', 'Cash', 'A', 'L', 'E', 'R', 'X', 'C' (all case
+ The tag's value should be one of: `Asset', `Liability', `Equity',
+`Revenue', `Expense', `Cash', `A', `L', `E', `R', `X', `C' (all case
insensitive). The type is inherited by all subaccounts except where
they override it. Here's a complete example:
+
account assets ; type: Asset
account assets:bank ; type: Cash
account assets:cash ; type: Cash
@@ -1371,19 +1442,19 @@ If you happen to use common english top-level account names, you may not
need to declare account types, as they will be detected automatically
using the following rules:
-If name matches regular account
-expression: type is:
--------------------------------------------------
-'^assets?(:|$)' 'Asset'
-'^(debts?|liabilit(y|ies))(:|$)' 'Liability'
-'^equity(:|$)' 'Equity'
-'^(income|revenue)s?(:|$)' 'Revenue'
-'^expenses?(:|$)' 'Expense'
+If name matches regular account type
+expression: is:
+-------------------------------------------------
+`^assets?(:|$)' `Asset'
+`^(debts?|liabilit(y|ies))(:|$)' `Liability'
+`^equity(:|$)' `Equity'
+`^(income|revenue)s?(:|$)' `Revenue'
+`^expenses?(:|$)' `Expense'
-If account type is 'Asset' and name does not contain account type
+If account type is `Asset' and name does not contain account type
regular expression: is:
---------------------------------------------------------------------------
-'(investment|receivable|:A/R|:fixed)' 'Cash'
+--------------------------------------------------------------------------
+`(investment|receivable|:A/R|:fixed)' `Cash'
Even so, explicit declarations may be a good idea, for clarity and
predictability.
@@ -1397,9 +1468,10 @@ File: hledger_journal.info, Node: Interference from auto-detected account types
If you assign any account type, it's a good idea to assign all of them,
to prevent any confusion from mixing declared and auto-detected types.
Although it's unlikely to happen in real life, here's an example: with
-the following journal, 'balancesheetequity' shows "liabilities" in both
-Liabilities and Equity sections. Declaring another account as
-'type:Liability' would fix it:
+the following journal, `balancesheetequity' shows "liabilities" in both
+Liabilities and Equity sections. Declaring another account as
+`type:Liability' would fix it:
+
account liabilities ; type:Equity
@@ -1418,6 +1490,7 @@ In some hledger journals you might instead see this old syntax (the
letters ALERX, separated from the account name by two or more spaces);
this is deprecated and may be removed soon:
+
account assets A
account liabilities L
account equity E
@@ -1432,9 +1505,10 @@ File: hledger_journal.info, Node: Account display order, Prev: Account types,
Account directives also set the order in which accounts are displayed,
eg in reports, the hledger-ui accounts screen, and the hledger-web
-sidebar. By default accounts are listed in alphabetical order. But if
+sidebar. By default accounts are listed in alphabetical order. But if
you have these account directives in the journal:
+
account assets
account liabilities
account equity
@@ -1444,6 +1518,7 @@ account expenses
you'll see those accounts displayed in declaration order, not
alphabetically:
+
$ hledger accounts -1
assets
liabilities
@@ -1455,20 +1530,22 @@ expenses
order.
Note that sorting is done at each level of the account tree (within
-each group of sibling accounts under the same parent). And currently,
+each group of sibling accounts under the same parent). And currently,
this directive:
+
account other:zoo
- would influence the position of 'zoo' among 'other''s subaccounts,
-but not the position of 'other' among the top-level accounts. This
+ would influence the position of `zoo' among `other''s subaccounts,
+but not the position of `other' among the top-level accounts. This
means:
- * you will sometimes declare parent accounts (eg 'account other'
+ * you will sometimes declare parent accounts (eg `account other'
above) that you don't intend to post to, just to customize their
display order
- * sibling accounts stay together (you couldn't display 'x:y' in
- between 'a:b' and 'a:c').
+
+ * sibling accounts stay together (you couldn't display `x:y' in
+ between `a:b' and `a:c').

File: hledger_journal.info, Node: Rewriting accounts, Next: Default parent account, Prev: Declaring accounts, Up: DIRECTIVES
@@ -1477,13 +1554,16 @@ File: hledger_journal.info, Node: Rewriting accounts, Next: Default parent acc
=======================
You can define account alias rules which rewrite your account names, or
-parts of them, before generating reports. This can be useful for:
+parts of them, before generating reports. This can be useful for:
* expanding shorthand account names to their full form, allowing
easier data entry and a less verbose journal
+
* adapting old journals to your current chart of accounts
+
* experimenting with new account organisations, like a new hierarchy
or combining two accounts into one
+
* customising reports
Account aliases also rewrite account names in account directives.
@@ -1506,19 +1586,21 @@ File: hledger_journal.info, Node: Basic aliases, Next: Regex aliases, Up: Rew
14.9.1 Basic aliases
--------------------
-To set an account alias, use the 'alias' directive in your journal file.
-This affects all subsequent journal entries in the current file or its
-included files. The spaces around the = are optional:
+To set an account alias, use the `alias' directive in your journal
+file. This affects all subsequent journal entries in the current file or
+its included files. The spaces around the = are optional:
+
alias OLD = NEW
- Or, you can use the '--alias 'OLD=NEW'' option on the command line.
-This affects all entries. It's useful for trying out aliases
+ Or, you can use the `--alias 'OLD=NEW'' option on the command line.
+This affects all entries. It's useful for trying out aliases
interactively.
- OLD and NEW are case sensitive full account names. hledger will
+ OLD and NEW are case sensitive full account names. hledger will
replace any occurrence of the old account name with the new one.
-Subaccounts are also affected. Eg:
+Subaccounts are also affected. Eg:
+
alias checking = assets:bank:wells fargo:checking
; rewrites "checking" to "assets:bank:wells fargo:checking", or "checking:a" to "assets:bank:wells fargo:checking:a"
@@ -1532,15 +1614,17 @@ File: hledger_journal.info, Node: Regex aliases, Next: Combining aliases, Pre
There is also a more powerful variant that uses a regular expression,
indicated by the forward slashes:
+
alias /REGEX/ = REPLACEMENT
- or '--alias '/REGEX/=REPLACEMENT''.
+ or `--alias '/REGEX/=REPLACEMENT''.
- REGEX is a case-insensitive regular expression. Anywhere it matches
+ REGEX is a case-insensitive regular expression. Anywhere it matches
inside an account name, the matched part will be replaced by
REPLACEMENT. If REGEX contains parenthesised match groups, these can be
referenced by the usual numeric backreferences in REPLACEMENT. Eg:
+
alias /^(.+):bank:([^:]+):(.*)/ = \1:\2 \3
; rewrites "assets:bank:wells fargo:checking" to "assets:wells fargo checking"
@@ -1558,31 +1642,34 @@ You can define as many aliases as you like, using journal directives
and/or command line options.
Recursive aliases - where an account name is rewritten by one alias,
-then by another alias, and so on - are allowed. Each alias sees the
+then by another alias, and so on - are allowed. Each alias sees the
effect of previously applied aliases.
In such cases it can be important to understand which aliases will be
-applied and in which order. For (each account name in) each journal
+applied and in which order. For (each account name in) each journal
entry, we apply:
- 1. 'alias' directives preceding the journal entry, most recently
+ 1. `alias' directives preceding the journal entry, most recently
parsed first (ie, reading upward from the journal entry, bottom to
top)
- 2. '--alias' options, in the order they appeared on the command line
+
+ 2. `--alias' options, in the order they appeared on the command line
(left to right).
In other words, for (an account name in) a given journal entry:
* the nearest alias declaration before/above the entry is applied
first
+
* the next alias before/above that will be be applied next, and so on
+
* aliases defined after/below the entry do not affect it.
This gives nearby aliases precedence over distant ones, and helps
provide semantic stability - aliases will keep working the same way
independent of which files are being read and in which order.
- In case of trouble, adding '--debug=6' to the command line will show
+ In case of trouble, adding `--debug=6' to the command line will show
which aliases are being applied when.

@@ -1591,14 +1678,16 @@ File: hledger_journal.info, Node: Aliases and multiple files, Next: end aliase
14.9.4 Aliases and multiple files
---------------------------------
-As explained at Directives and multiple files, 'alias' directives do not
-affect parent or sibling files. Eg in this command,
+As explained at Directives and multiple files, `alias' directives do
+not affect parent or sibling files. Eg in this command,
+
hledger -f a.aliases -f b.journal
account aliases defined in a.aliases will not affect b.journal.
Including the aliases doesn't work either:
+
include a.aliases
2020-01-01 ; not affected by a.aliases
@@ -1608,6 +1697,7 @@ include a.aliases
This means that account aliases should usually be declared at the
start of your top-most file, like this:
+
alias foo=Foo
alias bar=Bar
@@ -1620,12 +1710,13 @@ include c.journal ; also affected

File: hledger_journal.info, Node: end aliases, Prev: Aliases and multiple files, Up: Rewriting accounts
-14.9.5 'end aliases'
+14.9.5 `end aliases'
--------------------
-You can clear (forget) all currently defined aliases with the 'end
+You can clear (forget) all currently defined aliases with the `end
aliases' directive:
+
end aliases

@@ -1635,9 +1726,10 @@ File: hledger_journal.info, Node: Default parent account, Prev: Rewriting acco
============================
You can specify a parent account which will be prepended to all accounts
-within a section of the journal. Use the 'apply account' and 'end apply
+within a section of the journal. Use the `apply account' and `end apply
account' directives like so:
+
apply account home
2010/1/1
@@ -1648,12 +1740,14 @@ end apply account
which is equivalent to:
+
2010/01/01
home:food $10
home:cash $-10
- If 'end apply account' is omitted, the effect lasts to the end of the
-file. Included files are also affected, eg:
+ If `end apply account' is omitted, the effect lasts to the end of
+the file. Included files are also affected, eg:
+
apply account business
include biz.journal
@@ -1661,13 +1755,13 @@ end apply account
apply account personal
include personal.journal
- Prior to hledger 1.0, legacy 'account' and 'end' spellings were also
+ Prior to hledger 1.0, legacy `account' and `end' spellings were also
supported.
- A default parent account also affects account directives. It does
-not affect account names being entered via hledger add or hledger-web.
-If account aliases are present, they are applied after the default
-parent account.
+ A default parent account also affects account directives. It does not
+affect account names being entered via hledger add or hledger-web. If
+account aliases are present, they are applied after the default parent
+account.

File: hledger_journal.info, Node: PERIODIC TRANSACTIONS, Next: AUTO POSTINGS, Prev: DIRECTIVES, Up: Top
@@ -1675,7 +1769,7 @@ File: hledger_journal.info, Node: PERIODIC TRANSACTIONS, Next: AUTO POSTINGS,
15 PERIODIC TRANSACTIONS
************************
-Periodic transaction rules describe transactions that recur. They allow
+Periodic transaction rules describe transactions that recur. They allow
hledger to generate temporary future transactions to help with
forecasting, so you don't have to write out each one in the journal, and
it's easy to try out different forecasts.
@@ -1685,24 +1779,30 @@ read this whole section - or at least these tips:
1. Two spaces accidentally added or omitted will cause you trouble -
read about this below.
- 2. For troubleshooting, show the generated transactions with 'hledger
- print --forecast tag:generated' or 'hledger register --forecast
+
+ 2. For troubleshooting, show the generated transactions with `hledger
+ print --forecast tag:generated' or `hledger register --forecast
tag:generated'.
+
3. Forecasted transactions will begin only after the last
non-forecasted transaction's date.
+
4. Forecasted transactions will end 6 months from today, by default.
See below for the exact start/end rules.
- 5. period expressions can be tricky. Their documentation needs
+
+ 5. period expressions can be tricky. Their documentation needs
improvement, but is worth studying.
+
6. Some period expressions with a repeating interval must begin on a
- natural boundary of that interval. Eg in 'weekly from DATE', DATE
- must be a monday. '~ weekly from 2019/10/1' (a tuesday) will give
+ natural boundary of that interval. Eg in `weekly from DATE', DATE
+ must be a monday. `~ weekly from 2019/10/1' (a tuesday) will give
an error.
+
7. Other period expressions with an interval are automatically
- expanded to cover a whole number of that interval. (This is done
+ expanded to cover a whole number of that interval. (This is done
to improve reports, but it also affects periodic transactions.
- Yes, it's a bit inconsistent with the above.) Eg: '~ every 10th
- day of month from 2020/01', which is equivalent to '~ every 10th
+ Yes, it's a bit inconsistent with the above.) Eg: `~ every 10th
+ day of month from 2020/01', which is equivalent to `~ every 10th
day of month from 2020/01/01', will be adjusted to start on
2019/12/10.
@@ -1723,19 +1823,20 @@ File: hledger_journal.info, Node: Periodic rule syntax, Next: Two spaces betwe
=========================
A periodic transaction rule looks like a normal journal entry, with the
-date replaced by a tilde ('~') followed by a period expression
-(mnemonic: '~' looks like a recurring sine wave.):
+date replaced by a tilde (`~') followed by a period expression
+(mnemonic: `~' looks like a recurring sine wave.):
+
~ monthly
expenses:rent $2000
assets:bank:checking
There is an additional constraint on the period expression: the start
-date must fall on a natural boundary of the interval. Eg 'monthly from
-2018/1/1' is valid, but 'monthly from 2018/1/15' is not.
+date must fall on a natural boundary of the interval. Eg `monthly from
+2018/1/1' is valid, but `monthly from 2018/1/15' is not.
Partial or relative dates (M/D, D, tomorrow, last week) in the period
-expression can work (useful or not). They will be relative to today's
+expression can work (useful or not). They will be relative to today's
date, unless a Y default year directive is in effect, in which case they
will be relative to Y/1/1.
@@ -1746,10 +1847,11 @@ File: hledger_journal.info, Node: Two spaces between period expression and desc
==========================================================
If the period expression is followed by a transaction description, these
-must be separated by *two or more spaces*. This helps hledger know
+must be separated by *two or more spaces*. This helps hledger know
where the period expression ends, so that descriptions can not
accidentally alter their meaning, as in this example:
+
; 2 or more spaces needed here, so the period is not understood as "every 2 months in 2020"
; ||
; vv
@@ -1761,6 +1863,7 @@ accidentally alter their meaning, as in this example:
* Do write two spaces between your period expression and your
transaction description, if any.
+
* Don't accidentally write two spaces in the middle of your period
expression.
@@ -1770,25 +1873,26 @@ File: hledger_journal.info, Node: Forecasting with periodic transactions, Next
15.3 Forecasting with periodic transactions
===========================================
-The '--forecast' flag activates any periodic transaction rules in the
-journal. They will generate temporary recurring transactions, which are
+The `--forecast' flag activates any periodic transaction rules in the
+journal. They will generate temporary recurring transactions, which are
not saved in the journal, but will appear in all reports (eg print).
This can be useful for estimating balances into the future, or
-experimenting with different scenarios. Or, it can be used as a data
+experimenting with different scenarios. Or, it can be used as a data
entry aid: describe recurring transactions, and every so often copy the
-output of 'print --forecast' into the journal.
+output of `print --forecast' into the journal.
These transactions will have an extra tag indicating which periodic
-rule generated them: 'generated-transaction:~ PERIODICEXPR'. And a
+rule generated them: `generated-transaction:~ PERIODICEXPR'. And a
similar, hidden tag (beginning with an underscore) which, because it's
never displayed by print, can be used to match transactions generated
-"just now": '_generated-transaction:~ PERIODICEXPR'.
+"just now": `_generated-transaction:~ PERIODICEXPR'.
- Periodic transactions are generated within some forecast period. By
+ Periodic transactions are generated within some forecast period. By
default, this
* begins on the later of
* the report start date if specified with -b/-p/date:
+
* the day after the latest normal (non-periodic) transaction in
the journal, or today if there are no normal transactions.
@@ -1796,19 +1900,19 @@ default, this
months (180 days) from today.
This means that periodic transactions will begin only after the
-latest recorded transaction. And a recorded transaction dated in the
-future can prevent generation of periodic transactions. (You can avoid
+latest recorded transaction. And a recorded transaction dated in the
+future can prevent generation of periodic transactions. (You can avoid
that by writing the future transaction as a one-time periodic rule
-instead - put tilde before the date, eg '~ YYYY-MM-DD ...').
+instead - put tilde before the date, eg `~ YYYY-MM-DD ...').
Or, you can set your own arbitrary "forecast period", which can
overlap recorded transactions, and need not be in the future, by
-providing an option argument, like '--forecast=PERIODEXPR'. Note the
-equals sign is required, a space won't work. PERIODEXPR is a period
-expression, which can specify the start date, end date, or both, like in
-a 'date:' query. (See also hledger.1 -> Report start & end date). Some
-examples: '--forecast=202001-202004', '--forecast=jan-',
-'--forecast=2020'.
+providing an option argument, like `--forecast=PERIODEXPR'. Note the
+equals sign is required, a space won't work. PERIODEXPR is a period
+expression, which can specify the start date, end date, or both, like
+in a `date:' query. (See also hledger.1 -> Report start & end date).
+Some examples: `--forecast=202001-202004', `--forecast=jan-',
+`--forecast=2020'.

File: hledger_journal.info, Node: Budgeting with periodic transactions, Prev: Forecasting with periodic transactions, Up: PERIODIC TRANSACTIONS
@@ -1816,12 +1920,12 @@ File: hledger_journal.info, Node: Budgeting with periodic transactions, Prev:
15.4 Budgeting with periodic transactions
=========================================
-With the '--budget' flag, currently supported by the balance command,
+With the `--budget' flag, currently supported by the balance command,
each periodic transaction rule declares recurring budget goals for the
-specified accounts. Eg the first example above declares a goal of
+specified accounts. Eg the first example above declares a goal of
spending $2000 on rent (and also, a goal of depositing $2000 into
-checking) every month. Goals and actual performance can then be
-compared in budget reports.
+checking) every month. Goals and actual performance can then be compared
+in budget reports.
See also: Budgeting and Forecasting.
@@ -1833,40 +1937,46 @@ File: hledger_journal.info, Node: AUTO POSTINGS, Prev: PERIODIC TRANSACTIONS,
"Automated postings" or "auto postings" are extra postings which get
added automatically to transactions which match certain queries, defined
-by "auto posting rules", when you use the '--auto' flag.
+by "auto posting rules", when you use the `--auto' flag.
An auto posting rule looks a bit like a transaction:
+
= QUERY
ACCOUNT AMOUNT
...
ACCOUNT [AMOUNT]
- except the first line is an equals sign (mnemonic: '=' suggests
+ except the first line is an equals sign (mnemonic: `=' suggests
matching), followed by a query (which matches existing postings), and
each "posting" line describes a posting to be generated, and the posting
amounts can be:
- * a normal amount with a commodity symbol, eg '$2'. This will be
- used as-is.
- * a number, eg '2'. The commodity symbol (if any) from the matched
+ * a normal amount with a commodity symbol, eg `$2'. This will be used
+ as-is.
+
+ * a number, eg `2'. The commodity symbol (if any) from the matched
posting will be added to this.
- * a numeric multiplier, eg '*2' (a star followed by a number N). The
+
+ * a numeric multiplier, eg `*2' (a star followed by a number N). The
matched posting's amount (and total price, if any) will be
multiplied by N.
- * a multiplier with a commodity symbol, eg '*$2' (a star, number N,
+
+ * a multiplier with a commodity symbol, eg `*$2' (a star, number N,
and symbol S). The matched posting's amount will be multiplied by
N, and its commodity symbol will be replaced with S.
Any query term containing spaces must be enclosed in single or double
-quotes, as on the command line. Eg, note the quotes around the second
+quotes, as on the command line. Eg, note the quotes around the second
query term below:
+
= expenses:groceries 'expenses:dining out'
(budget:funds:dining out) *-1
Some examples:
+
; every time I buy food, schedule a dollar donation
= expenses:food
(liabilities:charity) $-1
@@ -1884,6 +1994,7 @@ query term below:
expenses:gifts $20
assets:checking
+
$ hledger print --auto
2017-12-01
expenses:food $10
@@ -1910,8 +2021,8 @@ File: hledger_journal.info, Node: Auto postings and multiple files, Next: Auto
=====================================
An auto posting rule can affect any transaction in the current file, or
-in any parent file or child file. Note, currently it will not affect
-sibling files (when multiple '-f'/'--file' are used - see #1212).
+in any parent file or child file. Note, currently it will not affect
+sibling files (when multiple `-f'/`--file' are used - see #1212).

File: hledger_journal.info, Node: Auto postings and dates, Next: Auto postings and transaction balancing / inferred amounts / balance assertions, Prev: Auto postings and multiple files, Up: AUTO POSTINGS
@@ -1929,14 +2040,17 @@ File: hledger_journal.info, Node: Auto postings and transaction balancing / inf
16.3 Auto postings and transaction balancing / inferred amounts /
=================================================================
-balance assertions Currently, auto postings are added:
+balance assertions
+
+ Currently, auto postings are added:
* after missing amounts are inferred, and transactions are checked
for balancedness,
+
* but before balance assertions are checked.
Note this means that journal entries must be balanced both before and
-after auto postings are added. This changed in hledger 1.12+; see #893
+after auto postings are added. This changed in hledger 1.12+; see #893
for background.

@@ -1947,154 +2061,157 @@ File: hledger_journal.info, Node: Auto posting tags, Prev: Auto postings and t
Automated postings will have some extra tags:
- * 'generated-posting:= QUERY' - shows this was generated by an auto
+ * `generated-posting:= QUERY' - shows this was generated by an auto
posting rule, and the query
- * '_generated-posting:= QUERY' - a hidden tag, which does not appear
- in hledger's output. This can be used to match postings generated
+
+ * `_generated-posting:= QUERY' - a hidden tag, which does not appear
+ in hledger's output. This can be used to match postings generated
"just now", rather than generated in the past and saved to the
journal.
Also, any transaction that has been changed by auto posting rules
will have these tags added:
- * 'modified:' - this transaction was modified
- * '_modified:' - a hidden tag not appearing in the comment; this
+ * `modified:' - this transaction was modified
+
+ * `_modified:' - a hidden tag not appearing in the comment; this
transaction was modified "just now".
+

Tag Table:
-Node: Top76
-Node: TRANSACTIONS2111
-Ref: #transactions2229
-Node: DATES3243
-Ref: #dates3350
-Node: Simple dates3415
-Ref: #simple-dates3537
-Node: Secondary dates4046
-Ref: #secondary-dates4196
-Node: Posting dates5532
-Ref: #posting-dates5657
-Node: STATUS7029
-Ref: #status7137
-Node: DESCRIPTION8845
-Ref: #description8966
-Node: Payee and note9286
-Ref: #payee-and-note9396
-Node: COMMENTS9731
-Ref: #comments9844
-Node: TAGS11038
-Ref: #tags11140
-Node: POSTINGS12533
-Ref: #postings12648
-Node: Virtual postings13674
-Ref: #virtual-postings13787
-Node: ACCOUNT NAMES15092
-Ref: #account-names15220
-Node: AMOUNTS15707
-Ref: #amounts15833
-Node: Digit group marks16957
-Ref: #digit-group-marks17104
-Node: Commodity display style18042
-Ref: #commodity-display-style18218
-Node: Rounding19761
-Ref: #rounding19881
-Node: TRANSACTION PRICES20293
-Ref: #transaction-prices20450
-Node: LOT PRICES LOT DATES22881
-Ref: #lot-prices-lot-dates23055
-Node: BALANCE ASSERTIONS23543
-Ref: #balance-assertions23712
-Node: Assertions and ordering24745
-Ref: #assertions-and-ordering24929
-Node: Assertions and included files25629
-Ref: #assertions-and-included-files25868
-Node: Assertions and multiple -f options26201
-Ref: #assertions-and-multiple--f-options26453
-Node: Assertions and commodities26585
-Ref: #assertions-and-commodities26813
-Node: Assertions and prices27970
-Ref: #assertions-and-prices28180
-Node: Assertions and subaccounts28620
-Ref: #assertions-and-subaccounts28845
-Node: Assertions and virtual postings29169
-Ref: #assertions-and-virtual-postings29407
-Node: Assertions and precision29549
-Ref: #assertions-and-precision29738
-Node: BALANCE ASSIGNMENTS30005
-Ref: #balance-assignments30166
-Node: Balance assignments and prices31330
-Ref: #balance-assignments-and-prices31498
-Node: DIRECTIVES31722
-Ref: #directives31868
-Node: Directives and multiple files37366
-Ref: #directives-and-multiple-files37545
-Node: Comment blocks38209
-Ref: #comment-blocks38388
-Node: Including other files38564
-Ref: #including-other-files38740
-Node: Default year39664
-Ref: #default-year39829
-Node: Declaring commodities40236
-Ref: #declaring-commodities40415
-Node: Commodity error checking42259
-Ref: #commodity-error-checking42415
-Node: Default commodity42672
-Ref: #default-commodity42854
-Node: Declaring market prices43743
-Ref: #declaring-market-prices43934
-Node: Declaring accounts44791
-Ref: #declaring-accounts44973
-Node: Account error checking46175
-Ref: #account-error-checking46347
-Node: Account comments47526
-Ref: #account-comments47716
-Node: Account subdirectives48140
-Ref: #account-subdirectives48331
-Node: Account types48644
-Ref: #account-types48824
-Node: Declaring account types49560
-Ref: #declaring-account-types49745
-Node: Auto-detected account types50395
-Ref: #auto-detected-account-types50642
-Node: Interference from auto-detected account types51539
-Ref: #interference-from-auto-detected-account-types51822
-Node: Old account type syntax52305
-Ref: #old-account-type-syntax52508
-Node: Account display order52808
-Ref: #account-display-order52974
-Node: Rewriting accounts54125
-Ref: #rewriting-accounts54306
-Node: Basic aliases55063
-Ref: #basic-aliases55205
-Node: Regex aliases55909
-Ref: #regex-aliases56077
-Node: Combining aliases56796
-Ref: #combining-aliases56985
-Node: Aliases and multiple files58261
-Ref: #aliases-and-multiple-files58466
-Node: end aliases59045
-Ref: #end-aliases59198
-Node: Default parent account59299
-Ref: #default-parent-account59463
-Node: PERIODIC TRANSACTIONS60347
-Ref: #periodic-transactions60509
-Node: Periodic rule syntax62426
-Ref: #periodic-rule-syntax62628
-Node: Two spaces between period expression and description!63332
-Ref: #two-spaces-between-period-expression-and-description63647
-Node: Forecasting with periodic transactions64331
-Ref: #forecasting-with-periodic-transactions64632
-Node: Budgeting with periodic transactions66687
-Ref: #budgeting-with-periodic-transactions66922
-Node: AUTO POSTINGS67331
-Ref: #auto-postings67458
-Node: Auto postings and multiple files69637
-Ref: #auto-postings-and-multiple-files69837
-Node: Auto postings and dates70046
-Ref: #auto-postings-and-dates70316
-Node: Auto postings and transaction balancing / inferred amounts / balance assertions70491
-Ref: #auto-postings-and-transaction-balancing-inferred-amounts-balance-assertions70838
-Node: Auto posting tags71180
-Ref: #auto-posting-tags71391
+Node: Top88
+Node: TRANSACTIONS2095
+Ref: #transactions2213
+Node: DATES3230
+Ref: #dates3337
+Node: Simple dates3402
+Ref: #simple-dates3524
+Node: Secondary dates4031
+Ref: #secondary-dates4181
+Node: Posting dates5515
+Ref: #posting-dates5640
+Node: STATUS7009
+Ref: #status7117
+Node: DESCRIPTION8822
+Ref: #description8943
+Node: Payee and note9261
+Ref: #payee-and-note9371
+Node: COMMENTS9705
+Ref: #comments9818
+Node: TAGS11011
+Ref: #tags11113
+Node: POSTINGS12511
+Ref: #postings12626
+Node: Virtual postings13650
+Ref: #virtual-postings13763
+Node: ACCOUNT NAMES15065
+Ref: #account-names15193
+Node: AMOUNTS15678
+Ref: #amounts15804
+Node: Digit group marks16931
+Ref: #digit-group-marks17078
+Node: Commodity display style18018
+Ref: #commodity-display-style18194
+Node: Rounding19738
+Ref: #rounding19858
+Node: TRANSACTION PRICES20268
+Ref: #transaction-prices20425
+Node: LOT PRICES LOT DATES22855
+Ref: #lot-prices-lot-dates23029
+Node: BALANCE ASSERTIONS23516
+Ref: #balance-assertions23685
+Node: Assertions and ordering24715
+Ref: #assertions-and-ordering24899
+Node: Assertions and included files25596
+Ref: #assertions-and-included-files25835
+Node: Assertions and multiple -f options26166
+Ref: #assertions-and-multiple--f-options26418
+Node: Assertions and commodities26549
+Ref: #assertions-and-commodities26777
+Node: Assertions and prices27932
+Ref: #assertions-and-prices28142
+Node: Assertions and subaccounts28583
+Ref: #assertions-and-subaccounts28808
+Node: Assertions and virtual postings29132
+Ref: #assertions-and-virtual-postings29370
+Node: Assertions and precision29511
+Ref: #assertions-and-precision29700
+Node: BALANCE ASSIGNMENTS29965
+Ref: #balance-assignments30126
+Node: Balance assignments and prices31289
+Ref: #balance-assignments-and-prices31457
+Node: DIRECTIVES31683
+Ref: #directives31829
+Node: Directives and multiple files37274
+Ref: #directives-and-multiple-files37453
+Node: Comment blocks38115
+Ref: #comment-blocks38294
+Node: Including other files38469
+Ref: #including-other-files38645
+Node: Default year39569
+Ref: #default-year39734
+Node: Declaring commodities40141
+Ref: #declaring-commodities40320
+Node: Commodity error checking42161
+Ref: #commodity-error-checking42317
+Node: Default commodity42573
+Ref: #default-commodity42755
+Node: Declaring market prices43640
+Ref: #declaring-market-prices43831
+Node: Declaring accounts44689
+Ref: #declaring-accounts44871
+Node: Account error checking46078
+Ref: #account-error-checking46250
+Node: Account comments47427
+Ref: #account-comments47617
+Node: Account subdirectives48043
+Ref: #account-subdirectives48234
+Node: Account types48549
+Ref: #account-types48729
+Node: Declaring account types49464
+Ref: #declaring-account-types49649
+Node: Auto-detected account types50300
+Ref: #auto-detected-account-types50547
+Node: Interference from auto-detected account types51446
+Ref: #interference-from-auto-detected-account-types51729
+Node: Old account type syntax52212
+Ref: #old-account-type-syntax52415
+Node: Account display order52716
+Ref: #account-display-order52882
+Node: Rewriting accounts54033
+Ref: #rewriting-accounts54214
+Node: Basic aliases54973
+Ref: #basic-aliases55115
+Node: Regex aliases55817
+Ref: #regex-aliases55985
+Node: Combining aliases56705
+Ref: #combining-aliases56894
+Node: Aliases and multiple files58171
+Ref: #aliases-and-multiple-files58376
+Node: end aliases58957
+Ref: #end-aliases59110
+Node: Default parent account59212
+Ref: #default-parent-account59376
+Node: PERIODIC TRANSACTIONS60260
+Ref: #periodic-transactions60422
+Node: Periodic rule syntax62339
+Ref: #periodic-rule-syntax62541
+Node: Two spaces between period expression and description!63244
+Ref: #two-spaces-between-period-expression-and-description63559
+Node: Forecasting with periodic transactions64244
+Ref: #forecasting-with-periodic-transactions64545
+Node: Budgeting with periodic transactions66591
+Ref: #budgeting-with-periodic-transactions66826
+Node: AUTO POSTINGS67233
+Ref: #auto-postings67360
+Node: Auto postings and multiple files69543
+Ref: #auto-postings-and-multiple-files69743
+Node: Auto postings and dates69951
+Ref: #auto-postings-and-dates70221
+Node: Auto postings and transaction balancing / inferred amounts / balance assertions70396
+Ref: #auto-postings-and-transaction-balancing-inferred-amounts-balance-assertions70744
+Node: Auto posting tags71089
+Ref: #auto-posting-tags71300

End Tag Table
diff --git a/hledger_journal.txt b/hledger_journal.txt
index 7f9579b..210741d 100644
--- a/hledger_journal.txt
+++ b/hledger_journal.txt
@@ -7,9 +7,9 @@ NAME
hledger's default file format, representing a General Journal.
DESCRIPTION
- hledger's usual data source is a plain text file containing journal en-
- tries in hledger journal format. This file represents a standard ac-
- counting general journal. I use file names ending in .journal, but
+ hledger's usual data source is a plain text file containing journal
+ entries in hledger journal format. This file represents a standard
+ accounting general journal. I use file names ending in .journal, but
that's not required. The journal file contains a number of transaction
entries, each describing a transfer of money (or any commodity) between
two or more named accounts, in a simple format readable by both hledger
@@ -43,8 +43,8 @@ TRANSACTIONS
between two or more named accounts.
Each transaction is recorded as a journal entry, beginning with a sim-
- ple date in column 0. This can be followed by any of the following op-
- tional fields, separated by spaces:
+ ple date in column 0. This can be followed by any of the following
+ optional fields, separated by spaces:
o a status character (empty, !, or *)
@@ -112,8 +112,8 @@ DATES
You can give individual postings a different date from their parent
transaction, by adding a posting comment containing a tag (see below)
like date:DATE. This is probably the best way to control posting dates
- precisely. Eg in this example the expense should appear in May re-
- ports, and the deduction from checking should be reported on 6/1 for
+ precisely. Eg in this example the expense should appear in May
+ reports, and the deduction from checking should be reported on 6/1 for
easy bank reconciliation:
2015/5/30
@@ -140,9 +140,10 @@ DATES
STATUS
Transactions, or individual postings within a transaction, can have a
- status mark, which is a single character before the transaction de-
- scription or posting account name, separated from it by a space, indi-
- cating one of three statuses:
+ status mark, which is a single character before the transaction
+ description or posting account name, separated from it by a space,
+ indicating one of three statuses:
+
mark status
------------------
@@ -155,8 +156,8 @@ STATUS
status:* queries; or the U, P, C keys in hledger-ui.
Note, in Ledger and in older versions of hledger, the "unmarked" state
- is called "uncleared". As of hledger 1.3 we have renamed it to un-
- marked for clarity.
+ is called "uncleared". As of hledger 1.3 we have renamed it to
+ unmarked for clarity.
To replicate Ledger and old hledger's behaviour of also matching pend-
ing, combine -U and -P.
@@ -169,6 +170,7 @@ STATUS
What "uncleared", "pending", and "cleared" actually mean is up to you.
Here's one suggestion:
+
status meaning
--------------------------------------------------------------------------
uncleared recorded but not yet reconciled; needs review
@@ -178,8 +180,8 @@ STATUS
rect
With this scheme, you would use -PC to see the current balance at your
- bank, -U to see things which will probably hit your bank soon (like un-
- cashed checks), and no flags to see the most up-to-date state of your
+ bank, -U to see things which will probably hit your bank soon (like
+ uncashed checks), and no flags to see the most up-to-date state of your
finances.
DESCRIPTION
@@ -192,9 +194,9 @@ DESCRIPTION
Payee and note
You can optionally include a | (pipe) character in descriptions to sub-
divide the description into separate fields for payee/payer name on the
- left (up to the first |) and an additional note field on the right (af-
- ter the first |). This may be worthwhile if you need to do more pre-
- cise querying and pivoting by payee or by note.
+ left (up to the first |) and an additional note field on the right
+ (after the first |). This may be worthwhile if you need to do more
+ precise querying and pivoting by payee or by note.
COMMENTS
Lines in the journal beginning with a semicolon (;) or hash (#) or star
@@ -202,11 +204,11 @@ COMMENTS
nodes to be ignored, allowing emacs users to fold and navigate their
journals with org-mode or orgstruct-mode.)
- You can attach comments to a transaction by writing them after the de-
- scription and/or indented on the following lines (before the postings).
- Similarly, you can attach comments to an individual posting by writing
- them after the amount and/or indented on the following lines. Transac-
- tion and posting comments must begin with a semicolon (;).
+ You can attach comments to a transaction by writing them after the
+ description and/or indented on the following lines (before the post-
+ ings). Similarly, you can attach comments to an individual posting by
+ writing them after the amount and/or indented on the following lines.
+ Transaction and posting comments must begin with a semicolon (;).
Some examples:
@@ -338,8 +340,8 @@ ACCOUNT NAMES
Account names can be aliased.
AMOUNTS
- After the account name, there is usually an amount. (Important: be-
- tween account name and amount, there must be two or more spaces.)
+ After the account name, there is usually an amount. (Important:
+ between account name and amount, there must be two or more spaces.)
hledger's amount format is flexible, supporting several international
formats. Here are some examples. Amounts have a number (the "quan-
@@ -400,16 +402,17 @@ AMOUNTS
hledger will treat them both as decimal marks by default (cf #793). If
you use digit group marks, to prevent confusion and undetected typos we
- recommend you write commodity directives at the top of the file to ex-
- plicitly declare the decimal mark (and optionally a digit group mark).
- Note, these formats ("amount styles") are specific to each commodity,
- so if your data uses multiple formats, hledger can handle it:
+ recommend you write commodity directives at the top of the file to
+ explicitly declare the decimal mark (and optionally a digit group
+ mark). Note, these formats ("amount styles") are specific to each com-
+ modity, so if your data uses multiple formats, hledger can handle it:
commodity $1,000.00
commodity EUR 1.000,00
commodity INR 9,99,99,999.00
commodity 1 000 000.9455
+
Commodity display style
For each commodity, hledger chooses a consistent style to use when dis-
playing amounts. (Except price amounts, which are always displayed as
@@ -426,44 +429,44 @@ AMOUNTS
A style is inferred from the journal amounts in a commodity as follows:
- o Use the general style (decimal mark, symbol placement) of the first
+ o Use the general style (decimal mark, symbol placement) of the first
amount
- o Use the first-seen digit group style (digit group mark, digit group
+ o Use the first-seen digit group style (digit group mark, digit group
sizes), if any
o Use the maximum number of decimal places of all.
- Transaction price amounts don't affect the commodity display style di-
- rectly, but occasionally they can do so indirectly (eg when a posting's
- amount is inferred using a transaction price). If you find this caus-
- ing problems, use a commodity directive to fix the display style.
+ Transaction price amounts don't affect the commodity display style
+ directly, but occasionally they can do so indirectly (eg when a post-
+ ing's amount is inferred using a transaction price). If you find this
+ causing problems, use a commodity directive to fix the display style.
In summary, each commodity's amounts will be normalised to
o the style declared by a commodity directive
- o or, the style of the first posting amount in the journal, with the
- first-seen digit group style and the maximum-seen number of decimal
+ o or, the style of the first posting amount in the journal, with the
+ first-seen digit group style and the maximum-seen number of decimal
places.
- If reports are showing amounts in a way you don't like (eg, with too
- many decimal places), use a commodity directive to set your preferred
+ If reports are showing amounts in a way you don't like (eg, with too
+ many decimal places), use a commodity directive to set your preferred
style.
Rounding
Amounts are stored internally as decimal numbers with up to 255 decimal
- places, and displayed with the number of decimal places specified by
- the commodity display style. Note, hledger uses banker's rounding: it
- rounds to the nearest even number, eg 0.5 displayed with zero decimal
- places is "0"). (Guaranteed since hledger 1.17.1; in older versions
+ places, and displayed with the number of decimal places specified by
+ the commodity display style. Note, hledger uses banker's rounding: it
+ rounds to the nearest even number, eg 0.5 displayed with zero decimal
+ places is "0"). (Guaranteed since hledger 1.17.1; in older versions
this could vary if hledger was built with Decimal < 0.5.1.)
TRANSACTION PRICES
Within a transaction, you can note an amount's price in another commod-
- ity. This can be used to document the cost (in a purchase) or selling
- price (in a sale). For example, transaction prices are useful to
- record purchases of a foreign currency. Note transaction prices are
+ ity. This can be used to document the cost (in a purchase) or selling
+ price (in a sale). For example, transaction prices are useful to
+ record purchases of a foreign currency. Note transaction prices are
fixed at the time of the transaction, and do not change over time. See
also market prices, which represent prevailing exchange rates on a cer-
tain date.
@@ -489,14 +492,14 @@ TRANSACTION PRICES
assets:euros EUR100 ; one hundred euros purchased
assets:dollars $-135 ; for $135
- 4. Like 1, but the @ is parenthesised, i.e. (@); this is for compati-
- bility with Ledger journals (Virtual posting costs), and is equiva-
+ 4. Like 1, but the @ is parenthesised, i.e. (@); this is for compati-
+ bility with Ledger journals (Virtual posting costs), and is equiva-
lent to 1 in hledger.
5. Like 2, but as in 4 the @@ is parenthesised, i.e. (@@); in hledger,
this is equivalent to 2.
- Use the -B/--cost flag to convert amounts to their transaction price's
+ Use the -B/--cost flag to convert amounts to their transaction price's
commodity, if any. (mnemonic: "B" is from "cost Basis", as in Ledger).
Eg here is how -B affects the balance report for the example above:
@@ -507,8 +510,8 @@ TRANSACTION PRICES
$-135 assets:dollars
$135 assets:euros # <- the euros' cost
- Note -B is sensitive to the order of postings when a transaction price
- is inferred: the inferred price will be in the commodity of the last
+ Note -B is sensitive to the order of postings when a transaction price
+ is inferred: the inferred price will be in the commodity of the last
amount. So if example 3's postings are reversed, while the transaction
is equivalent, -B shows something different:
@@ -521,18 +524,18 @@ TRANSACTION PRICES
EUR100 assets:euros
LOT PRICES, LOT DATES
- Ledger allows another kind of price, lot price (four variants: {UNIT-
+ Ledger allows another kind of price, lot price (four variants: {UNIT-
PRICE}, {{TOTALPRICE}}, {=FIXEDUNITPRICE}, {{=FIXEDTOTALPRICE}}),
and/or a lot date ([DATE]) to be specified. These are normally used to
- select a lot when selling investments. hledger will parse these, for
- compatibility with Ledger journals, but currently ignores them. A
- transaction price, lot price and/or lot date may appear in any order,
+ select a lot when selling investments. hledger will parse these, for
+ compatibility with Ledger journals, but currently ignores them. A
+ transaction price, lot price and/or lot date may appear in any order,
after the posting amount and before the balance assertion if any.
BALANCE ASSERTIONS
- hledger supports Ledger-style balance assertions in journal files.
- These look like, for example, = EXPECTEDBALANCE following a posting's
- amount. Eg here we assert the expected dollar balance in accounts a
+ hledger supports Ledger-style balance assertions in journal files.
+ These look like, for example, = EXPECTEDBALANCE following a posting's
+ amount. Eg here we assert the expected dollar balance in accounts a
and b after each posting:
2013/1/1
@@ -544,32 +547,32 @@ BALANCE ASSERTIONS
b $-1 =$-2
After reading a journal file, hledger will check all balance assertions
- and report an error if any of them fail. Balance assertions can pro-
- tect you from, eg, inadvertently disrupting reconciled balances while
- cleaning up old entries. You can disable them temporarily with the
+ and report an error if any of them fail. Balance assertions can pro-
+ tect you from, eg, inadvertently disrupting reconciled balances while
+ cleaning up old entries. You can disable them temporarily with the
-I/--ignore-assertions flag, which can be useful for troubleshooting or
- for reading Ledger files. (Note: this flag currently does not disable
+ for reading Ledger files. (Note: this flag currently does not disable
balance assignments, below).
Assertions and ordering
- hledger sorts an account's postings and assertions first by date and
- then (for postings on the same day) by parse order. Note this is dif-
+ hledger sorts an account's postings and assertions first by date and
+ then (for postings on the same day) by parse order. Note this is dif-
ferent from Ledger, which sorts assertions only by parse order. (Also,
- Ledger assertions do not see the accumulated effect of repeated post-
+ Ledger assertions do not see the accumulated effect of repeated post-
ings to the same account within a transaction.)
So, hledger balance assertions keep working if you reorder differently-
- dated transactions within the journal. But if you reorder same-dated
- transactions or postings, assertions might break and require updating.
+ dated transactions within the journal. But if you reorder same-dated
+ transactions or postings, assertions might break and require updating.
This order dependence does bring an advantage: precise control over the
order of postings and assertions within a day, so you can assert intra-
day balances.
Assertions and included files
- With included files, things are a little more complicated. Including
- preserves the ordering of postings and assertions. If you have multi-
- ple postings to an account on the same day, split across different
- files, and you also want to assert the account's balance on the same
+ With included files, things are a little more complicated. Including
+ preserves the ordering of postings and assertions. If you have multi-
+ ple postings to an account on the same day, split across different
+ files, and you also want to assert the account's balance on the same
day, you'll have to put the assertion in the right file.
Assertions and multiple -f options
@@ -577,9 +580,9 @@ BALANCE ASSERTIONS
-f options. Use include or concatenate the files instead.
Assertions and commodities
- The asserted balance must be a simple single-commodity amount, and in
- fact the assertion checks only this commodity's balance within the
- (possibly multi-commodity) account balance. This is how assertions
+ The asserted balance must be a simple single-commodity amount, and in
+ fact the assertion checks only this commodity's balance within the
+ (possibly multi-commodity) account balance. This is how assertions
work in Ledger also. We could call this a "partial" balance assertion.
To assert the balance of more than one commodity in an account, you can
@@ -702,51 +705,63 @@ DIRECTIVES
links to more detailed docs. Note part of this table is hidden when
viewed in a web browser - scroll it sideways to see more.
- direc- end di- subdi- purpose can affect (as of
- tive rective rec- 2018/06)
+
+ direc- end subdi- purpose can affect (as of
+ tive directive rec- 2018/06)
tives
------------------------------------------------------------------------------------
- account any document account names, de- all entries in all
- text clare account types & dis- files, before or
+ account any document account names, all entries in all
+ text declare account types & dis- files, before or
play order after
alias end rewrite account names following entries
- aliases until end of cur-
+ aliases until end of cur-
rent file or end
directive
- apply end apply prepend a common parent to following entries
- account account account names until end of cur-
+ apply end apply prepend a common parent to following entries
+ account account account names until end of cur-
rent file or end
directive
comment end com- ignore part of journal following entries
- ment until end of cur-
+ ment until end of cur-
rent file or end
directive
- commod- format declare a commodity and its number notation:
+ commod- format declare a commodity and its number notation:
ity number notation & display following entries
style in that commodity
in all files ; dis-
play style: amounts
of that commodity
in reports
- D declare a commodity to be default commodity:
- used for commodityless following commod-
- amounts, and its number no- ityless entries un-
- tation & display style til end of current
- file; number nota-
- tion: following en-
- tries in that com-
- modity until end of
- current file; dis-
- play style: amounts
- of that commodity
- in reports
+
+
+
+
+
+
+
+
+
+
+ D declare a commodity to be default commodity:
+ used for commodityless following commod-
+ amounts, and its number ityless entries
+ notation & display style until end of cur-
+ rent file; number
+ notation: following
+ entries in that
+ commodity until end
+ of current file;
+ display style:
+ amounts of that
+ commodity in
+ reports
include include entries/directives what the included
from another file directives affect
P declare a market price for a amounts of that
- commodity commodity in re-
- ports, when -V is
+ commodity commodity in
+ reports, when -V is
used
Y declare a year for yearless following entries
dates until end of cur-
@@ -759,6 +774,7 @@ DIRECTIVES
And some definitions:
+
subdi- optional indented directive line immediately following a parent
rec- directive
tive
@@ -773,8 +789,8 @@ DIRECTIVES
scope
As you can see, directives vary in which journal entries and files they
- affect, and whether they are focussed on input (parsing) or output (re-
- ports). Some directives have multiple effects.
+ affect, and whether they are focussed on input (parsing) or output
+ (reports). Some directives have multiple effects.
Directives and multiple files
If you use multiple -f/--file options, or the include directive,
@@ -813,14 +829,14 @@ DIRECTIVES
The path may contain glob patterns to match multiple files, eg: include
*.journal.
- There is limited support for recursive wildcards: **/ (the slash is re-
- quired) matches 0 or more subdirectories. It's not super convenient
+ There is limited support for recursive wildcards: **/ (the slash is
+ required) matches 0 or more subdirectories. It's not super convenient
since you have to avoid include cycles and including directories, but
this can be done, eg: include */**/*.journal.
The path may also be prefixed to force a specific file format, overrid-
- ing the file extension (as described in hledger.1 -> Input files): in-
- clude timedot:~/notes/2020*.md.
+ ing the file extension (as described in hledger.1 -> Input files):
+ include timedot:~/notes/2020*.md.
Default year
You can set a default year to be used for subsequent dates which don't
@@ -857,9 +873,9 @@ DIRECTIVES
3. It declares a commodity's display style in output - decimal and
digit group marks, number of decimal places, symbol placement etc.
- You are likely to run into one of the problems solved by commodity di-
- rectives, sooner or later, so it's a good idea to just always use them
- to declare your commodities.
+ You are likely to run into one of the problems solved by commodity
+ directives, sooner or later, so it's a good idea to just always use
+ them to declare your commodities.
A commodity directive is just the word commodity followed by an amount.
It may be written on a single line, like this:
@@ -899,15 +915,15 @@ DIRECTIVES
Default commodity
The D directive sets a default commodity, to be used for amounts with-
- out a commodity symbol (ie, plain numbers). This commodity will be ap-
- plied to all subsequent commodity-less amounts, or until the next D di-
- rective. (Note, this is different from Ledger's D.)
+ out a commodity symbol (ie, plain numbers). This commodity will be
+ applied to all subsequent commodity-less amounts, or until the next D
+ directive. (Note, this is different from Ledger's D.)
- For compatibility/historical reasons, D also acts like a commodity di-
- rective, setting the commodity's display style (for output) and decimal
- mark (for parsing input). As with commodity, the amount must always be
- written with a decimal mark (period or comma). If both directives are
- used, commodity's style takes precedence.
+ For compatibility/historical reasons, D also acts like a commodity
+ directive, setting the commodity's display style (for output) and deci-
+ mal mark (for parsing input). As with commodity, the amount must
+ always be written with a decimal mark (period or comma). If both
+ directives are used, commodity's style takes precedence.
The syntax is D AMOUNT. Eg:
@@ -920,8 +936,8 @@ DIRECTIVES
b
Declaring market prices
- The P directive declares a market price, which is an exchange rate be-
- tween two commodities on a certain date. (In Ledger, they are called
+ The P directive declares a market price, which is an exchange rate
+ between two commodities on a certain date. (In Ledger, they are called
"historical prices".) These are often obtained from a stock exchange,
cryptocurrency exchange, or the foreign exchange market.
@@ -983,20 +999,20 @@ DIRECTIVES
rect balance when reconciling.
In strict mode, enabled with the -s/--strict flag, hledger will report
- an error if any transaction uses an account name that has not been de-
- clared by an account directive. Some notes:
+ an error if any transaction uses an account name that has not been
+ declared by an account directive. Some notes:
o The declaration is case-sensitive; transactions must use the correct
account name capitalisation.
o The account directive's scope is "whole file and below" (see direc-
tives). This means it affects all of the current file, and any files
- it includes, but not parent or sibling files. The position of ac-
- count directives within the file does not matter, though it's usual
+ it includes, but not parent or sibling files. The position of
+ account directives within the file does not matter, though it's usual
to put them at the top.
- o Accounts can only be declared in journal files (but will affect in-
- cluded files in other formats).
+ o Accounts can only be declared in journal files (but will affect
+ included files in other formats).
o It's currently not possible to declare "all possible subaccounts"
with a wildcard; every account posted to must be declared.
@@ -1031,8 +1047,8 @@ DIRECTIVES
[LEDGER-STYLE SUBDIRECTIVES, IGNORED]
Account types
- hledger recognises five main types of account, corresponding to the ac-
- count classes in the accounting equation:
+ hledger recognises five main types of account, corresponding to the
+ account classes in the accounting equation:
Asset, Liability, Equity, Revenue, Expense.
@@ -1067,6 +1083,7 @@ DIRECTIVES
not need to declare account types, as they will be detected automati-
cally using the following rules:
+
If name matches regular account type is:
expression:
----------------------------------------------
@@ -1077,6 +1094,7 @@ DIRECTIVES
^(income|revenue)s?(:|$) Revenue
^expenses?(:|$) Expense
+
If account type is Asset and name does not contain regu- account type
lar expression: is:
--------------------------------------------------------------------------
@@ -1090,8 +1108,8 @@ DIRECTIVES
to prevent any confusion from mixing declared and auto-detected types.
Although it's unlikely to happen in real life, here's an example: with
the following journal, balancesheetequity shows "liabilities" in both
- Liabilities and Equity sections. Declaring another account as type:Li-
- ability would fix it:
+ Liabilities and Equity sections. Declaring another account as
+ type:Liability would fix it:
account liabilities ; type:Equity
@@ -1135,20 +1153,20 @@ DIRECTIVES
Undeclared accounts, if any, are displayed last, in alphabetical order.
- Note that sorting is done at each level of the account tree (within
- each group of sibling accounts under the same parent). And currently,
+ Note that sorting is done at each level of the account tree (within
+ each group of sibling accounts under the same parent). And currently,
this directive:
account other:zoo
- would influence the position of zoo among other's subaccounts, but not
+ would influence the position of zoo among other's subaccounts, but not
the position of other among the top-level accounts. This means:
- o you will sometimes declare parent accounts (eg account other above)
- that you don't intend to post to, just to customize their display or-
- der
+ o you will sometimes declare parent accounts (eg account other above)
+ that you don't intend to post to, just to customize their display
+ order
- o sibling accounts stay together (you couldn't display x:y in between
+ o sibling accounts stay together (you couldn't display x:y in between
a:b and a:c).
Rewriting accounts
@@ -1166,14 +1184,14 @@ DIRECTIVES
o customising reports
Account aliases also rewrite account names in account directives. They
- do not affect account names being entered via hledger add or hledger-
+ do not affect account names being entered via hledger add or hledger-
web.
See also Rewrite account names.
Basic aliases
- To set an account alias, use the alias directive in your journal file.
- This affects all subsequent journal entries in the current file or its
+ To set an account alias, use the alias directive in your journal file.
+ This affects all subsequent journal entries in the current file or its
included files. The spaces around the = are optional:
alias OLD = NEW
@@ -1181,9 +1199,9 @@ DIRECTIVES
Or, you can use the --alias 'OLD=NEW' option on the command line. This
affects all entries. It's useful for trying out aliases interactively.
- OLD and NEW are case sensitive full account names. hledger will re-
- place any occurrence of the old account name with the new one. Subac-
- counts are also affected. Eg:
+ OLD and NEW are case sensitive full account names. hledger will
+ replace any occurrence of the old account name with the new one. Sub-
+ accounts are also affected. Eg:
alias checking = assets:bank:wells fargo:checking
; rewrites "checking" to "assets:bank:wells fargo:checking", or "checking:a" to "assets:bank:wells fargo:checking:a"
@@ -1234,21 +1252,21 @@ DIRECTIVES
o aliases defined after/below the entry do not affect it.
- This gives nearby aliases precedence over distant ones, and helps pro-
- vide semantic stability - aliases will keep working the same way inde-
+ This gives nearby aliases precedence over distant ones, and helps pro-
+ vide semantic stability - aliases will keep working the same way inde-
pendent of which files are being read and in which order.
- In case of trouble, adding --debug=6 to the command line will show
+ In case of trouble, adding --debug=6 to the command line will show
which aliases are being applied when.
Aliases and multiple files
- As explained at Directives and multiple files, alias directives do not
+ As explained at Directives and multiple files, alias directives do not
affect parent or sibling files. Eg in this command,
hledger -f a.aliases -f b.journal
- account aliases defined in a.aliases will not affect b.journal. In-
- cluding the aliases doesn't work either:
+ account aliases defined in a.aliases will not affect b.journal.
+ Including the aliases doesn't work either:
include a.aliases
@@ -1269,15 +1287,15 @@ DIRECTIVES
include c.journal ; also affected
end aliases
- You can clear (forget) all currently defined aliases with the end
+ You can clear (forget) all currently defined aliases with the end
aliases directive:
end aliases
Default parent account
- You can specify a parent account which will be prepended to all ac-
- counts within a section of the journal. Use the apply account and end
- apply account directives like so:
+ You can specify a parent account which will be prepended to all
+ accounts within a section of the journal. Use the apply account and
+ end apply account directives like so:
apply account home
@@ -1293,7 +1311,7 @@ DIRECTIVES
home:food $10
home:cash $-10
- If end apply account is omitted, the effect lasts to the end of the
+ If end apply account is omitted, the effect lasts to the end of the
file. Included files are also affected, eg:
apply account business
@@ -1302,49 +1320,49 @@ DIRECTIVES
apply account personal
include personal.journal
- Prior to hledger 1.0, legacy account and end spellings were also sup-
+ Prior to hledger 1.0, legacy account and end spellings were also sup-
ported.
- A default parent account also affects account directives. It does not
- affect account names being entered via hledger add or hledger-web. If
- account aliases are present, they are applied after the default parent
+ A default parent account also affects account directives. It does not
+ affect account names being entered via hledger add or hledger-web. If
+ account aliases are present, they are applied after the default parent
account.
PERIODIC TRANSACTIONS
- Periodic transaction rules describe transactions that recur. They al-
- low hledger to generate temporary future transactions to help with
- forecasting, so you don't have to write out each one in the journal,
+ Periodic transaction rules describe transactions that recur. They
+ allow hledger to generate temporary future transactions to help with
+ forecasting, so you don't have to write out each one in the journal,
and it's easy to try out different forecasts.
- Periodic transactions can be a little tricky, so before you use them,
+ Periodic transactions can be a little tricky, so before you use them,
read this whole section - or at least these tips:
- 1. Two spaces accidentally added or omitted will cause you trouble -
+ 1. Two spaces accidentally added or omitted will cause you trouble -
read about this below.
- 2. For troubleshooting, show the generated transactions with hledger
- print --forecast tag:generated or hledger register --forecast
+ 2. For troubleshooting, show the generated transactions with hledger
+ print --forecast tag:generated or hledger register --forecast
tag:generated.
- 3. Forecasted transactions will begin only after the last non-fore-
+ 3. Forecasted transactions will begin only after the last non-fore-
casted transaction's date.
- 4. Forecasted transactions will end 6 months from today, by default.
+ 4. Forecasted transactions will end 6 months from today, by default.
See below for the exact start/end rules.
- 5. period expressions can be tricky. Their documentation needs im-
- provement, but is worth studying.
+ 5. period expressions can be tricky. Their documentation needs
+ improvement, but is worth studying.
- 6. Some period expressions with a repeating interval must begin on a
- natural boundary of that interval. Eg in weekly from DATE, DATE
- must be a monday. ~ weekly from 2019/10/1 (a tuesday) will give an
+ 6. Some period expressions with a repeating interval must begin on a
+ natural boundary of that interval. Eg in weekly from DATE, DATE
+ must be a monday. ~ weekly from 2019/10/1 (a tuesday) will give an
error.
7. Other period expressions with an interval are automatically expanded
- to cover a whole number of that interval. (This is done to improve
+ to cover a whole number of that interval. (This is done to improve
reports, but it also affects periodic transactions. Yes, it's a bit
- inconsistent with the above.) Eg: ~ every 10th day of month from
- 2020/01, which is equivalent to ~ every 10th day of month from
+ inconsistent with the above.) Eg: ~ every 10th day of month from
+ 2020/01, which is equivalent to ~ every 10th day of month from
2020/01/01, will be adjusted to start on 2019/12/10.
Periodic transaction rules also have a second meaning: they are used to
@@ -1359,17 +1377,17 @@ PERIODIC TRANSACTIONS
expenses:rent $2000
assets:bank:checking
- There is an additional constraint on the period expression: the start
- date must fall on a natural boundary of the interval. Eg monthly from
+ There is an additional constraint on the period expression: the start
+ date must fall on a natural boundary of the interval. Eg monthly from
2018/1/1 is valid, but monthly from 2018/1/15 is not.
- Partial or relative dates (M/D, D, tomorrow, last week) in the period
- expression can work (useful or not). They will be relative to today's
- date, unless a Y default year directive is in effect, in which case
+ Partial or relative dates (M/D, D, tomorrow, last week) in the period
+ expression can work (useful or not). They will be relative to today's
+ date, unless a Y default year directive is in effect, in which case
they will be relative to Y/1/1.
Two spaces between period expression and description!
- If the period expression is followed by a transaction description,
+ If the period expression is followed by a transaction description,
these must be separated by two or more spaces. This helps hledger know
where the period expression ends, so that descriptions can not acciden-
tally alter their meaning, as in this example:
@@ -1383,68 +1401,69 @@ PERIODIC TRANSACTIONS
So,
- o Do write two spaces between your period expression and your transac-
+ o Do write two spaces between your period expression and your transac-
tion description, if any.
- o Don't accidentally write two spaces in the middle of your period ex-
- pression.
+ o Don't accidentally write two spaces in the middle of your period
+ expression.
Forecasting with periodic transactions
- The --forecast flag activates any periodic transaction rules in the
- journal. They will generate temporary recurring transactions, which
- are not saved in the journal, but will appear in all reports (eg
+ The --forecast flag activates any periodic transaction rules in the
+ journal. They will generate temporary recurring transactions, which
+ are not saved in the journal, but will appear in all reports (eg
print). This can be useful for estimating balances into the future, or
- experimenting with different scenarios. Or, it can be used as a data
+ experimenting with different scenarios. Or, it can be used as a data
entry aid: describe recurring transactions, and every so often copy the
output of print --forecast into the journal.
- These transactions will have an extra tag indicating which periodic
+ These transactions will have an extra tag indicating which periodic
rule generated them: generated-transaction:~ PERIODICEXPR. And a simi-
- lar, hidden tag (beginning with an underscore) which, because it's
- never displayed by print, can be used to match transactions generated
+ lar, hidden tag (beginning with an underscore) which, because it's
+ never displayed by print, can be used to match transactions generated
"just now": _generated-transaction:~ PERIODICEXPR.
- Periodic transactions are generated within some forecast period. By
+ Periodic transactions are generated within some forecast period. By
default, this
o begins on the later of
o the report start date if specified with -b/-p/date:
- o the day after the latest normal (non-periodic) transaction in the
+ o the day after the latest normal (non-periodic) transaction in the
journal, or today if there are no normal transactions.
- o ends on the report end date if specified with -e/-p/date:, or 6
+ o ends on the report end date if specified with -e/-p/date:, or 6
months (180 days) from today.
- This means that periodic transactions will begin only after the latest
- recorded transaction. And a recorded transaction dated in the future
- can prevent generation of periodic transactions. (You can avoid that
+ This means that periodic transactions will begin only after the latest
+ recorded transaction. And a recorded transaction dated in the future
+ can prevent generation of periodic transactions. (You can avoid that
by writing the future transaction as a one-time periodic rule instead -
put tilde before the date, eg ~ YYYY-MM-DD ...).
Or, you can set your own arbitrary "forecast period", which can overlap
- recorded transactions, and need not be in the future, by providing an
- option argument, like --forecast=PERIODEXPR. Note the equals sign is
+ recorded transactions, and need not be in the future, by providing an
+ option argument, like --forecast=PERIODEXPR. Note the equals sign is
required, a space won't work. PERIODEXPR is a period expression, which
- can specify the start date, end date, or both, like in a date: query.
- (See also hledger.1 -> Report start & end date). Some examples:
+ can specify the start date, end date, or both, like in a date: query.
+ (See also hledger.1 -> Report start & end date). Some examples:
--forecast=202001-202004, --forecast=jan-, --forecast=2020.
Budgeting with periodic transactions
- With the --budget flag, currently supported by the balance command,
- each periodic transaction rule declares recurring budget goals for the
- specified accounts. Eg the first example above declares a goal of
- spending $2000 on rent (and also, a goal of depositing $2000 into
- checking) every month. Goals and actual performance can then be com-
+ With the --budget flag, currently supported by the balance command,
+ each periodic transaction rule declares recurring budget goals for the
+ specified accounts. Eg the first example above declares a goal of
+ spending $2000 on rent (and also, a goal of depositing $2000 into
+ checking) every month. Goals and actual performance can then be com-
pared in budget reports.
See also: Budgeting and Forecasting.
+
AUTO POSTINGS
- "Automated postings" or "auto postings" are extra postings which get
- added automatically to transactions which match certain queries, de-
- fined by "auto posting rules", when you use the --auto flag.
+ "Automated postings" or "auto postings" are extra postings which get
+ added automatically to transactions which match certain queries,
+ defined by "auto posting rules", when you use the --auto flag.
An auto posting rule looks a bit like a transaction:
@@ -1453,27 +1472,27 @@ AUTO POSTINGS
...
ACCOUNT [AMOUNT]
- except the first line is an equals sign (mnemonic: = suggests match-
- ing), followed by a query (which matches existing postings), and each
- "posting" line describes a posting to be generated, and the posting
+ except the first line is an equals sign (mnemonic: = suggests match-
+ ing), followed by a query (which matches existing postings), and each
+ "posting" line describes a posting to be generated, and the posting
amounts can be:
- o a normal amount with a commodity symbol, eg $2. This will be used
+ o a normal amount with a commodity symbol, eg $2. This will be used
as-is.
o a number, eg 2. The commodity symbol (if any) from the matched post-
ing will be added to this.
- o a numeric multiplier, eg *2 (a star followed by a number N). The
+ o a numeric multiplier, eg *2 (a star followed by a number N). The
matched posting's amount (and total price, if any) will be multiplied
by N.
- o a multiplier with a commodity symbol, eg *$2 (a star, number N, and
+ o a multiplier with a commodity symbol, eg *$2 (a star, number N, and
symbol S). The matched posting's amount will be multiplied by N, and
its commodity symbol will be replaced with S.
- Any query term containing spaces must be enclosed in single or double
- quotes, as on the command line. Eg, note the quotes around the second
+ Any query term containing spaces must be enclosed in single or double
+ quotes, as on the command line. Eg, note the quotes around the second
query term below:
= expenses:groceries 'expenses:dining out'
@@ -1512,24 +1531,24 @@ AUTO POSTINGS
Auto postings and multiple files
An auto posting rule can affect any transaction in the current file, or
- in any parent file or child file. Note, currently it will not affect
+ in any parent file or child file. Note, currently it will not affect
sibling files (when multiple -f/--file are used - see #1212).
Auto postings and dates
- A posting date (or secondary date) in the matched posting, or (taking
- precedence) a posting date in the auto posting rule itself, will also
+ A posting date (or secondary date) in the matched posting, or (taking
+ precedence) a posting date in the auto posting rule itself, will also
be used in the generated posting.
Auto postings and transaction balancing / inferred amounts / balance asser-
tions
Currently, auto postings are added:
- o after missing amounts are inferred, and transactions are checked for
+ o after missing amounts are inferred, and transactions are checked for
balancedness,
o but before balance assertions are checked.
- Note this means that journal entries must be balanced both before and
+ Note this means that journal entries must be balanced both before and
after auto postings are added. This changed in hledger 1.12+; see #893
for background.
@@ -1539,11 +1558,11 @@ AUTO POSTINGS
o generated-posting:= QUERY - shows this was generated by an auto post-
ing rule, and the query
- o _generated-posting:= QUERY - a hidden tag, which does not appear in
+ o _generated-posting:= QUERY - a hidden tag, which does not appear in
hledger's output. This can be used to match postings generated "just
now", rather than generated in the past and saved to the journal.
- Also, any transaction that has been changed by auto posting rules will
+ Also, any transaction that has been changed by auto posting rules will
have these tags added:
o modified: - this transaction was modified
@@ -1554,7 +1573,7 @@ AUTO POSTINGS
REPORTING BUGS
- Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel
+ Report bugs at http://bugs.hledger.org (or on the #hledger IRC channel
or hledger mail list)
@@ -1575,4 +1594,4 @@ SEE ALSO
-hledger-lib-1.20.3 December 2020 HLEDGER_JOURNAL(5)
+hledger-lib-1.20.4 December 2020 HLEDGER_JOURNAL(5)
diff --git a/hledger_timeclock.5 b/hledger_timeclock.5
index 396a90e..f502693 100644
--- a/hledger_timeclock.5
+++ b/hledger_timeclock.5
@@ -1,5 +1,5 @@
-.TH "HLEDGER_TIMECLOCK" "5" "December 2020" "hledger-lib-1.20.3 " "hledger User Manuals"
+.TH "HLEDGER_TIMECLOCK" "5" "December 2020" "hledger-lib-1.20.4 " "hledger User Manuals"
diff --git a/hledger_timeclock.info b/hledger_timeclock.info
index 9dc3958..4e13743 100644
--- a/hledger_timeclock.info
+++ b/hledger_timeclock.info
@@ -1,5 +1,5 @@
-This is hledger_timeclock.info, produced by makeinfo version 6.7 from
-stdin.
+This is hledger-lib/hledger_timeclock.info, produced by makeinfo
+version 4.8 from stdin.

File: hledger_timeclock.info, Node: Top, Up: (dir)
@@ -9,12 +9,13 @@ hledger_timeclock(5)
The time logging format of timeclock.el, as read by hledger.
- hledger can read timeclock files. As with Ledger, these are (a
-subset of) timeclock.el's format, containing clock-in and clock-out
-entries as in the example below. The date is a simple date. The time
-format is HH:MM[:SS][+-ZZZZ]. Seconds and timezone are optional. The
-timezone, if present, must be four digits and is ignored (currently the
-time is always interpreted as a local time).
+ hledger can read timeclock files. As with Ledger, these are (a subset
+of) timeclock.el's format, containing clock-in and clock-out entries as
+in the example below. The date is a simple date. The time format is
+HH:MM[:SS][+-ZZZZ]. Seconds and timezone are optional. The timezone, if
+present, must be four digits and is ignored (currently the time is
+always interpreted as a local time).
+
i 2015/03/30 09:00:00 some:account name optional description after two spaces
o 2015/03/30 09:20:00
@@ -22,9 +23,10 @@ i 2015/03/31 22:21:45 another account
o 2015/04/01 02:00:34
hledger treats each clock-in/clock-out pair as a transaction posting
-some number of hours to an account. Or if the session spans more than
-one day, it is split into several transactions, one for each day. For
-the above time log, 'hledger print' generates these journal entries:
+some number of hours to an account. Or if the session spans more than
+one day, it is split into several transactions, one for each day. For
+the above time log, `hledger print' generates these journal entries:
+
$ hledger -f t.timeclock print
2015-03-30 * optional description after two spaces
@@ -38,6 +40,7 @@ $ hledger -f t.timeclock print
Here is a sample.timeclock to download and some queries to try:
+
$ hledger -f sample.timeclock balance # current time balances
$ hledger -f sample.timeclock register -p 2009/3 # sessions in march 2009
$ hledger -f sample.timeclock register -p weekly --depth 1 --empty # time summary by week
@@ -47,17 +50,18 @@ $ hledger -f sample.timeclock register -p weekly --depth 1 --empty # time summa
* use emacs and the built-in timeclock.el, or the extended
timeclock-x.el and perhaps the extras in ledgerutils.el
- * at the command line, use these bash aliases: 'shell alias ti="echo
- i `date '+%Y-%m-%d %H:%M:%S'` \$* >>$TIMELOG" alias to="echo o
- `date '+%Y-%m-%d %H:%M:%S'` >>$TIMELOG"'
+ * at the command line, use these bash aliases: `shell alias
+ ti="echo i `date '+%Y-%m-%d %H:%M:%S'` \$* >>$TIMELOG" alias
+ to="echo o `date '+%Y-%m-%d %H:%M:%S'` >>$TIMELOG"'
- * or use the old 'ti' and 'to' scripts in the ledger 2.x repository.
+ * or use the old `ti' and `to' scripts in the ledger 2.x repository.
These rely on a "timeclock" executable which I think is just the
ledger 2 executable renamed.
+

Tag Table:
-Node: Top78
+Node: Top90

End Tag Table
diff --git a/hledger_timeclock.txt b/hledger_timeclock.txt
index a7e60d2..175b293 100644
--- a/hledger_timeclock.txt
+++ b/hledger_timeclock.txt
@@ -77,4 +77,4 @@ SEE ALSO
-hledger-lib-1.20.3 December 2020 HLEDGER_TIMECLOCK(5)
+hledger-lib-1.20.4 December 2020 HLEDGER_TIMECLOCK(5)
diff --git a/hledger_timedot.5 b/hledger_timedot.5
index ecd238f..6d06f17 100644
--- a/hledger_timedot.5
+++ b/hledger_timedot.5
@@ -1,5 +1,5 @@
-.TH "HLEDGER_TIMEDOT" "5" "December 2020" "hledger-lib-1.20.3 " "hledger User Manuals"
+.TH "HLEDGER_TIMEDOT" "5" "December 2020" "hledger-lib-1.20.4 " "hledger User Manuals"
diff --git a/hledger_timedot.info b/hledger_timedot.info
index 97adc54..c883661 100644
--- a/hledger_timedot.info
+++ b/hledger_timedot.info
@@ -1,5 +1,5 @@
-This is hledger_timedot.info, produced by makeinfo version 6.7 from
-stdin.
+This is hledger-lib/hledger_timedot.info, produced by makeinfo version
+4.8 from stdin.

File: hledger_timedot.info, Node: Top, Up: (dir)
@@ -10,58 +10,61 @@ hledger_timedot(5)
hledger's human-friendly time logging format.
Timedot is a plain text format for logging dated, categorised
-quantities (of time, usually), supported by hledger. It is convenient
+quantities (of time, usually), supported by hledger. It is convenient
for approximate and retroactive time logging, eg when the real-time
clock-in/out required with a timeclock file is too precise or too
-interruptive. It can be formatted like a bar chart, making clear at a
+interruptive. It can be formatted like a bar chart, making clear at a
glance where time was spent.
Though called "timedot", this format is read by hledger as
commodityless quantities, so it could be used to represent dated
-quantities other than time. In the docs below we'll assume it's time.
+quantities other than time. In the docs below we'll assume it's time.
- A timedot file contains a series of day entries. A day entry begins
+ A timedot file contains a series of day entries. A day entry begins
with a non-indented hledger-style simple date (Y-M-D, Y/M/D, Y.M.D..)
Any additional text on the same line is used as a transaction
description for this day.
This is followed by optionally-indented timelog items for that day,
-one per line. Each timelog item is a note, usually a
+one per line. Each timelog item is a note, usually a
hledger:style:account:name representing a time category, followed by two
-or more spaces, and a quantity. Each timelog item generates a hledger
+or more spaces, and a quantity. Each timelog item generates a hledger
transaction.
Quantities can be written as:
- * dots: a sequence of dots (.) representing quarter hours. Spaces
- may optionally be used for grouping. Eg: .... ..
+ * dots: a sequence of dots (.) representing quarter hours. Spaces may
+ optionally be used for grouping. Eg: .... ..
- * an integral or decimal number, representing hours. Eg: 1.5
+ * an integral or decimal number, representing hours. Eg: 1.5
* an integral or decimal number immediately followed by a unit symbol
- 's', 'm', 'h', 'd', 'w', 'mo', or 'y', representing seconds,
- minutes, hours, days weeks, months or years respectively. Eg: 90m.
+ `s', `m', `h', `d', `w', `mo', or `y', representing seconds,
+ minutes, hours, days weeks, months or years respectively. Eg: 90m.
The following equivalencies are assumed, currently: 1m = 60s, 1h =
60m, 1d = 24h, 1w = 7d, 1mo = 30d, 1y=365d.
+
There is some flexibility allowing notes and todo lists to be kept
right in the time log, if needed:
- * Blank lines and lines beginning with '#' or ';' are ignored.
+ * Blank lines and lines beginning with `#' or `;' are ignored.
* Lines not ending with a double-space and quantity are parsed as
items taking no time, which will not appear in balance reports by
default. (Add -E to see them.)
- * Org mode headlines (lines beginning with one or more '*' followed
+ * Org mode headlines (lines beginning with one or more `*' followed
by a space) can be used as date lines or timelog items (the stars
- are ignored). Also all org headlines before the first date line
+ are ignored). Also all org headlines before the first date line
are ignored. This means org users can manage their timelog as an
org outline (eg using org-mode/orgstruct-mode in Emacs), for
organisation, faster navigation, controlling visibility etc.
+
Examples:
+
# on this day, 6h was spent on client work, 1.5h on haskell FOSS work, etc.
2016/2/1
inc:client1 .... .... .... .... .... ....
@@ -72,16 +75,19 @@ biz:research .
inc:client1 .... ....
biz:research .
+
2016/2/3
inc:client1 4
fos:hledger 3
biz:research 1
+
* Time log
** 2020-01-01
*** adm:time .
*** adm:finance .
+
* 2020 Work Diary
** Q1
*** 2020-02-29
@@ -100,6 +106,7 @@ adm:planning: trip
Reporting:
+
$ hledger -f t.timedot print date:2016/2/2
2016-02-02 *
(inc:client1) 2.00
@@ -107,28 +114,31 @@ $ hledger -f t.timedot print date:2016/2/2
2016-02-02 *
(biz:research) 0.25
+
$ hledger -f t.timedot bal --daily --tree
Balance changes in 2016-02-01-2016-02-03:
- || 2016-02-01d 2016-02-02d 2016-02-03d
+ || 2016-02-01d 2016-02-02d 2016-02-03d
============++========================================
- biz || 0.25 0.25 1.00
- research || 0.25 0.25 1.00
- fos || 1.50 0 3.00
- haskell || 1.50 0 0
- hledger || 0 0 3.00
- inc || 6.00 2.00 4.00
- client1 || 6.00 2.00 4.00
+ biz || 0.25 0.25 1.00
+ research || 0.25 0.25 1.00
+ fos || 1.50 0 3.00
+ haskell || 1.50 0 0
+ hledger || 0 0 3.00
+ inc || 6.00 2.00 4.00
+ client1 || 6.00 2.00 4.00
------------++----------------------------------------
- || 7.75 2.25 8.00
+ || 7.75 2.25 8.00
+
+ I prefer to use period for separating account components. We can make
+this work with an account alias:
- I prefer to use period for separating account components. We can
-make this work with an account alias:
2016/2/4
fos.hledger.timedot 4
fos.ledger ..
+
$ hledger -f t.timedot --alias /\\./=: bal date:2016/2/4 --tree
4.50 fos
4.00 hledger:timedot
@@ -138,8 +148,9 @@ $ hledger -f t.timedot --alias /\\./=: bal date:2016/2/4 --tree
Here is a sample.timedot.
+

Tag Table:
-Node: Top76
+Node: Top88

End Tag Table
diff --git a/hledger_timedot.txt b/hledger_timedot.txt
index 5de20fc..f868bab 100644
--- a/hledger_timedot.txt
+++ b/hledger_timedot.txt
@@ -24,10 +24,10 @@ DESCRIPTION
tion for this day.
This is followed by optionally-indented timelog items for that day, one
- per line. Each timelog item is a note, usually a hledger:style:ac-
- count:name representing a time category, followed by two or more spa-
- ces, and a quantity. Each timelog item generates a hledger transac-
- tion.
+ per line. Each timelog item is a note, usually a
+ hledger:style:account:name representing a time category, followed by
+ two or more spaces, and a quantity. Each timelog item generates a
+ hledger transaction.
Quantities can be written as:
@@ -52,11 +52,11 @@ DESCRIPTION
(Add -E to see them.)
o Org mode headlines (lines beginning with one or more * followed by a
- space) can be used as date lines or timelog items (the stars are ig-
- nored). Also all org headlines before the first date line are ig-
- nored. This means org users can manage their timelog as an org out-
- line (eg using org-mode/orgstruct-mode in Emacs), for organisation,
- faster navigation, controlling visibility etc.
+ space) can be used as date lines or timelog items (the stars are
+ ignored). Also all org headlines before the first date line are
+ ignored. This means org users can manage their timelog as an org
+ outline (eg using org-mode/orgstruct-mode in Emacs), for organisa-
+ tion, faster navigation, controlling visibility etc.
Examples:
@@ -160,4 +160,4 @@ SEE ALSO
-hledger-lib-1.20.3 December 2020 HLEDGER_TIMEDOT(5)
+hledger-lib-1.20.4 December 2020 HLEDGER_TIMEDOT(5)