configuration/local/bin/ladd

55 lines
1.9 KiB
Plaintext
Raw Normal View History

#!/bin/sh
USAGE="
$(basename $0) [-a add_file] query_files...
Copies a previous transaction to today.
Select a previous transaction by fuzzy matching on the titles. This
transaction is then copied to the end of the journal, uncleared and set
to the current date. Finally, it opens the end of the file in $EDITOR.
Bonus over 'hledger add': interactive matching it easier, and
transaction formatting is retained because it's just a copy.
add_file The transaction is appended to this file.
Default (if set): \$LEDGER_ADD_FILE
Default (otherwise): \$LEDGER_FILE
query_files A list of files to query for previous transactions.
Default: \$LEDGER_FILE
Depends on:
- fzf (https://github.com/junegunn/fzf)
- sponge (https://joeyh.name/code/moreutils/)
If you split files by year, it may be useful to alias (in 2020):
alias ladd='ladd -a .../2020/main.journal .../*/main.journal'
"
add_file="${LEDGER_ADD_FILE:-$LEDGER_FILE}"
while getopts a: f; do
case "$f" in
a) add_file="$OPTARG";;
\?) echo "$USAGE"; exit 1;;
esac
done
shift $((OPTIND - 1))
2019-11-16 19:27:53 +01:00
# fuzzy select a transaction title
selection="$(sed -n 's/....-..-..\( [*!]\)\? //p' "${@:-$LEDGER_FILE}" | sort | uniq | fzf)"
[ -z "$selection" ] && exit 0 # quit if escaped
sed -n "/....-..-..\( [*!]\)\? ${selection}\$/,/^\$/p" "${@:-$LEDGER_FILE}" | # print matching transactions
sed '${/^$/d}' | # remove trailing empty line
sed -n '/^$/{s/.*//;x;d};H;${x;p}' | # remove all before the last empty line
2020-04-15 12:34:59 +02:00
sed "s/^....-..-..\( [*!]\)\?/$(date +'%Y-%m-%d')/" | # replace date with today, remove marker
sponge -a "$add_file" # append to the file, use sponge in case it's also an input file
2019-11-16 19:50:27 +01:00
# review change: open end of the file (if I know how)
case "$EDITOR" in
2020-04-15 12:34:59 +02:00
vi*|nvi*) "$EDITOR" +\$ "$add_file" ;;
emacs) "$EDITOR" "$add_file" -f end-of-buffer ;;
*) "$EDITOR" "$add_file" ;;
2019-11-16 19:50:27 +01:00
esac