Zsh prompt improvements
The full path to an ID folder can be long.
/Users/john/Documents/P76 Johnny's personal system/20-29 Create & collect/21 Imaginarium š§ /21.13 Flight records & boarding passes
This wraps over multiple lines in my prompt and looks messy. And most of that data is superfluous. The only thing I need is the last part, 21.13 Flight records & boarding passes. It encodes everything else.
These scripts use the environment variable standards.
Single system
If you only have one system, define JD_PATH. Drop this in ~/.zshrc.
# ā ļø Set your own path
export JD_PATH="/Users/john/Documents"
_jd_pwd() {
if [[ "$PWD" != "$JD_PATH" && "$PWD" != "$JD_PATH"/* ]]; then
echo "${PWD/#$HOME/~}"
return
fi
if [[ "$PWD" == "$JD_PATH" ]]; then
echo "~"
return
fi
local rel="${PWD#$JD_PATH/}"
local -a parts=("${(@s:/:)rel}")
local anchor_idx=0 i=1
for part in $parts; do
[[ "$part" == [0-9]* ]] && anchor_idx=$i
((i++))
done
if (( anchor_idx == 0 )); then
echo "ā¦/$rel"
else
echo "ā¦/${(j:/:)parts[$anchor_idx,-1]}"
fi
}
PROMPT='%B$(_jd_pwd)%b $ '
Multiple systems
For multiple systems, define one path per system and the prompt prefixes the system identifier.
# ā ļø Set your own paths
export JD_D25_PATH="/Users/john/Documents/D25"
export JD_P76_PATH="/Users/john/Documents/P76"
_jd_pwd() {
local system root
if [[ "$PWD" == "$JD_D25_PATH" || "$PWD" == "$JD_D25_PATH"/* ]]; then
system="D25"; root="$JD_D25_PATH"
elif [[ "$PWD" == "$JD_P76_PATH" || "$PWD" == "$JD_P76_PATH"/* ]]; then
system="P76"; root="$JD_P76_PATH"
else
echo "${PWD/#$HOME/~}"
return
fi
if [[ "$PWD" == "$root" ]]; then
echo "$system:~"
return
fi
local rel="${PWD#$root/}"
local -a parts=("${(@s:/:)rel}")
local anchor_idx=0 i=1
for part in $parts; do
[[ "$part" == [0-9]* ]] && anchor_idx=$i
((i++))
done
if (( anchor_idx == 0 )); then
echo "$system:ā¦/$rel"
else
echo "$system:ā¦/${(j:/:)parts[$anchor_idx,-1]}"
fi
}
PROMPT='%B$(_jd_pwd)%b $ '
The result
Now the prompt truncates when in an ID folder. Much nicer.
P76:ā¦/21.13 Flight records & boarding passes $
Technical note
This executes the _jd_pwd function on every prompt re-draw. But it only uses zsh built-ins, so it's basically free.