Join GitHub today
GitHub is home to over 50 million developers working together to host and review code, manage projects, and build software together.
Sign upGitHub is where the world builds software
Millions of developers and companies build, ship, and maintain their software on GitHub — the largest and most advanced development platform in the world.
| #!/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)) | |
| # 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 | |
| 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 | |
| # review change: open end of the file (if I know how) | |
| case "$EDITOR" in | |
| vi*|nvi*) "$EDITOR" +\$ "$add_file" ;; | |
| emacs) "$EDITOR" "$add_file" -f end-of-buffer ;; | |
| *) "$EDITOR" "$add_file" ;; | |
| esac |