Skip to content

Instantly share code, notes, and snippets.

@oxagast
Last active September 18, 2023 03:30
Show Gist options
  • Save oxagast/0f4561fa05e16f31a9f12d95d6c48eed to your computer and use it in GitHub Desktop.
Save oxagast/0f4561fa05e16f31a9f12d95d6c48eed to your computer and use it in GitHub Desktop.
# zerweinkel zsh theme
# by: oxagast
#
# Intricate yet elegent promp that displays a context line with your current: date, time,
# working directory, current external ip address (updated every 10 seconds), hostname,
# username, pty terminal, free memory, free hard drive space on /home, and a return
# for your last command on error.
function theme_precmd {
HOSTLEN=$(hostname -f|wc -c);
IP=$(cat /tmp/.myip)
IPLEN=$(echo $IP | wc -c);
MEMF=$(free -h | head -n 2 | awk '{print $4}' | tail -n 1);
HDDF=$(df -h /home | awk '{print $3}' | tail -n 1);
MEML=$(echo $MEMF | wc -c);
HDDL=$(echo $HDDF | wc -c);
local TERMWIDTH=$(( COLUMNS - ${ZLE_RPROMPT_INDENT}+$HOSTLEN+8-$IPLEN-$MEML-$HDDL-9 ))
PR_FILLBAR=""
PR_PWDLEN=""
local promptsize=${#${(%):---(%n@%m:%l)---()--}}
local pwdsize=${#${(%):-%~}}
# Truncate the path if it's too long.
if (( promptsize + pwdsize > TERMWIDTH )); then
(( PR_PWDLEN = TERMWIDTH - promptsize ))
elif [[ "${langinfo[CODESET]}" = UTF-8 ]]; then
PR_FILLBAR="\${(l:$(( TERMWIDTH - (promptsize + pwdsize) ))::${PR_HBAR}:)}"
else
PR_FILLBAR="${PR_SHIFT_IN}\${(l:$(( TERMWIDTH - (promptsize + pwdsize) ))::${altchar[q]:--}:)}${PR_SHIFT_OUT}"
fi
}
function theme_preexec {
setopt local_options extended_glob
if [[ "$TERM" = "screen" ]]; then
local CMD=${1[(wr)^(*=*|sudo|-*)]}
echo -n "\ek$CMD\e\\"
fi
}
autoload -U add-zsh-hook
add-zsh-hook precmd theme_precmd
add-zsh-hook preexec theme_preexec
(
while [ 1 ]; do
sleep 10
curl -s ifconfig.me > /tmp/.myip
done;
) &
# Use extended characters to look nicer if supported.
if [[ "${langinfo[CODESET]}" = UTF-8 ]]; then
PR_SET_CHARSET=""
PR_HBAR="─"
PR_ULCORNER="┌"
PR_LLCORNER="└"
PR_LRCORNER="┘"
PR_URCORNER="┐"
else
typeset -g -A altchar
set -A altchar ${(s..)terminfo[acsc]}
# Some stuff to help us draw nice lines
PR_SET_CHARSET="%{$terminfo[enacs]%}"
PR_SHIFT_IN="%{$terminfo[smacs]%}"
PR_SHIFT_OUT="%{$terminfo[rmacs]%}"
PR_HBAR="${PR_SHIFT_IN}${altchar[q]:--}${PR_SHIFT_OUT}"
PR_ULCORNER="${PR_SHIFT_IN}${altchar[l]:--}${PR_SHIFT_OUT}"
PR_LLCORNER="${PR_SHIFT_IN}${altchar[m]:--}${PR_SHIFT_OUT}"
PR_LRCORNER="${PR_SHIFT_IN}${altchar[j]:--}${PR_SHIFT_OUT}"
PR_URCORNER="${PR_SHIFT_IN}${altchar[k]:--}${PR_SHIFT_OUT}"
fi
# Decide whether to set a screen title
if [[ "$TERM" = "screen" ]]; then
PR_STITLE=$'%{\ekzsh\e\\%}'
else
PR_STITLE=""
fi
# Finally, the prompt.
PROMPT='${PR_SET_CHARSET}${PR_STITLE}${(e)PR_TITLEBAR}\
${PR_GREY}${PR_ULCORNER}${PR_HBAR}${PR_GREY}(\
${PR_GREY}%${PR_PWDLEN}<...<%~%<<\
${PR_GREY})[MEM:${MEMF} HDD:${HDDF}]${PR_GREY}\
${PR_HBAR}${PR_HBAR}${(e)PR_FILLBAR}${PR_HBAR}${PR_GREY}[${IP}](\
${PR_GREY}%(!.%SROOT%s.%n)${PR_GREY}@${PR_GREY}`hostname -f`:%l\
${PR_GREY})${PR_GREY}${PR_HBAR}${PR_URCORNER}\
${PR_GREY}${PR_LLCORNER}${PR_GREY}${PR_HBAR}(\
${PR_GREY}%D{%H:%M:%S}\
${PR_GREY}%{$reset_color%}${PR_GREY})${PR_GREY}${PR_HBAR}\
${PR_HBAR}\
>${PR_NO_COLOUR} '
# display exitcode on the right when > 0
return_code="%(?..%{$fg[grey]%}%? ↵ %{$reset_color%})"
RPROMPT=' $return_code${PR_GREY}${PR_HBAR}${PR_GREY}${PR_HBAR}\
(${PR_GREY}%D{%a,%b%d}${PR_GREY})${PR_HBAR}${PR_GREY}${PR_LRCORNER}${PR_NO_COLOUR}'
PS2='${PR_GREY}${PR_HBAR}\
${PR_GREY}${PR_HBAR}(\
${PR_GREY}%_${PR_GREY})${PR_HBAR}\
${PR_GREY}${PR_HBAR}${PR_NO_COLOUR} '
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment