2016-03-24 9 views
0

Hallo Ich weiß, dass Sie die Eingabeaufforderung Variable die Eingabeaufforderung wie dieseZsh Prompt Customization

export PROMPT="This is the date %d" 

bearbeiten Wie Sie einen Befehl ausführen und das Ergebnis jedes Mal gedruckt, wenn die schnellen Lasten.

+0

Es gibt in der Regel keine Notwendigkeit, eine Schalen-Konfigurationsparameter zu exportieren. 'export' stellt einen Parameter für die Umgebung von Prozessen zur Verfügung, die später gestartet werden. – Adaephon

Antwort

1

Es gibt tatsächlich zwei (Haupt-) Möglichkeiten, um dies zu erreichen:

  1. Verwenden Befehl Substitution einen Befehl als Teil der Eingabeaufforderung

    setopt promptsubst 
    PROMPT='Date %d Result $(a_command) ' 
    
    • promptsubst muss sein, laufen aktiviert, ansonsten zsh führt keine weiteren Erweiterungen, arithmetische Erweiterungen oder Befehlsersetzungen durch.
    • Der Eingabetext muss auch so notiert werden, dass die Erweiterungen nicht vorgenommen werden, wenn PROMPT eingestellt wird. Also entweder steckte es in einfache Anführungszeichen oder, wenn Sie/doppelte Anführungszeichen verwenden möchten, prepend $ mit einem \ sie getrennt zu zitieren, wo nötig:

      PROMPT="Date %d Result \$(a_command) Const $(another_command)" 
      

      Diese $(another_command) erweitert wird, wenn PROMPT Einstellung (so wird es laufen nur einmal und sein Ergebnis als dauerhaft ersetzt) ​​und $(a_command) jedes Mal, wenn die Eingabeaufforderung angezeigt wird.

  2. Nutzen Sie die precmd Funktion (oder Haken) und der psvar Array:

    autoload -Uz add-zsh-hook 
    a_function() { 
        psvar[1]=$(a_command) 
    } 
    two_function() { 
        psvar[2]=$(two_command) 
    } 
    add-zsh-hook precmd a_function 
    add-zsh-hook precmd two_function 
    PROMPT='Date %d Result1 %v Result2 %2v ' 
    
    • Wenn gesetzt, wird der precmd Funktion ausführen, kurz bevor die Eingabeaufforderung gedruckt wird. Sie können auch eine Liste von Funktionen festlegen, die im Array precmd_functions ausgeführt werden sollen.
    • add-zsh-hook bietet eine einfache Möglichkeit, Funktionen zu diesem Array hinzuzufügen.
    • %Nv in der Eingabeaufforderung wird durch das N-te Element der psvar-Array ersetzt. Wenn N bleibt aus (%v) N==1 angenommen (dies gilt auch für andere schnelle Token, die numerische Argumente)

Auf den ersten Blick das zweite Verfahren mehr weit sehen kann kompliziert dann nur promptsubst verwenden. Dies ist jedoch nur bei sehr einfachen Substitutionen der Fall. Die Verwendung von precmd ermöglicht die Verwendung komplexerer Funktionen, ohne die Definition von PROMPT unlesbar zu machen, da mehrere Codezeilen in einem $() zusammengefügt werden.

Sie können auch beide Ansätze kombinieren und die Verwendung von psvar in einigen oder allen Fällen verzichten:

autoload -Uz add-zsh-hook 
setopt promptsubst 
a_function() { 
    a_parameter=$(a_command) 
} 
two_function() { 
    psvar[2]=$(two_command) 
} 
add-zsh-hook precmd a_function 
add-zsh-hook precmd two_function 
PROMPT='Date %d Result ${a_parameter} %2v' 
+1

'$ (...)' ist * Befehl * Ersetzung. Prozesssubstitution ist etwas anderes, das normalerweise bei der E/A-Umleitung verwendet wird. – chepner

+0

Sie sind natürlich richtig. Danke für den Fang, ich habe es behoben. – Adaephon