# zsh/.zsh/functions/jump.zsh
# Bookmark directories and jump with `j <tag>`. Stored in ~/.jump.
typeset -r JUMP_FILE="${HOME}/.jump"
[[ -f "$JUMP_FILE" ]] || touch "$JUMP_FILE"
j() {
local tag="$1"
if [[ -z "$tag" ]]; then
column -t -s $'\t' "$JUMP_FILE" | sort
return 0
fi
local dir
dir=$(awk -F'\t' -v t="$tag" '$1 == t { print $2 }' "$JUMP_FILE" | head -n1)
if [[ -z "$dir" ]]; then
print -u2 "jump: no entry for '$tag'"
return 1
fi
cd "$dir" || return 1
}
jmark() {
local tag="${1:?tag required}"
local target="${2:-$PWD}"
target="${target:A}"
# Replace any prior entry for this tag, then append.
local tmp
tmp=$(mktemp)
awk -F'\t' -v t="$tag" '$1 != t' "$JUMP_FILE" > "$tmp"
printf '%s\t%s\n' "$tag" "$target" >> "$tmp"
mv "$tmp" "$JUMP_FILE"
print "marked: $tag -> $target"
}
junmark() {
local tag="${1:?tag required}"
local tmp
tmp=$(mktemp)
awk -F'\t' -v t="$tag" '$1 != t' "$JUMP_FILE" > "$tmp"
mv "$tmp" "$JUMP_FILE"
}
compdef '_arguments "1: :_values tag $(awk -F"\t" "{print \$1}" $JUMP_FILE)"' j