Schwierige Kumpanei: tmux, asdf, fish-shell, neovim und python venv

Heute möchte ich euch von einem Problem berichten, das ich kürzlich bei der Optimierung meiner Entwicklungsumgebung hatte. Vielleicht habt ihr ja ähnliche Erfahrungen gemacht oder könnt mir noch weitere Tipps geben.

Ich arbeite gerne mit der Fish Shell, Neovim, asdf und Python venv, sowie tmux. Das sind alles tolle Tools, die mir das Leben als Entwickler erleichtern. Aber manchmal gibt es auch Situationen, in denen sie nicht so gut zusammenarbeiten, wie ich es mir wünschen würde.

Das Problem

Das Problem, das ich hatte, war folgendes: Ich hatte innerhalb von tmux zwei Fenster in einer Session geöffnet. Im oberen Fenster hatte ich Neovim geöffnet, im unteren Fenster eine Fish-Shell, um die Sachen, die ich im Editor angepasst habe, zu testen. In beiden Fenstern hatte ich die venv-Umgebung aus diesem Verzeichnis aktiviert. Soweit so gut.

Aber sobald ich im oberen Fenster Neovim öffnete oder auch nur in dieses Fenster wechselte, wenn Neovim geöffnet war, passierte etwas Seltsames: Die venv war zwar immer noch aktiviert (zu erkennen an $VIRTUAL_ENV), aber die Pfade aus der in asdf aktivierten Python-Version hatten plötzlich Vorrang vor dem Pfad aus der venv. Und das nicht nur in dem Fenster, in dem ich Neovim benutzte, sondern auch in dem anderen Fenster. Das war natürlich sehr ärgerlich, denn ich wollte ja die Python-Version aus der venv verwenden und nicht die aus asdf.

Nach dem Verlassen von Neovim war der Pfad in dem Fenster, in dem ich eben noch Neovim ausgeführt hatte, wieder korrekt gesetzt, so dass die venv verwendet wurde. In dem unteren Fenster jedoch nicht. Ich musste also jedes Mal die venv neu aktivieren oder den Pfad manuell anpassen.

Das konnte doch nicht sein! Was war da los? Ich machte mich auf die Suche nach einer Lösung und fand heraus, dass das Problem mehrere Ursachen hatte.

Universelle Variablen

Ein Teil des Problems entstand durch Universelle Variablen. Dies ist ein Konzept für Variablen der Fish-Shell. In meiner Konfigurationsdatei (config.fish) habe ich manche Pfade mit dem Fish-Befehl fish_add_path gesetzt. Diese sind automatisch universell, das heißt, sie gelten für alle Instanzen der Fish-Shell und werden persistent gespeichert. Das ist praktisch, aber auch gefährlich, denn wenn man den Pfad ändert, wirkt sich das auf alle anderen Shells aus. Deshalb sollte man diese Funktion mit Vorsicht verwenden und lieber das -g Flag setzen, um die Variablen als global zu definieren. Das habe ich dann auch gemacht.

config.fish

Das weitere Problem bestand darin, dass die Fish-Konfigurationsdatei für jede Subshell neu ausgeführt wird. Das heißt, wenn ich eine neue Shell starte oder eine andere Anwendung aufrufe, die eine Shell verwendet (wie zum Beispiel Neovim), wird die config.fish erneut geladen. Innerhalb der config.fish wird eine von asdf bereitgestellte Datei namens asdf.fish aufgerufen. Diese Datei fügt den Pfad des asdf-Shims hinzu, der dafür sorgt, dass die richtige Version einer Programmiersprache verwendet wird. Dadurch wird aber der Pfad des asdf-Shims wieder vor den Pfad der Python-Version aus einer venv gesetzt. Das ist natürlich nicht gut.

Um das zu beheben, gibt es mehrere Möglichkeiten. Ich habe mich dazu entschieden, am Ende meiner config.fish-Datei zu prüfen, ob $VIRTUAL_ENV gesetzt ist. Falls ja, wird das entsprechende Verzeichnis, das die Binaries enthält, über fish_add_path mit der –move Option wieder an den Beginn der Path-Liste gestellt:

Das hat bei mir funktioniert und nun kann ich wieder problemlos zwischen Neovim und der Shell wechseln und die richtige Python-Version verwenden.

Ich hoffe, dieser Beitrag war für euch interessant und hilfreich. Wenn ihr Fragen oder Anregungen habt, schreibt mir gerne einen Kommentar oder eine E-Mail. Bis zum nächsten Mal!

if test -n "$VIRTUAL_ENV"
    fish_add_path -m -g $VIRTUAL_ENV/bin
end

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert