Ich habe `fzf` installiert. Was sollte ich jetzt damit tun? (2023)
(andrew-quinn.me)- Der Kommandozeilen-Fuzzy Finder
fzfliefert einen sofort spürbaren Return on Investment und einen einzigartigen Mehrwert, aber viele Entwickler installieren das Tool nur und geben dann auf, weil sie nicht wissen, wie sie es nutzen sollen - Es kann die
Ctrl+R-Verlaufssuche durch Fuzzy Matching und mehrere Vorschauen ersetzen und so die Unbequemlichkeit der bisherigen Suche mit exakter Zeichenkettenübereinstimmung beseitigen - Mit
Alt+Cist fuzzycdmöglich, selbst wenn man sich nur vage an den Verzeichnisnamen erinnert, und mit der Kombinationvi $(fzf)lässt sich ein Workflow aufbauen, um Dateien sofort zu öffnen - In Verbindung mit
ripgrepper Pipe ist auch eine fortgeschrittene Nutzung möglich: jede Zeile in allen Dateien fuzzy durchsuchen und die betreffende Datei direkt im Editor öffnen - Ein Werkzeug mit so unmittelbarem Produktivitätsgewinn, dass es sogar die 80/20-Heuristik aushebelt, nach der man zuerst klassische Unix-Tools wie
cat,grepoderfindlernen sollte
Welchen Wert fzf direkt nach der Installation bringt
- Softwareingenieure können leicht Werkzeuge bauen, um ihre Arbeit zu verbessern, aber wenn man ständig zwischen vielen Tools wechselt und keines wirklich vertieft, steigen die Kosten mit der Zeit
- Eine gute 80/20-Heuristik ist, zuerst alte Unix-Tools wie
cat,ls,cd,grepundcutzu lernen; in moderneren Systemadministrationsrollen gehören auchsedundawkdazu fzfkann als Ausnahme zu dieser Heuristik gelten, weil der Return on Investment sofort einsetzt und sein Nutzen sehr eigenständig ist- Entscheidend sind die Funktionen, die sich in einer Standard-Ubuntu-Umgebung direkt nach der Installation mit dem
fzf-Installationsskript sofort nutzen lassen
Die unmittelbare Wirkung der Standard-Shortcuts
-
Ctrl+R: Befehlsverlauf als Fuzzy-Suche- In den meisten Linux- und Windows-Terminals bietet
Ctrl+Reine rückwärts gerichtete Suche im Befehlsverlauf - Das standardmäßige
Ctrl+Rverlangt exakte Übereinstimmung, um den gewünschten Befehl zu finden, und zeigt immer nur eine Vorschau gleichzeitig, sodass schon ein falscher Buchstabe das Auffinden erschwert - Wenn
fzfinstalliert ist, werden mehrere Tastenkürzel mit besseren Verhaltensweisen überschrieben, und auchCtrl+Rwird gegenüber der bisherigen Methode deutlich verbessert - Bei einer Installation über einen Paketmanager wie
aptist diese Integration der Shortcuts möglicherweise nicht enthalten; genau deshalb lohnt sich dasfzf-Installationsskript
- In den meisten Linux- und Windows-Terminals bietet
-
Alt+C: Schnell in ein nur halb erinnerliches Verzeichnis wechselnfzfersetztAlt+Cdurch ein erweitertes Fuzzy-cd-Kürzel- So kann man schnell dorthin wechseln, wenn man sich nicht mehr an den genauen Pfad erinnert, sondern nur noch ungefähr an den Namen des Verzeichnisses
- Das ist nützlich, wenn man in einem leeren Terminal ein Repository oder Arbeitsverzeichnis wiederfinden will, das man lange nicht besucht hat
Der Befehl fzf selbst und Shell-Kombinationen
-
Grundlegendes
fzf- Wenn man den Befehl
fzfdirekt ausführt, durchsucht er relative Dateipfade im aktuellen Verzeichnis per Fuzzy Search - Allein für sich ist der Nutzen begrenzt, weil es im Grunde nur um die Auswahl eines Dateipfads geht
- Wenn man den Befehl
-
vi $(fzf)- In Kombination mit Command Substitution wie
vi $(fzf)kann man die per Fuzzy Search ausgewählte Datei direkt im Editor öffnen - Das ist nichts Spezifisches an
vi; es funktioniert ebenso mitemacs,nano,codeoder einem beliebigen anderen Editor
- In Kombination mit Command Substitution wie
-
vi $(find . '/' | fzf)- Kombiniert man
find . '/' | fzfmit einem Editor, kann man eine Konfigurationsdatei, deren Speicherort man nicht kennt, aus einer Liste vollständiger Pfade fuzzy suchen und öffnen - Wenn man eine Datei wie
nginx.confsucht und nicht mehr weiß, wo sie liegt, muss man nicht FHS-Wissen hervorkramen oder Pfade auswendig wissen; man leitet einfach diefind-Ausgabe anfzfweiter - Mit einer Suche wie
conf$kann man auf Zeilen filtern, die aufconfenden - Wenn
findauf vielePermission denied-Fehler trifft, kannfzfkurz ins Stocken geraten, erholt sich aber nach ein paar Sekunden wieder - Diese paar Sekunden Verzögerung sind der Trade-off für die sehr einfache Methode, Konfigurationsdateien zu finden
- Kombiniert man
-
vi **<TAB>- Eine Funktion aus einem Hacker-News-Kommentar von
sigmonsays: Zwischen überschriebenen Shortcuts und dem direkten Ausführen vonfzfgibt es eine Art fuzzy Tab Completion mit zwei Sternchen vi **<TAB>kann ähnlich wievi $(fzf)zur Dateiauswahl verwendet werden- Nachdem der eigentliche Befehl vervollständigt wurde, muss man noch einmal
Enterdrücken - In bash und zsh funktioniert das gut, in
fishdagegen manchmal nicht - Wenn man sich das explizite Aufrufen von
$(fzf)leichter merken kann, nutzt man diese Funktion vielleicht nicht allzu oft
- Eine Funktion aus einem Hacker-News-Kommentar von
fzf auch zum Verschieben von Dateien
-
mv $(fzf) $(fzf)mv $(fzf) $(fzf)ist nützlich, wenn man sich weder genau daran erinnert, was verschoben werden soll, noch wohin, aber für beides sehr konkrete Hinweise im Kopf hat- Dabei wählt man in zwei
fzf-Durchläufen Quelle und Ziel aus - Bei Arbeiten wie dem Verschieben und Anordnen von Dateien, etwa um GIFs in ein GitHub-README einzubauen, kann das schnell zur Routine werden
- Als verwandtes Beispiel wird das
finstem-README zum interaktiven Modus verlinkt
Mit rg kombiniert bis in Dateiinhalte hinein fuzzy suchen
-
rg: schnellesgrepmit rekursiver Suche als Standard- Die folgende Kombination ist auch mit
grepmöglich, aberrgbzw.ripgrephat hier Vorteile, weil rekursive Suche standardmäßig aktiviert ist - Um die Beispiele nachzuvollziehen, wird empfohlen,
rgzu installieren und zu verwenden
- Die folgende Kombination ist auch mit
-
rg . | fzfrg .gibt jede Zeile der Dateien als Suchergebnis aus; leitet man das anfzfweiter, kann man jede Zeile in allen Dateien fuzzy durchsuchen- Dabei sucht man nicht anhand des Dateinamens, sondern anhand von Zeileninhalten innerhalb der Dateien
-
rg . | fzf | cut -d ":" -f 1- Hängt man an das mit
rg . | fzfausgewählte Ergebniscut -d ":" -f 1an, erhält man das erste durch Doppelpunkte getrennte Feld, also den Dateipfad - Das ist eine Kombination, mit der man zuerst Zeileninhalte fuzzy durchsucht und dann nur den Pfad der Datei erhält, die diese Zeile enthält
- Hängt man an das mit
-
vim $(rg . | fzf | cut -d ":" -f 1)vim $(rg . | fzf | cut -d ":" -f 1)durchsucht zunächst jede Zeile in allen Dateien per Fuzzy Search und öffnet dann die Datei mit der ausgewählten Zeile invim- Wenn man sich nicht an den Dateinamen erinnert, sondern nur an einen Teil des Inhalts, gelangt man so direkt weiter in den Editor
1 Kommentare
Lobste.rs-Kommentare
Ich scheine genau die Zielgruppe dieses Artikels zu sein. Ich habe fzf installiert und dachte mir „genial“, habe dann aber ständig vergessen, es tatsächlich zu benutzen — jetzt benutze ich es vielleicht doch
Mag ein guter Artikel sein, aber wenn das Ziel ist, die Frage „Was nun?“ zu beantworten, wirkt es so, als würde man mit fzf-Shell-Integration gleich eine noch engere Zielgruppe ansprechen
Ich nutze ctrl-r in bash ganz selbstverständlich, und mir zu sagen, ich solle das ersetzen, ist eine zu hohe Einstiegshürde. Lieber hätte ich zuerst gelernt, wie man dieselbe Aktion übt, ohne die Voreinstellung zu ersetzen
ctrl-r ist wahrscheinlich der Befehl, den ich am häufigsten benutze, und fzf war eine Verbesserung, die sofort ohne Lernkurve gepasst hat. Weil es über ctrl-r gestartet wird, vergesse ich auch nicht, fzf zu benutzen. Später bin ich allerdings zur Fish shell gewechselt, wo dieses Verhalten ohnehin standardmäßig vorhanden ist
Überzeugt. Ich werde bald fzf mit Shell-Integration ergänzen, und heute habe ich etwas gelernt
Wenn man Dateien für einen Befehl finden will, kann man auch die
ctrl-t-Tastenkombination verwenden. Ich nutze das oft zusammen mitgit, wenn ich Dateien für eine bestimmte Änderung auswähle, und habe es auch schon verwendet, umgrep-Ausgaben zu filtern und den Suchbereich einzugrenzenNeben der verbesserten Shell-Verlaufssuche habe ich
fzfauch mit den folgenden zwei Aliasen verwendetalias gbd='git -c color.ui=never branch | fzf | xargs -I {} git branch -D {}'Das nutze ich hauptsächlich, um lokale Branches auszuwählen, die ich nach dem Mergen von Pull Requests löschen will. Es gibt vielleicht eine bessere Methode, aber bisher ist es nie schiefgegangen
alias awp='export AWS_PROFILE="$(grep -e "\[\(.*\)\]" ~/.aws/config | sed -e "s/\[//g" | sed -e "s/\]//g" | cut -d " " -f 2 | sort -u | fzf)"'Damit kann ich AWS_PROFILE schnell anhand der Werte in
~/.aws/configumschalten. Ich überlege inzwischen, auch einen ähnlichen Alias zum Wechseln von Kubernetes-Namespaces zu bauenMit dem fzf.vim-Plugin kann man fzf in vim verwenden. Damit lässt sich nicht nur nach Dateien, sondern auch fuzzy in Buffern, im Befehlsverlauf und in Dateiinhalten suchen
Mein Hauptanwendungsfall für fzf ist das Durchsehen und Durchsuchen des linearen Git-Commit-Verlaufs, um zu verstehen, was sich zuletzt geändert hat
In meiner Standard-Git-Konfiguration ist
git fzfso definiertIch habe das Gefühl, mir entgeht etwas. Ich frage mich, warum man fzf installiert, wenn man noch gar nicht weiß, was man damit machen soll
Dazu gibt es auch einen neueren Beitrag. Ein Nutzer verwendet fzf als Dateiauswähler für jj
https://lobste.rs/s/exlogg/jjj