zsh/.zsh/functions/jump.zsh

# 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