Comment puis-je maintenir le statut de sortie de ma dernière commande tout en réinitialisant mon invite dans ZSH?

StackOverflow https://stackoverflow.com/questions/4965994

  •  12-11-2019
  •  | 
  •  

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?

Était-ce utile?

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 )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top