^ C bewirkt, dass PROMPT = '$ (my_prompt_function)' niemals - zsh aufgerufen wird

Ich versuche eine komplexere Funktion auszuführenDas erstellt den PROMPT-String in ZSH und funktioniert unter normalen Umständen. Da ich jedoch den folgenden TRAPINT habe, um "^ C" zu drucken, wenn ich SIGINT an der Eingabeaufforderung sende, funktioniert es nicht (es ruft meine Funktion nicht auf).

.zshrc

TRAPINT() {
print -n "^C"
return $(( 128 + $1 ))
}
my_prompt_function() {
echo ">"
}
setopt PROMPT_SUBST
PROMPT="$(my_prompt_function)"

Wenn ich jedoch drücke ^ C an der Eingabeaufforderung hängt es nur:

>
>^C
# ...hangs here until I press <Enter>

Wie kann ich in TRAPINT feststellen, dass ich an der Eingabeaufforderung im Vergleich zu einem laufenden Programm bin, sodass ich keinen Fehler zurĂĽckgeben kann?

Antworten:

1 fĂĽr Antwort â„– 1

Es scheint, dass die Befehlsersetzung nicht ausgewertet wird, nachdem die Shell auf diese Weise unterbrochen wurde.

Sie können es umgehen, indem Sie die precmd Haken:

precmd () {
MYPROMPT=">"
}
setopt PROMPT_SUBST
PROMPT="${MYPROMPT}"

precmd wird vor jeder Eingabeaufforderung ausgefĂĽhrt. Beachten Sie, dass precmd wird nicht erneut ausgefĂĽhrt, wenn die Eingabeaufforderung nur ohne AusfĂĽhren einer Befehlszeile neu gezeichnet wird (wie in diesem Fall). Es funktioniert immer noch als der Wert von MYPROMPT bleibt auch ohne rennen precmd.


  • Sie können auch mehrere haben precmd funktionen. Sie können sie mit dem verwalten add-zsh-hook Modul:

    autoload -Uz add-zsh-hook
    myprompt_function () {
    MYPROMPT=">"
    }
    add-zsh-hook precmd myprompt_function
    setopt PROMPT_SUBST
    PROMPT="${MYPROMPT}"
    
  • Sie können auch die spezielle Array-Variable verwenden psvarAuf deren Mitglieder kann mit dem Prompt-Escape zugegriffen werden %v oder %Nv woher N ist der anzuzeigende Array-Index:

    precmd () {
    psvar[3]=">"
    }
    PROMPT="%3v"
    

0 fĂĽr Antwort â„– 2

Ich akzeptiere die Antwort von Adaephon, poste aber hier, um meine endgültige Lösung zu zeigen:

TRAPINT() {
if [ "$IS_PROMPTING" == true ]; then
print -n "^C"
return $(( 128 + $1 ))
fi
}
precmd() {
IS_PROMPTING=true
PROMPT=$(command-that-generates-prompt-string)
}
preexec() {
IS_PROMPTING=false
}

TRAPINT prĂĽft unter bestimmten Bedingungen, ob der Benutzer an der Eingabeaufforderung oder innerhalb eines AusfĂĽhrungsbefehls ist, und zwar ĂĽber ein Flag, das ĂĽber precmd / preexec entsprechend gesetzt ist.


Lies jetzt