#compdef _goto function _awk { which awk &>/dev/null && awk $@ || \ which gawk &>/dev/null && gawk $@ }; function _strip_homedir { }; function _gotofile { echo $GOTO_FILE "$HOME/.labels.tsv" | _awk "{print \$1}" }; function _make_label { printf "%s %s\n" $1 $(echo $2 | tr -d "$HOME/") >> `_gotofile` }; function label { if [ "${#}" -eq 0 ]; then echo "Usage: $ label [dir]" echo " creates a label which goto can cd to" elif [ -d "${2}" ]; then _make_label "${1}" "${2}" else _make_label "${1}" "${PWD}" fi }; function goto { if [[ "${#}" -eq 0 ]]; then echo "Usage: $ goto " echo " jumps to a record set by label" elif [[ "$1" == "ls" ]]; then _awk "{ print \$1 }" `_gotofile` | column -t else dir=$(_awk "/^$1\s/ {print \$2;exit;}" `_gotofile` | head -n 1) if [[ "$dir" != "/*" ]]; then dir="${HOME}/${dir}" fi if [[ ! -e "$dir" ]]; then echo "Error: Label '$1' resolved to missing path '$dir'" else cd "$dir" fi fi }; function _goto { for label in $(_awk '{print $1}' `_gotofile`) do compadd "$@" $label done }; compdef _goto goto