Come posso mantenere lo stato di uscita del mio ultimo comando durante il ripristino del mio prompt in zsh?

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

  •  12-11-2019
  •  | 
  •  

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 ?

È stato utile?

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 )
.
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top