Vor kurzem probiere ich ach meine Zsh aus, alles sieht gut aus, bis ich virtualevn und virtualenvwrapper probiere. Wenn ich eine virtualenv (z. B. test) aktiviere, sehe ich bei normaler bash den Namen der virtualenv wie folgt:
(test)[email protected]:
Wenn ich zu zsh gewechselt bin, kann ich den Namen der virtuellen Umgebung nicht sehen. Ich füge zwar in den Plugins von oh my zsh virtualenv und virtualenvwrapper hinzu. Ich habe auch die Aktivierungsdatei meiner Virtualenv überprüft, die Folgendes enthält:
f [ -z "${VIRTUAL_ENV_DISABLE_Prompt-}" ] ; then
_OLD_VIRTUAL_PS1="$PS1"
if [ "x" != x ] ; then
PS1="$PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`) $PS1"
fi
export PS1
fi
Liegt es daran, dass der Vergleich ["x"! = X] wahr zurückgibt?
Aktualisiert: Ich habe versucht, $ PS1 in der Aktivierungsdatei zu wiederholen, und habe folgendes erhalten:
(test) %{$fg[Magenta]%}%n%{$reset_color%}%{$fg[cyan]%}@%{$reset_color%}%{$fg[yellow]%}%m%{$reset_color%}%{$fg[red]%}:%{$reset_color%}%{$fg[cyan]%}%0~%{$reset_color%}%{$fg[red]%}|%{$reset_color%}%{$fg[cyan]%}⇒%{$reset_color%}
Es sieht so aus, als wäre die $ PS1 korrekt, aber wenn ich $ PS1 im Terminal wiederhole, ist der (Test) weg. Es scheint, dass die $ PS1 von etwas anderem überschrieben wird!
Das Problem gefunden, liegt am Thema. Das Thema, das ich in dem obigen Fall verwendet habe, ist Pygmalion. Es erlaubt Ihnen nicht, $ PS1 zu ändern.
Nachdem ich das Robbyrussell-Design geändert habe, kann ich $ PS1 im Terminal ändern, aber den Namen der virtualenv immer noch nicht sehen. Nach einer Weile des Debugging habe ich festgestellt, dass standardmäßig das Plug-In für die virtuelle Umgebung von oh my zsh die Eingabeaufforderung deaktiviert:
# disables Prompt mangling in virtual_env/bin/activate
export VIRTUAL_ENV_DISABLE_Prompt=1
Kommentieren Sie also die Zeile im virtualenv plugin aus, Problem gelöst.
Tun Sie dies in ~/.zshrc
:
plugins=(virtualenv)
POWERLEVEL9K_RIGHT_Prompt_ELEMENTS=(status virtualenv)
Vorsichtsmaßnahmen:
1 - Fügen Sie dieses Plugin zusätzlich zu anderen Plugins hinzu.
2 - Ich verwende das Thema POWERLEVEL9K. Vielleicht dein Thema
Am besten fügen Sie am Ende Ihrer Datei ~/.zshrc Folgendes hinzu:
export VIRTUAL_ENV_DISABLE_Prompt=
Dadurch wird der Wert in virtualenv.plugin.zsh überschrieben. Die Datei muss nicht geändert werden.
Gemäß diesem Leitfaden hier
Fügen Sie zunächst virtualenv
Abhängigkeit unter plugin
in Datei .zshrc
Hinzu. Wenn dies für Sie nicht funktioniert, bedeutet dies, dass das von Ihnen ausgewählte Design (oh-my-zsh-Design) den Namen der virtuellen Umgebung nicht in bash enthält Prompt, also probiere den zweiten Schritt.
Gehen Sie zur Datei ~/.oh-my-zsh/themes/YOUR_THEME_NAME.zsh-theme
und fügen Sie dies in der Basis-Eingabeaufforderung
%{$fg[green]%}$(virtualenv_Prompt_info)%{$reset_color%}%
hinzu.
NOTE: virtualenv_Prompt_info
ist der Name der Funktion, die in ~/.oh-my-zsh/plugins/virtualenv/virtualenv.plugin.zsh
deklariert ist. Wenn Ihre Plugin-Datei einen anderen Funktionsnamen hat, ändern Sie ihn entsprechend.
Oder Sie können Ihre eigene Funktion in ~/.zshrc
-Datei deklarieren, wie in diesem guide gezeigt.
Ich habe es mit diesem Link erreicht: https://askubuntu.com/a/387098
Ich reproduziere die Antwort unten.
Wie die Eingabeaufforderung geändert wird, wird im Skript bin/activate
im Verzeichnis der virtuellen Umgebung definiert. Diese Datei wird von virtualenv
aus einer Vorlage erstellt. Leider ist die einzige Möglichkeit, die von der Vorlage bereitgestellte Eingabeaufforderung zu ändern, das Voranstellen von (env name)
oder was auch immer mit --Prompt
eingestellt ist.
Um die Aufforderung in der gewünschten Weise zu ändern, würde ich vorschlagen, die Einstellung der Aufforderung in bin/activate
zu umgehen und die Definition von Prompt
in Ihrer Designdatei zu ändern.
Fügen Sie zunächst Folgendes zu Ihrem.zsh-theme
(oder .zshrc
) hinzu
export VIRTUAL_ENV_DISABLE_Prompt=yes
function virtenv_indicator {
if [[ -z $VIRTUAL_ENV ]] then
psvar[1]=''
else
psvar[1]=${VIRTUAL_ENV##*/}
fi
}
add-zsh-hook precmd virtenv_indicator
und fügen Sie %(1V.(%1v).)
vor der zweiten Zeile der Definition von Prompt
ein. Es sollte dann so aussehen:
Prompt='
%(1V.(%1v).)%{$fg_bold[grey]%}[%{$reset_color%}%{$fg_bold[${Host_color}]%}%[email protected]%m%{$reset_color%}%{$fg_bold[grey]%}]%{$reset_color%} %{$fg_bold[blue]%}%10c%{$reset_color%} $(git_Prompt_info) $(git_remote_status)
%{$fg_bold[cyan]%}❯%{$reset_color%} '
Wenn Sie etwas Farbe wünschen, können Sie beispielsweise %(1V.%{$fs_bold[yellow]%}(%1v)%{$reset_color%}.)
hinzufügen.
Erklärung :
virtenv_indicator
wird jedes Mal aufgerufen, bevor die Eingabeaufforderung erstellt wird. Es wird geprüft, ob $VIRTUAL_ENV
eingestellt und nicht leer ist. Wenn ja, setzt es das erste Element des $psvar
-Arrays auf $VIRTUAL_ENV
, wobei alles vor und der letzte /
entfernt wird (wie basename $VIRTUAL_ENV
, aber weniger teuer).
In der Definition von Prompt
%(1V.(%1v).)
wird geprüft, ob das erste Element von $psvar
gesetzt und nicht leer ist (%(1V.true-text.false-text)
), und der Inhalt dieses Elements plus einige Klammern ((%1v)
) hinzugefügt.
export VIRTUAL_ENV_DISABLE_Prompt=yes
deaktiviert alle Prompt-Einstellungen durch bin/activate
-Skripts.
Wenn Sie Conda zum Starten Ihrer virtuellen Umgebung verwenden, unterscheidet sich die Umgebungsvariable. Um den Namen der Umgebung herauszufinden, die den Namen Ihres virtuellen Namens enthält, geben Sie printenv
ein und sehen Sie sich die Ausgabe an. Für mich ist es CONDA_Prompt_MODIFIER
nachdem Sie den Namen der Variablen kennen, öffnen Sie .zshrc und fügen Sie diese Funktion hinzu
function virtualenv_info {
[ $CONDA_Prompt_MODIFIER ] && echo `basename $CONDA_Prompt_MODIFIER`
}
und darunter fügen Sie diese Zeile hinzu
Prompt="%{$fg[green]%}$(virtualenv_info)%{$reset_color%}%${Prompt}"
schließen Sie den Editor und geben Sie source .zshrc
ein.