Comment puis-je maintenir le statut de sortie de ma dernière commande tout en réinitialisant mon invite dans ZSH?
Question
J'essaie de faire une invite über-simple (à simple caractères) qui me donne autant d'informations que possible. Voici ce que j'ai pour le moment (je l'avais depuis des lustres, je ne me souviens pas où j'ai trouvé l'original):
# 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
C'est assez simple; il initialise l'invite en mode de commande sur le rendu et affiche un :
invite en mode «commande» de VI, et un >
Invite (en changeant psvar[1]
) En mode «insérer» de VI. De plus, le :
est remplacé par #
Si vous agissez comme racine et que la couleur du personnage présente l'état de sortie de la dernière commande.
Mon problème:
Lorsque le keymap change (c'est-à-dire lorsque je bascule dans les modes «commande» et «insérer» en utilisant, par exemple, a
Et puis la clé d'échappement, le $?
Exit-status est surprodable avec un succès 0
statut, ce qui fait que l'invite s'affiche en vert au lieu du rouge (même si la commande précédente a échoué). Comment puis-je enregistrer ou définir l'invite de telle sorte que le %(?|…|…)
des parties de $PS1
affichera correctement le statut de sortie du Dernière commande envoyée au shell?
La solution
J'ai obtenu la réponse suivante de Bart Schaefer sur le zsh-users
Liste de diffusion. Ça marche!
Cela a été fixé en juillet 2010, donc finalement vous n'aurez rien à faire:
* users/15217: Src/Zle/zle_main.c: use top-level status when redrawing prompt.
En attendant, essayez ceci:
fonction zle-keymap-select {local q = $? psvar [1] = "$ {$ {keymap / (main | viins) />} / vicmd /}" (return $ q) zle reset-comptpt psvar [1] = ""}
Si votre Zsh est suffisamment récent pour avoir des fonctions anonymes, vous pouvez remplacer le sous-coque
(return $Q)
avec(){ return $Q }
.
Autres conseils
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 )