fix that terribly annoying prompt/completion conflict; make prompt work a little more consistently

This commit is contained in:
ewin 2026-03-05 01:26:56 -05:00
parent ae1fe97ef2
commit 325cdc1ca4
Signed by: erin
SSH key fingerprint: SHA256:swjoHhREbZPbWe+gyJNi24d4NAxJSyUIm3fpZj4z3wc
2 changed files with 19 additions and 24 deletions

View file

@ -6,10 +6,6 @@ setopt PROMPT_SUBST
# Hide rprompt after command execution # Hide rprompt after command execution
setopt TRANSIENT_RPROMPT setopt TRANSIENT_RPROMPT
lineup=$'\e[1A'
linedown=$'\e[1B'
newline=$'\n'
# vcs_info - used for displaying VCS information in prompt # vcs_info - used for displaying VCS information in prompt
zstyle ':vcs_info:*' actionformats '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f ' zstyle ':vcs_info:*' actionformats '%F{5}(%f%s%F{5})%F{3}-%F{5}[%F{2}%b%F{3}|%F{1}%a%F{5}]%f '
zstyle ':vcs_info:*' formats '(%b) ' zstyle ':vcs_info:*' formats '(%b) '
@ -18,22 +14,25 @@ autoload -Uz vcs_info
precmd_functions+="vcs_info" precmd_functions+="vcs_info"
# Prompt shows hostname if connected to a remote or if root # Prompt shows hostname if connected to a remote or if root
PROMPT_NORMAL="$newline%B$([ -n "$is_remote" ] || [ "$EUID" = 0 ] && echo "%F{magenta}%m%f ")%F{$([ "$EUID" = 0 ] && echo "red" || echo "\${PROMPT_NAME_COLOR:-cyan}")}%n%f %F{blue}%~%f%b \${vcs_info_msg_0_}$newline%B%#%b " prompt_host_="$([ -n "$is_remote" ] || [ "$EUID" = 0 ] && echo "%B%F{magenta}%m%f%b ")"
prompt_user_color="$([ "$EUID" = 0 ] && echo "red" || echo "\${PROMPT_NAME_COLOR:-cyan}")"
prompt_user="%B%F{$prompt_user_color}%n%f"
prompt_dir="%B%F{blue}%~%f%b"
prompt_vcs_info_="\${vcs_info_msg_0_}"
prompt_normal="$prompt_host_$prompt_user $prompt_dir $prompt_vcs_info_"$'\n'"%B%#%b "
# Also create a minimal prompt which is displayed for previously run commands # Also create a minimal prompt which is displayed for previously run commands
PROMPT_MINIMAL="%F{$([ -n "$is_remote" ] && echo "magenta" || [ "$EUID" = 0 ] && echo "red" || echo "\${PROMPT_NAME_COLOR:-cyan}")}%B%#%b%f " prompt_minimal="%B%F{$prompt_user_color}%#%f%b "
# Replace prompt with a smaller form on enter # Replace prompt with a smaller form on enter
PROMPT="$PROMPT_NORMAL" PROMPT="$prompt_normal"
function del-prompt-accept-line { function del-prompt-accept-line {
# store current prompts # store current prompts
# remove everything from left prompt except %/# # remove everything from left prompt except %/#
PROMPT="$PROMPT_MINIMAL" PROMPT="$prompt_minimal"
RPROMPT_OLD="$RPROMPT"
RPROMPT=""
zle reset-prompt zle reset-prompt
PROMPT="$PROMPT_NORMAL" PROMPT="$prompt_normal"
RPROMPT="$RPROMPT_OLD"
zle accept-line zle accept-line
} }
zle -N del-prompt-accept-line zle -N del-prompt-accept-line
@ -72,14 +71,13 @@ function build_rprompt {
else else
# Calculate elapsed real time for last command # Calculate elapsed real time for last command
now="$(date +%s.%N)" now="$(date +%s.%N)"
if [[ $(($now - $rprompt_exec_timer)) > 0.5 ]]; then delta=$(($now - $rprompt_exec_timer))
timer_show=$(($now - $rprompt_exec_timer)) if [[ $delta > 0.5 ]]; then
timer_show=$(printf '%.*f\n' 3 $timer_show) RPROMPT="took %B%F{cyan}$(printf '%.*f\n' 3 $delta)s%f%b, $RPROMPT"
RPROMPT="took %B%F{cyan}${timer_show}s%f%b, $RPROMPT"
fi fi
# if the command took a *really* long time, play a bell when it's # if the command took a *really* long time, play a bell when it's
# done # done
if [[ $(($now - $rprompt_exec_timer)) > 15 ]]; then if [[ $delta > 15 ]]; then
tput bel tput bel
fi fi
fi fi
@ -90,9 +88,6 @@ function build_rprompt {
exittime="$(print -P "$timeformat")" exittime="$(print -P "$timeformat")"
RPROMPT="$RPROMPT at $exittime" RPROMPT="$RPROMPT at $exittime"
# this is all info about the previous command, so put it up a line from the main prompt
RPROMPT="%{$lineup%}$RPROMPT%{$linedown%}"
# that's an RPROMPT! # that's an RPROMPT!
export RPROMPT export RPROMPT