Die üblichen Terminal-Shells (bash, fish, zsh, usw.) bieten von Haus aus keine Unterstützung für einen schnellen Verzeichniswechsel. Dort hangelt man sich mit cd von Ordner zu Ordner. Vor vier Jahren habe ich einen Artikel über das Skript Z geschrieben, das einen schnellen Verzeichniswechsel ermöglicht. Seitdem verwende ich Z für diese Aufgabe. Nun hat im Chat jemand darauf hingewiesen, dass Z seit Jahren nicht mehr gepflegt wird und man stattdessen Zoxide verwenden kann. Mit Vorteil kann man gleich noch den Fuzzy Finder fzf installieren, da dieser bei manchen Funktionen von Zoxide verwendet wird.
Installation
Sowohl Zoxide als auch fzf sind in den Repositories der bekannten Distribution vorhanden und lassen sich mit deren Paketmanagern bequem installieren. Ich bin mir nicht sicher, ob die Installation auch einen Zusatz in der Shell-Konfiguration beinhaltet. Das lässt sich leicht nachsehen und ggf. ergänzen. Bei der Z-Shell heisst die Konfigurationsdatei .zshrc und befindet sich im Home-Verzeichnis. Für Zoxide und fzf muss dort am Ende der Datei jeweils eine Zeile eingefügt werden:
# Ralf: fast directory switch
eval "$(zoxide init zsh)"
source <(fzf --zsh)
Es lohnt sich, den Eintrag zu kommentieren, damit man später weiss, was es damit auf sich hat. Dieser Eintrag ist für jede Shell anders, weshalb ihr hier schauen solltet, wie die Ergänzung für eure Shell heisst. Gleiches gilt für den fzf Eintrag, den ihr hier findet. Danach solltet ihr das Terminal schliessen und wieder öffnen.
Funktioniert es?
Jetzt könnt ihr im Terminal testen, ob der schnelle Verzeichniswechsel funktioniert. Dazu wechselt ihr zuerst mit cd in ein paar willkürliche Verzeichnisse. Das ist nötig, damit Zoxide sich das merken und priorisieren kann. Angenommen ihr seid vorher in das Verzeichnis /home/Dokumente gewechselt, könnt ihr nun (von beliebiger Stelle im Verzeichnisbaum) das ausprobieren:
Falls ihr wissen möchtet, welche Verzeichnisse Zoxide kennt, gebt ihr das ein: zoxide edit
Bei einem z do ist nicht klar, welches Verzeichnis gemeint ist (Downloads oder Dokumente). In diesem Fall könnt ihr z do SPACE + TAB eingeben, worauf Zoxide eine Auswahl präsentiert:
Auf den Quellseiten findet ihr noch weitere Funktionen von Zoxide. Das gilt auch für den Fuzzy Finder fzf, auf den ich hier nicht näher eingehen werde. Dennoch könnt ihr testen, ob die Installation funktioniert hat. Dazu gebt ihr im Terminal fzf ein. Nun solltet ihr eine lange Liste von Dateien sehen, in denen ihr suchen könnt.
Pro Tipp
Aber Ralf, warum muss ich denn erst in jedes Verzeichnis cd'en, bevor Zoxide es kennt? Damit das Werkzeug das Ranking ermitteln kann. Ja, aber geht das nicht anders? Doch, man kann Zoxide mit Verzeichnissen anfüttern. Dafür gibt es das Kommando zoxide import. Damit kann man dem Tool eine Verzeichnisliste unterjubeln.
Doch wie erstellt man eine Verzeichnisliste? Ganz einfach, mit: find . -type d. Aber Achtung, das wollt ihr nicht, weil damit auch alle hidden-Verzeichnisse gemeint sind (die mit dem Punkt vor dem Verzeichnisnamen). Ihr wollt nicht tausende Cache-Verzeichnisse von Firefox usw. aufnehmen. Selbstverständlich kann man die hidden-Verzeichnisse ausschliessen und das Ergebnis in eine Datei schreiben. Das geht so:
find . ! -path '*/.*' -type d > verzeichnisse.txt
Das sind dann immer noch ein paar tausend Verzeichnisse. Bevor ihr diese Liste an Zoxide verfüttert, könnt ihr in die Datei schauen und entscheiden, ob ihr das wirklich möchtet. Nun wird es etwas schwierig, weil Zoxide eine Textdatei mit Verzeichnissen nicht importieren kann. Zwar gibt es das Kommando zoxide import, dort da blicke ich nicht durch. Mit dem Kommando zoxide add kann man einzelne Pfade importieren. Also basteln wir ein Shell-Skript, welches diese Aufgabe übernimmt. In der Datei verzeichnisse.txt sieht es z. B. so aus:
./Books/Aufbruch mit den Hobbits.[rtf_jpg_nfo]/Hobbit-Presse (Hrsg.) (77)
./Books/Eco_ Umberto
./Books/Eco_ Umberto/Der Name der Rose (375)
./Books/Eco_ Umberto/Wie man mit einem Lachs verreist (379)
./Books/Eco_ Umberto/Uber Gott und die Welt (371)
./Books/Eco_ Umberto/Derrick oder die Leidenschaft fur das Mittelmass (362)
Damit kann Zoxide gar nichts anfangen. Deshalb machen wir den Anfang vom Pfad vollständig und quoten den Pfad:
# den String ./ durch den String zoxide add "/home/ralf/ ersetzen
sed -i 's/\.\//zoxide add "\/home\/ralf\//g' verzeichnisse.txt
# Gänsefüsschen an das Ende jeder Zeile setzten
sed -i s/$/\"/ verzeichnisse.txt
Dann machen wir daraus ein Shell-Skript, indem wir ein #!/bin/bash in die erste Zeile setzen und die Datei umbenennen (verzeichnisse.sh) und ausführbar machen. So soll es aussehen:
#!/bin/bash
zoxide add "/home/ralf/dev"
zoxide add "/home/ralf/dev/fedigov"
zoxide add "/home/ralf/dev/fedigov/site"
Als letzten Schritt wird das Skript ausgeführt: ./verzeichnisse.sh. Dann kommt die Probe mit: z mond SPACE + TAB:
Perfekt! Die beiden ersten Verzeichnisse sind (mit 8.0) höher gerankt, weil ich diese mit z mond vor dem Screenshot aufgerufen habe.
Fazit
Zoxide ist ein guter Ersatz für das Z-Skript und wird genauso bedient wie Z. Mit dem oben vorgestellten Verfahren kann man alle gewünschten Verzeichnisse in einem Rutsch in den Index von Zoxide einlesen. Danach hat man eine umfassende Suche für den schnellen Verzeichniswechsel zur Verfügung.
Titelbild: https://pixabay.com/photos/girl-leap-clouds-pleasure-heaven-5305455/
Quellen:
https://github.com/ajeetdsouza/zoxide
https://github.com/junegunn/fzf
Wie machst du das Distro Icon in dem Powerline Prompt?
Das ist der Standard in der Manjaro Z-Shell.
"There is a utility called autojump, which was written in Python by Joël Schaerer (...), which is an advanced version of the cd command."
"
zoxide-import
- imports data from other tools - zoxide only imports paths from autojump, since its matching algorithm is too different to import the scores."ERGO: Das einzige Tool, aus dem
zoxide-import
Pfadangaben importieren kann, bzw. dessen DB, scheint hier eben diesesautojump
zu sein. Nichts von dem habe ich –bislang– getestet. Deswegen: DANKE!...Zum Thema
fzf
(etwas OT): Hier würde ich mir –halt als "GUI"– eine Integration in die "Runner" Dialoge wünschen, also für LXDElxpanelctl run
(bzw. fürLXQt
das entsprechende Gegenstück).Auf der Konsole könnte eine entsprechende "Suche" übrigens folgendermaßen funktionieren:
...aber natürlich... " ... anstatt """ ;)
Wer kein separates Programm installieren möchte, sondern mit Bordmitteln auskommen will, für denn käme Navita [0] in Frage.
[0] https://github.com/CodesOfRishi/navita/