Ich habe `fzf` installiert. Was jetzt? (2023)
(andrew-quinn.me)fzfverbessert direkt nach der Installation die Suche im Ctrl+R-Befehlsverlauf mit Fuzzy Search- Mit Alt+C kann man schnell in ein altes Arbeitsverzeichnis wechseln, ohne den genauen Pfad zu kennen
- Der
fzf-Befehl lässt sich mit Command Substitution kombinieren, um ausgewählte Dateien direkt in vi, emacs oder code zu öffnen - Wenn man
find-Ergebnisse anfzfübergibt, lassen sich Konfigurationsdateien wie nginx.conf, deren Speicherort unbekannt ist, leichter finden - rg. | fzf ermöglicht es, die gewünschte Datei über Zeileninhalte statt über Dateinamen zu öffnen
Der unmittelbare Nutzen nach der Installation von fzf
- Softwareingenieure können sich leicht Werkzeuge bauen, um ihre eigene Arbeit zu verbessern, aber wenn man zwischen vielen Tools wechselt, ohne sich gründlich in sie einzuarbeiten, steigen die Kosten mit der Zeit
- Eine gute 80/20-Heuristik ist, zuerst alte Unix-Werkzeuge wie
cat,ls,cd,grepundcutzu lernen; in moderneren Rollen der Systemadministration gehören auchsedundawkdazu fzfkann als Ausnahme von dieser Heuristik gelten, weil der Effekt im Verhältnis zum Aufwand sofort spürbar ist und der Nutzen einzigartig ist- Entscheidend sind die Funktionen, die man in einer Standard-Ubuntu-Umgebung direkt nach der Installation mit dem
fzf-Installationsskript nutzen kann
Sofortige Wirkung der Standard-Tastenkürzel
-
Ctrl+R: verwandelt den Befehlsverlauf in eine Fuzzy-Suche- In den meisten Linux- und Windows-Terminals bietet
Ctrl+Reine rückwärtsgerichtete Suche im Befehlsverlauf - Das normale
Ctrl+Rbraucht eine exakte Übereinstimmung, um den gewünschten Befehl zu finden, und zeigt immer nur eine Vorschau gleichzeitig, sodass schon ein einziges falsches Zeichen das Finden erschwert - Wenn man
fzfinstalliert, werden mehrere Tastenkürzel mit besserem Verhalten überschrieben, und auchCtrl+Rwird gegenüber der bisherigen Methode stark verbessert - Bei einer Installation über Paketmanager wie
aptist diese Integration der Tastenkürzel möglicherweise nicht enthalten, was ein Grund für dasfzf-Installationsskript ist
- In den meisten Linux- und Windows-Terminals bietet
-
Alt+C: schnell in ein Verzeichnis springen, an das man sich nur vage erinnertfzfmacht ausAlt+Cein erweitertes Fuzzy-cd-Kürzel- So kann man schnell in ein Verzeichnis wechseln, wenn man sich nicht an den exakten Pfad erinnert, sondern nur ungefähr an den Namen
- Das ist nützlich, wenn man in einem leeren Terminal ein lange nicht besuchtes Repository oder Arbeitsverzeichnis wiederfinden möchte
Der fzf-Befehl selbst und die Kombination mit der Shell
-
Einfaches
fzf- Führt man den Befehl
fzfdirekt aus, durchsucht er relative Dateipfade ausgehend vom aktuellen Verzeichnis per Fuzzy Search - Für sich allein ist der Nutzen begrenzt, da man im Wesentlichen nur einen Dateipfad auswählt
- Führt 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 Spezielles für
vi; es funktioniert genauso mitemacs,nano,codeoder jedem anderen Editor
- In Kombination mit Command Substitution wie
-
vi $(find . '/' | fzf)- Kombiniert man
find . '/' | fzfmit einem Editor, kann man Konfigurationsdateien mit unbekanntem Speicherort unter allen vollständigen Pfadkandidaten per Fuzzy Search finden und öffnen - Wenn man eine Datei wie
nginx.confsucht und sich nicht mehr erinnert, wo sie liegt, muss man nicht die FHS-Kenntnisse hervorkramen, raten oder den Pfad auswendig wissen — man kann einfach diefind-Ergebnisse infzfpipen - Mit einer Suche wie
conf$kann man auf Zeilen filtern, die aufconfenden - Wenn
findauf vielePermission denied-Fehler stößt, 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 Art, Konfigurationsdateien zu finden
- Kombiniert man
-
vi **<TAB>- Aus einem Hacker-News-Kommentar von
sigmonsaysstammt die Funktion einer Fuzzy-Tab-Vervollständigung mit zwei Sternchen, die ungefähr zwischen Tastenkürzel-Überschreibung und dem direkten Ausführen vonfzfliegt vi **<TAB>kann ähnlich wievi $(fzf)verwendet werden, um eine Datei auszuwählen- Nachdem der eigentliche Befehl vervollständigt wurde, muss man noch einmal
Enterdrücken - In bash und zsh funktioniert das gut, in
fishkann es jedoch vorkommen, dass es nicht funktioniert - Wenn man sich die explizite Variante mit
$(fzf)leichter merken kann, nutzt man diese Funktion vielleicht nicht besonders oft
- 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 jeweils sehr konkrete Anhaltspunkte hat- Dabei wählt man in zwei
fzf-Durchläufen Quelle und Ziel aus - Das kann sich oft als praktisch erweisen, etwa beim Verschieben und Anordnen von Dateien wie GIFs für ein GitHub-README
- Als verwandtes Beispiel ist das README zum Interactive Mode von
finstemverlinkt
Mit rg kombiniert bis in Dateiinhalte per Fuzzy Search
-
rg: schnellesgrepmit rekursiver Suche als Standard- Die folgende Kombination ist auch mit
grepmöglich, aberrgbeziehungsweiseripgrephat hier einen Vorteil, 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 aus Dateien als Suchergebnis aus, und wenn man das anfzfübergibt, kann man alle Zeilen aller Dateien per Fuzzy Search durchsuchen- Man sucht dann nicht über Dateinamen, sondern über Zeileninhalte innerhalb der Dateien
-
rg . | fzf | cut -d ":" -f 1- Hängt man an das mit
rg . | fzfausgewählte Ergebnis nochcut -d ":" -f 1an, erhält man das erste Feld anhand des Doppelpunkts, also den Dateipfad - Das ist eine Kombination, bei der man zunächst Zeileninhalte per Fuzzy Search durchsucht und anschließend 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)kombiniert eine Fuzzy-Suche über alle Zeilen aller Dateien mit dem direkten Öffnen der Datei, die die ausgewählte Zeile enthält, invim- Wenn man sich nicht mehr an den Dateinamen erinnert, sondern nur noch an einen Teil des Inhalts, kann man so direkt im Editor weitermachen
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