Come posso mantenere lo stato di uscita del mio ultimo comando durante il ripristino del mio prompt in zsh?
Domanda
Sto cercando di creare un prompt über-semplice (singolo carattere) che mi dà più informazioni possibili. Ecco cosa ho al momento (l'ho avuto per anni, non ricordo dove ho trovato l'originale):
# RPS1="['%1v', '%2v', '%3v', '%4v', '%5v', '%6v', '%7v', '%8v', '%9v']" # debug
PS1=" %(?|%2F|%1F)%1(V|%1v|%(#|#|:))%(?|%2f|%1f) "
function zle-line-init {
zle -K vicmd
}
zle -N zle-line-init
function zle-keymap-select {
psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}"
zle reset-prompt
psvar[1]=""
}
zle -N zle-keymap-select
.
Questo è abbastanza semplice; Inizializza il prompt in modalità comando sul rendering e visualizza un prompt :
quando si è in modalità "Comando" di VI e un prompt >
(modificando psvar[1]
) quando è in modalità "Inserisci" in VI. Inoltre, il :
viene sostituito con #
se si agisce come root e il colore del carattere mostra lo stato di uscita dell'ultimo comando.
Il mio problema:
Quando la Keymap cambia (cioè quando il passaggio attraverso le modalità "Command" e "Inserire" utilizzando, come esempio, a
e quindi il tasto ESC, lo stato di uscita $?
è sovrastampato con uno stato 0
di successo, causando così il prompt di visualizzare in verde anziché rosso (anche se il comando precedente non è riuscito). Come posso salvare o impostare il prompt in modo tale che le porzioni %(?|…|…)
di $PS1
visualizzerassero correttamente lo stato di uscita dell'ultimo comando di uscita la shell ?
Soluzione
Ho ottenuto la seguente risposta da Bart Schaefer sulla mailing list zsh-users
.Funziona!
.Questo è stato fissato nel luglio 2010, quindi alla fine non dovrai fare nulla:
.* users/15217: Src/Zle/zle_main.c: use top-level status when redrawing prompt.
Nel frattempo, prova questo:
Funzione zle-keymap-Seleziona { Q= $? Psvar [1]="$ {$ {KeyMap / (Main | VIINS) />} / VICMD /}" (Restituisce $ Q) Trimpetti di reset zle psvar [1]="" }
Se il tuo ZSH è abbastanza recente da avere funzioni anonime, è possibile sostituire il subshell
(return $Q)
con(){ return $Q }
.
Altri suggerimenti
function zle-keymap-select {
local saved_exitcode=$?
psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}"
zle reset-prompt
psvar[1]=""
return $saved_exitcode
}
. oldexitcode=$?
∶
# do stuff...
∶
( exit $oldexitcode )
.