Aqui está uma solução que usa um trabalho em segundo plano e sinaliza para atualizar o prompt de forma assíncrona.
A idéia é fazer com que sua função prompt gere um trabalho em segundo plano que construa o prompt, grave-o em um arquivo e, em seguida, envie um sinal para o shell pai que foi feito. Quando o shell pai recebe o sinal, ele lê o prompt do arquivo e redesenha o prompt.
Na sua função de prompt, coloque isso:
function async-build-prompt {
# Simulate a function that takes a couple seconds to build the prompt.
# Replace this line with your actual function.
sleep 2 && RPROMPT=$(date)
# Save the prompt in a temp file so the parent shell can read it.
printf "%s" $RPROMPT > ${TMPPREFIX}/prompt.$$
# Signal the parent shell to update the prompt.
kill --signal USR2 $$
}
# Build the prompt in a background job.
async-build-prompt &!
E no seu .zshrc, coloque isso:
function TRAPUSR2 {
RPROMPT=$(cat "${TMPPREFIX}/prompt.$$")
# Force zsh to redisplay the prompt.
zle && zle reset-prompt
}