51 lines
1.2 KiB
Bash
Executable File
51 lines
1.2 KiB
Bash
Executable File
#!/bin/sh
|
|
# 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.
|
|
#
|
|
# Depends on:
|
|
# - fzf (https://github.com/junegunn/fzf)
|
|
# - ed
|
|
|
|
ledger="${1:-$LEDGER_FILE}"
|
|
|
|
# fuzzy select a transaction title
|
|
selection="$(sed -n 's/....-..-..\( [*!]\)\? //p' "$ledger" | sort | uniq | fzf)"
|
|
[ -z "$selection" ] && clear && exit 0 # quit if escaped
|
|
|
|
cat <<HERE | ed --silent "$ledger"
|
|
# append a newline for easier searching
|
|
\$a
|
|
|
|
.
|
|
# yank matching transaction (closed by empty line)
|
|
?^....-..-..\( [*!]\)\? ${selection}\$?;/^\$/y
|
|
# select line below last none-empty line
|
|
$
|
|
?^..*?
|
|
+
|
|
# put transaction
|
|
x
|
|
# replace date with today
|
|
?^\$?
|
|
+s/....-..-..\( [*!]\)\?/$(date +'%Y-%m-%d')/
|
|
# delete empty lines at end and quit
|
|
/^\$/,\$d
|
|
wq
|
|
HERE
|
|
|
|
# review change: open end of the file (if I know how)
|
|
case "$EDITOR" in
|
|
vi*) "$EDITOR" +\$ "$ledger" ;;
|
|
emacs) "$EDITOR" "$ledger" -f end-of-buffer ;;
|
|
*) "$EDITOR" "$ledger" ;;
|
|
esac
|
|
|
|
clear
|