287 lines
15 KiB
Plaintext
287 lines
15 KiB
Plaintext
|
#compdef hledger
|
||
|
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
# you may not use this file except in compliance with the License.
|
||
|
# You may obtain a copy of the License at
|
||
|
#
|
||
|
# http://www.apache.org/licenses/LICENSE-2.0
|
||
|
#
|
||
|
# Unless required by applicable law or agreed to in writing, software
|
||
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
# See the License for the specific language governing permissions and
|
||
|
# limitations under the License.
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Description
|
||
|
# -----------
|
||
|
#
|
||
|
# Completion script for hledger 1.10 ( http://hledger.org/ )
|
||
|
# Last updated: 07.08.2018
|
||
|
#
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Authors
|
||
|
# -------
|
||
|
#
|
||
|
# * Valodim ( https://github.com/Valodim )
|
||
|
# * fdw ( https://github.com/fdw )
|
||
|
#
|
||
|
# ------------------------------------------------------------------------------
|
||
|
# Notes
|
||
|
# -----
|
||
|
#
|
||
|
# account completion depends on availability of a ~/.hledger.journal file
|
||
|
#
|
||
|
# ------------------------------------------------------------------------------
|
||
|
|
||
|
|
||
|
local curcontext="$curcontext" curstate state line expl grp cmd ret=1
|
||
|
typeset -a args
|
||
|
typeset -A opt_args
|
||
|
|
||
|
args=(
|
||
|
'(- *)'{-h,--help}'[print help information]'
|
||
|
'(-f --file)'{-f,--file}'=[use a different input file]:input file:_files'
|
||
|
'--rules-file=[CSV conversion rules file]:rules file:_files'
|
||
|
'--alias=[display accounts named OLD as NEW]:alias specification'
|
||
|
'--anon=[anonymize accounts and payees]'
|
||
|
'(-b --begin)'{-b,--begin}'=[include postings/txns on or after this date]:date'
|
||
|
'(-e --end)'{-e,--end}'=[include postings/txns before this date]:date'
|
||
|
'(-D --daily)'{-D,--daily}'[multiperiod/multicolumn report by day]'
|
||
|
'(-W --weekly)'{-W,--weekly}'[multiperiod/multicolumn report by week]'
|
||
|
'(-M --monthly)'{-M,--monthly}'[multiperiod/multicolumn report by month]'
|
||
|
'(-Q --quarterly)'{-Q,--quarterly}'[multiperiod/multicolumn report by quarter]'
|
||
|
'(-Y --yearly)'{-Y,--yearly}'[multiperiod/multicolumn report by year]'
|
||
|
'(-p --period)'{-p,--period}'=[set start date, end date, and/or reporting interval all at once]'
|
||
|
'(-C --cleared)'{-C,--cleared}'[include only cleared postings/txns]'
|
||
|
'(-U --uncleared)'{-U,--uncleared}'[include only uncleared postings/txns]'
|
||
|
'(-R --real)'{-R,--real}'[include only non-virtual postings]'
|
||
|
'(--depth)--depth=[hide accounts/postings deeper than N]:depth'
|
||
|
'(-E --empty)'{-E,--empty}'[show empty/zero things which are normally omitted]'
|
||
|
'(-B --cost)'{-B,--cost}'[show amounts in their cost price'\''s commodity]'
|
||
|
'(-V --value)'{-V,--value}'[converts reported amounts to the current market value]'
|
||
|
'(-I --ignore-assertions)'{-I,--ignore-assertions}'[ignore any failing balance assertions]'
|
||
|
'--forecast=[apply periodic transaction rules to generate future transactions]'
|
||
|
)
|
||
|
|
||
|
_arguments -C "$args[@]" -A "-*" \
|
||
|
'(- *)--version[print version information]' \
|
||
|
'--debug[show debug output]' \
|
||
|
'1: :->cmds' \
|
||
|
'*:: :->args' && ret=0
|
||
|
|
||
|
while (( $#state )); do
|
||
|
curstate=$state
|
||
|
shift state
|
||
|
case $curstate in
|
||
|
cmds)
|
||
|
typeset -a cmds
|
||
|
cmds=(
|
||
|
'accounts:show account names (a)'
|
||
|
'activity:show an ascii barchart of posting counts per interval'
|
||
|
'add:prompt for transactions and add them to the journal'
|
||
|
'balance:show accounts and balances (b, bal)'
|
||
|
'balancesheet:show a balance sheet (bs)'
|
||
|
'balancesheetequity:like balancesheet, but also reports equity'
|
||
|
'cashflow:show a cashflow statement (cf)'
|
||
|
'check-dates:check that transactions are sorted by increasing date'
|
||
|
'check-dupes:report account names having the same leaf but different prefixes'
|
||
|
'close:print closing/opening transactions that bring some or all account balances to zero and back'
|
||
|
'help:show any of the hledger manuals'
|
||
|
'import:read new transactions added to each file since last run, and add them to the main journal file'
|
||
|
'incomestatement:show an income statement (is)'
|
||
|
'prices:print market price directives from the journal'
|
||
|
'print:show transaction entries (p, txns)'
|
||
|
'print-unique:print transactions which do not reuse an already-seen description'
|
||
|
'register:show postings and running total (r, reg)'
|
||
|
'register-patch:print the one posting whose transaction description is closest to the description'
|
||
|
'rewrite:print all transactions, adding custom postings to the matched ones'
|
||
|
'stats:show some journal statistics'
|
||
|
'tags:list all the tag names used in the journal'
|
||
|
'test:run built-in unit tests'
|
||
|
)
|
||
|
_describe 'subcommands' cmds && ret=0
|
||
|
;;
|
||
|
args)
|
||
|
: $words
|
||
|
local cmd=$words[1]
|
||
|
(( $+cmd )) || return 1
|
||
|
# curcontext="${curcontext%:*:*}:$service-$cmd:"
|
||
|
case $cmd in
|
||
|
accounts)
|
||
|
args=(
|
||
|
'(--declared)--declared[show account names declared with account directives]'
|
||
|
'(--used)--used[show account names posted to by transactions]'
|
||
|
'(--tree)--tree[show accounts as a tree (default in simple reports)]'
|
||
|
'(--flat)--flat[show accounts as a list (default in multicolumn)]'
|
||
|
'(--drop)--drop=[flat mode, omit N leading account name parts]:drop n'
|
||
|
)
|
||
|
;;
|
||
|
activity)
|
||
|
;;
|
||
|
add)
|
||
|
args=(
|
||
|
'(--no-new-accounts)--no-new-accounts=[do not allow creating new accounts]'
|
||
|
)
|
||
|
;;
|
||
|
bal|balance)
|
||
|
args+=(
|
||
|
'(--change)--change[show balance change in each period (default)]'
|
||
|
'(--cumulative)--cumulative[show balance change accumulated across periods]'
|
||
|
'(-H --historical)'{-H,--historical}'[show historical ending balance in each period]'
|
||
|
'(--tree)--tree[show accounts as a tree (default in simple reports)]'
|
||
|
'(--flat)--flat[show accounts as a list (default in multicolumn)]'
|
||
|
'(-A --average)'{-A,--average}'[show a row average column (in multicolumn mode)]'
|
||
|
'(-T --row-total)'{-T,--row-total}'[show a row total column]'
|
||
|
'(-N --no-total)'{-N,--no-total}'[do not show the final total row]'
|
||
|
'(--drop)--drop=[in flat mode, omit N leading account name parts]:drop n'
|
||
|
'(--no-elide)--no-elide[tree mode, do not squash boring parent accounts]'
|
||
|
'(--format)--format=[in tree mode, use this custom line format]:custom line format'
|
||
|
'(-O --output-format)'{-O,--output-format}='[select the output format from txt, csv, html]:format'
|
||
|
'(-o --output-file)'{-o,--output-file}'=[write output to file]:file'
|
||
|
'(--pretty-tables)--pretty-tables[use unicode to display prettier tables]'
|
||
|
'(--sort-amount)--sort-amount[sort by amount instead of account code/name]'
|
||
|
'(--invert)--invert[display all amounts with reversed sign]'
|
||
|
'(--budget)--budget[show performance compared to budget goals]'
|
||
|
'(--show-unbudgeted)--show-unbudgeted[with --budget, show unbudgeted accounts also]'
|
||
|
)
|
||
|
;;
|
||
|
bl|balancesheet|balancesheetequity)
|
||
|
args+=(
|
||
|
'(--change)--change[show balance change in each period (default)]'
|
||
|
'(--cumulative)--cumulative[show balance change accumulated across periods]'
|
||
|
'(-H --historical)'{-H,--historical}'[show historical ending balance in each period]'
|
||
|
'(--tree)--tree[show accounts as a tree (default in simple reports)]'
|
||
|
'(--flat)--flat[show accounts as a list (default in multicolumn)]'
|
||
|
'(-A --average)'{-A,--average}'[show a row average column (in multicolumn mode)]'
|
||
|
'(-T --row-total)'{-T,--row-total}'[show a row total column]'
|
||
|
'(-N --no-total)'{-N,--no-total}'[do not show the final total row]'
|
||
|
'(--drop)--drop=[in flat mode, omit N leading account name parts]:drop n'
|
||
|
'(--no-elide)--no-elide[tree mode, do not squash boring parent accounts]'
|
||
|
'(--format)--format=[in tree mode, use this custom line format]:custom line format'
|
||
|
'(--sort-amount)--sort-amount[sort by amount instead of account code/name]'
|
||
|
)
|
||
|
;;
|
||
|
cashflow|cf|balancesheet|bs|incomestatement|is)
|
||
|
args+=(
|
||
|
'(--change)--change[show balance change in each period (default)]'
|
||
|
'(--cumulative)--cumulative[show balance change accumulated across periods]'
|
||
|
'(-H --historical)'{-H,--historical}'[show historical ending balance in each period]'
|
||
|
'(--tree)--tree[show accounts as a tree (default in simple reports)]'
|
||
|
'(--flat)--flat[show accounts as a list (default in multicolumn)]'
|
||
|
'(-A --average)'{-A,--average}'[show a row average column (in multicolumn mode)]'
|
||
|
'(-T --row-total)'{-T,--row-total}'[show a row total column]'
|
||
|
'(-N --no-total)'{-N,--no-total}'[do not show the final total row]'
|
||
|
'(--drop)--drop=[in flat mode, omit N leading account name parts]:drop n'
|
||
|
'(--no-elide)--no-elide[tree mode, do not squash boring parent accounts]'
|
||
|
'(--format)--format=[in tree mode, use this custom line format]:custom line format'
|
||
|
'(--sort-amount)--sort-amount[sort by amount instead of account code/name]'
|
||
|
)
|
||
|
;;
|
||
|
import)
|
||
|
args=(
|
||
|
'(--dry-run)--dry-run[just show the transactions to be imported]'
|
||
|
)
|
||
|
;;
|
||
|
is|incomestatement)
|
||
|
args+=(
|
||
|
'(--change)--change[show balance change in each period (default)]'
|
||
|
'(--cumulative)--cumulative[show balance change accumulated across periods]'
|
||
|
'(-H --historical)'{-H,--historical}'[show historical ending balance in each period]'
|
||
|
'(--tree)--tree[show accounts as a tree (default in simple reports)]'
|
||
|
'(--flat)--flat[show accounts as a list (default in multicolumn)]'
|
||
|
'(-A --average)'{-A,--average}'[show a row average column (in multicolumn mode)]'
|
||
|
'(-T --row-total)'{-T,--row-total}'[show a row total column]'
|
||
|
'(-N --no-total)'{-N,--no-total}'[do not show the final total row]'
|
||
|
'(--drop)--drop=[in flat mode, omit N leading account name parts]:drop n'
|
||
|
'(--no-elide)--no-elide[tree mode, do not squash boring parent accounts]'
|
||
|
'(--format)--format=[in tree mode, use this custom line format]:custom line format'
|
||
|
'(--sort-amount)--sort-amount[sort by amount instead of account code/name]'
|
||
|
)
|
||
|
;;
|
||
|
print)
|
||
|
args=(
|
||
|
'(-m --match)'{-m,--match}'[show the transaction whose description is most similar]:string'
|
||
|
'(--new)--new[show only newer-dated transactions added in each file since last run]'
|
||
|
'(-x --explicit)'{-x,--explicit}'[show all amounts explicitly]'
|
||
|
'(-O --output-format)'{-O,--output-format}='[select the output format from txt, csv, html]:format'
|
||
|
'(-o --output-file)'{-o,--output-file}'=[write output to file]:file'
|
||
|
)
|
||
|
;;
|
||
|
register|reg)
|
||
|
args+=(
|
||
|
'(--cumulative)--cumulative[show balance change accumulated across periods]'
|
||
|
'(-H --historical)'{-H,--historical}'[show historical ending balance in each period]'
|
||
|
'(-A --average)'{-A,--average}'[show a row average column (in multicolumn mode)]'
|
||
|
'(-r --related)'{-r,--related}'[show postings'\'' siblings instead]'
|
||
|
'(-w --width)'{-w,--width}'=[set output width to 120, or N]:width (default 80)'
|
||
|
'(-O --output-format)'{-O,--output-format}='[select the output format from txt, csv, html]:format'
|
||
|
'(-o --output-file)'{-o,--output-file}'=[write output to file]:file'
|
||
|
)
|
||
|
;;
|
||
|
stats)
|
||
|
args=(
|
||
|
'(-o --output-file)'{-o,--output-file}'=[write output to file]:file'
|
||
|
)
|
||
|
;;
|
||
|
# fallback to _default
|
||
|
*) _arguments -C -A "-*" "$args[@]" \
|
||
|
'*: :_default' && ret=0
|
||
|
continue
|
||
|
esac
|
||
|
_arguments -C -A "-*" "$args[@]" \
|
||
|
'*:query patterns:->query' && ret=0
|
||
|
;;
|
||
|
query)
|
||
|
|
||
|
local -a accs keywords
|
||
|
keywords=(
|
||
|
'acct\::match account names'
|
||
|
'code\::match by transaction code'
|
||
|
'desc\::match transaction descriptions'
|
||
|
'tag\::match by tag name'
|
||
|
'depth\::match at or above depth'
|
||
|
'status\::match cleared/uncleared transactions'
|
||
|
'real\::match real/virtual transactions'
|
||
|
'empty\::match if amount is/is not zero'
|
||
|
'amt\::match transaction amount'
|
||
|
'cur\::match by currency'
|
||
|
)
|
||
|
if compset -P 'amt:'; then
|
||
|
_message 'match amount (<, <=, >, >=, add sign for non-absolute match)' && ret=0
|
||
|
continue
|
||
|
fi
|
||
|
if compset -P '(#b)(code|desc|tag|depth|status|real|empty):'; then
|
||
|
_message "'$match[1]' parameter" && ret=0
|
||
|
continue
|
||
|
fi
|
||
|
|
||
|
accs=( ${(f)"$(_call_program hledger hledger accounts $PREFIX 2>/dev/null)"} )
|
||
|
if (( $? )); then
|
||
|
_message "error fetching accounts from hledger"
|
||
|
fi
|
||
|
|
||
|
# decided against partial matching here. these lines can
|
||
|
# be uncommented to complete subaccounts hierarchically
|
||
|
# (add -S '' -q to the compadd below, too)
|
||
|
# if compset -P '(#b)(*):'; then
|
||
|
# accs=( ${(M)accs:#$match[1]:*} )
|
||
|
# accs=( ${accs#$IPREFIX} )
|
||
|
# fi
|
||
|
# accs=( ${accs%%:*} )
|
||
|
|
||
|
_wanted accounts expl "accounts" compadd -a accs && ret=0
|
||
|
_describe "matcher keywords" keywords -S '' && ret=0
|
||
|
|
||
|
# not is special, it doesn't need the -S ''
|
||
|
keywords=(
|
||
|
'not:negate expression'
|
||
|
)
|
||
|
_describe "matcher keywords" keywords && ret=0
|
||
|
|
||
|
;;
|
||
|
esac
|
||
|
done
|
||
|
|
||
|
return ret
|