Wie kann ich den Exit-Status meines letzten Befehls beibehalten, während ich meine Eingabeaufforderung in ZSH zurücksetze?

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

  •  12-11-2019
  •  | 
  •  

Frage

Ich versuche, eine möglichst einfache (aus einem Zeichen bestehende) Eingabeaufforderung zu erstellen, die mir so viele Informationen wie möglich liefert.Folgendes habe ich im Moment (habe es schon seit Ewigkeiten, kann mich nicht erinnern, wo ich das Original gefunden habe):

# 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

Das ist ziemlich einfach;Es initialisiert die Eingabeaufforderung beim Rendern im Befehlsmodus und zeigt a an : Eingabeaufforderung im „Befehls“-Modus des VIs und a > Eingabeaufforderung (durch Ändern psvar[1]), wenn Sie sich im „Einfüge“-Modus von vi befinden.zusätzlich : wird durch ersetzt # wenn Sie als Root agieren und die Farbe des Zeichens den Exit-Status des letzten Befehls anzeigt.

Mein Problem:

Wenn sich die Tastaturbelegung ändert (d. h. wenn ich zwischen den Modi „Befehl“ und „Einfügen“ umschalte, z. B. a und dann die Escape-Taste, die $? Exit-Status wird mit Erfolg überschrieben 0 Status, wodurch die Eingabeaufforderung in Grün statt in Rot angezeigt wird (auch wenn der vorherige Befehl fehlgeschlagen ist).Wie kann ich die Eingabeaufforderung speichern oder so einstellen, dass die %(?|…|…) Teile davon $PS1 zeigt den Exit-Status des ordnungsgemäß an letzter an die Shell gesendeter Befehl?

War es hilfreich?

Lösung

Ich habe die folgende Antwort von Bart Schaefer erhalten zsh-users Mailingliste.Es klappt!

Dies wurde im Juli 2010 behoben, sodass Sie letztendlich nichts mehr tun müssen:

   * users/15217: Src/Zle/zle_main.c: use top-level status when redrawing prompt.

Versuchen Sie in der Zwischenzeit Folgendes:

function zle-keymap-select { local Q=$?psvar[1]="${${KEYMAP/(main|viins)/>}/vicmd/}" (Zurück $Q) zle reset-prompt psvar[1]="" }

Wenn Ihr ZSH aktuell genug ist, um anonyme Funktionen zu haben, können Sie die Subshell ersetzen (return $Q) mit (){ return $Q }.

Andere Tipps

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 )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top