Warum Sie fzf, den Fuzzy Finder für die Kommandozeile, benutzen sollten

von Alexey Samoshkin

Fehlende Demo gefunden

In diesem Tutorial helfe ich Ihnen, Ihre Kommandozeilengewohnheiten mit fzf auf ein neues Niveau zu bringen. Fangen Sie an, Dateien wie ein Profi zu durchsuchen. Lernen Sie weniger bekannte Funktionen kennen, wie z.B. das Wechseln des Verzeichnisses, das Durchsuchen des Befehlsverlaufs, das Nachschlagen des Hostnamens für SSH, das Beenden eines Prozesses, die sofortige Dateivorschau mit Syntaxhervorhebung und vieles mehr…

Kurzdemo

Heute werde ich Ihnen von einem Tool erzählen, das Ihr technisches Leben in ein „Vorher“ und „Nachher“ verwandeln kann. Glauben Sie mir – das ist keine Übertreibung. Darf ich Ihnen fzf vorstellen, was für Fuzzy Finder steht. Wie die Definition besagt, handelt es sich um einen universellen Fuzzy-Finder für die Befehlszeile. Das klingt nicht sehr anschaulich und attraktiv für diejenigen, die zum ersten Mal davon hören. Aber es ist ein sehr beliebtes Projekt mit rund 21.000 Sternen auf Github. Es ist also an der Zeit, den Nebel zu lichten und einen tieferen Einblick zu bekommen.

Dieser Beitrag begleitet meinen jüngsten Screencast zu diesem Thema. Wenn du also ein Mensch bist, der durch Zuschauen lernt, schau ihn dir an. Denn Tools wie fzf werden am besten mit einer Live-Demo vorgestellt und nicht mit Tonnen von Text.

Da es auf der fzfProjektseite bisher kein Demo-Video gibt, habe ich diesen Beitrag „fehlende Demo gefunden“ genannt. Aber jetzt wurde dieses Video bereits in das fzf Repo gezogen und ist Teil der Readme des Projekts geworden.

Dateien suchen

Wer an eine Kommandozeilenumgebung gewöhnt ist, ist wahrscheinlich mit dem Konzept der Unix-Filter vertraut. Dabei werden mehrere unabhängige Hilfsprogramme zu einer Pipeline zusammengefügt, um die gewünschte Ausgabe Schritt für Schritt zu erzeugen. Diese Pipeline erzeugt zum Beispiel eine Liste von Zeichenketten:

$ yes | head -10 | awk '{ print NR, NR % 2 == 0 ? "even" : "odd" }'
1 odd2 even3 odd4 even5 odd6 even7 odd8 even9 odd10 even

Jedes Programm fungiert als ein Filter. Einfach ausgedrückt ist fzf nur ein weiterer Unix-Filter. Es liest Zeilen aus stdin, startet einen interaktiven Finder-Dialog und schreibt schließlich ausgewählte Elemente nach stdout. Der entscheidende Punkt und Unterschied zu Tools wie GNU find ist sein interaktiver Finder-Dialog, der Elemente sofort während der Eingabe filtert.

„fzf“ als interaktiver Unix-Filter

Es klingt vielleicht noch nicht so praktisch, aber der primäre Anwendungsfall für fzf ist die Suche nach Dateien auf der Kommandozeile. Mit Fuzzy Matching und sofortiger Rückmeldung ist man nur wenige Zeichen davon entfernt, die richtige Datei zu finden, egal wie tief sie in der Verzeichnishierarchie verloren ist. Es ist nicht nötig, zum Dateimanager zurückzukehren, die Verzeichnishierarchie zu durchforsten, den Pfad einer Datei zu kopieren und ihn wieder in die Shell einzufügen. Vergleichen Sie die Arbeitsabläufe von „Dateimanager“ und „fzf“ unten.

fzf vs. Dateimanager im Vergleich

fzf unterstützt Fuzzy-Matching, so dass Sie einfach mehrere Zeichen in einer Reihe eingeben können und die Zeilen mit diesen Zeichen in der Zeichenkette verstreut gefunden werden. Alternativ können Sie einem Suchbegriff ein einfaches Anführungszeichen voranstellen, z. B. 'string, um nur exakte Übereinstimmungen zu erhalten, oder als fzf --exact .

unscharfe vs. exakte Übereinstimmung

Es werden keine regulären Ausdrücke oder globalen Muster unterstützt, so dass das Muster *.sh nicht funktioniert. Aber halten Sie es einfach – Produktivität und Geschwindigkeit sind heute Ihr Ziel. Sie haben keine Zeit, um korrekte reguläre Ausdrücke zusammenzustellen und einzugeben. Geben Sie stattdessen einfach mehrere Wörter oder sogar Teile von Wörtern ein, die durch ein Leerzeichen getrennt sind, und das würde >90% der Anwendungsfälle abdecken. Für die verbleibenden 10% verwenden Sie use ^ and $, um den Anfang bzw. das Ende der Zeichenkette abzugleichen, und use !, um den Abgleich zu negieren.

fzf Abgleichsyntax

Ausgewählte Dateien auf einer Kommandozeile auszudrucken ist nicht besonders nützlich, daher wird die Suche normalerweise mit einer weiteren Aktion kombiniert. Zum Beispiel könnte man sie mit Vim öffnen oder ausgewählte Elemente an das nächste Programm weiterleiten.

# Open file in a Vimvim -o `fzf`
# Print info for each selected filefzf | xargs ls -l

Fuzzy-Vervollständigung für bash und zsh

Um es bequemer zu machen, kann die Fuzzy-Vervollständigung ausgelöst werden, wenn das Wort vor dem Cursor mit der Auslösesequenz endet, die standardmäßig ** ist. Geben Sie zum Beispiel vim ~/path/** ein und drücken Sie TAB. Voilà, fzf tritt ein!

Doppelsternige unscharfe Vervollständigung

** Sequenz löst fzf Finder aus und es ähnelt *, das für native Shell-Expansion ist. Irgendwann vergisst man vielleicht sogar das Vorhandensein von fzf und bekommt den Eindruck, dass es sich um eine native Shell-Funktion handelt.

Das Format ist wie folgt, wobei FUZZY_PATTERN optional ist.

COMMAND **<TAB>

Wenn Sie die **-Sequenz nicht mögen, können Sie Tastaturkürzel verwenden. CTRL+T löst fzf aus und fügt die ausgewählte Datei in die Befehlszeile ein, während ALT+C in das ausgewählte Verzeichnis wechselt.

Verzeichnis wechseln

Ok, genug über das Suchen von Dateien. Lassen Sie uns über andere nützliche Anwendungen sprechen. Das Wechseln des Arbeitsverzeichnisses ist ein so alltäglicher Vorgang. Aber trotzdem hänge ich immer ein wenig fest, wenn ich versuche, mich an den richtigen Verzeichnispfad zu erinnern und ihn einzugeben, und mache dabei mehrere Fehler. Das verlangsamt mein Tempo. Selbst die zsh-Vervollständigung kann das nicht kompensieren. Aber mit fzf ist das Wechseln von Verzeichnissen ein Kinderspiel, egal wie tief und weit es ist. Geben Sie einfach cd ** ein und Sie sind fast am Ziel.

Der Verzeichniswechsel ist ein Kinderspiel

Beachten Sie, dass fzf Ihren Verzeichnisbaum indiziert und Sie sofort mit der Suche beginnen können. Das Wechseln von Verzeichnissen ist mein Lieblingsanwendungsfall, und Fuzzy Matching ist hier wirklich hervorragend. Es erfordert von Ihnen den gleichen Aufwand, ein Verzeichnis zu wechseln, egal ob es eine oder zehn Ebenen tief ist.

ALT+CDie Tastenkombination ist eine alternative Möglichkeit, fzf im Verzeichniswechselmodus auszulösen.

Befehlsverlauf

Sie verwenden vielleicht die Ctrl+RTastenkombination, um Ihren Befehlsverlauf zu durchsuchen. Toll, aber wie wäre es, wenn Sie diese Funktion mit dem Fuzzy Finder aufwerten? Schauen Sie und vergleichen Sie.

Suchen im Befehlsverlauf

Es fügt das ausgewählte Element in die Befehlszeile ein, so dass Sie es weiter bearbeiten können.

Suchen Sie den Hostnamen für SSH

Wenn Sie ein Backend-Entwickler sind und mit einer Reihe von Remote-Servern arbeiten, könnten Sie die ssh+fzf-Kombination zu schätzen wissen. Verwenden Sie die gleiche Doppelstern-Auslösesequenz und geben Sie ssh ** ein. Es zieht die zuletzt verwendeten IP-Adressen und Hostnamen aus Ihrem ~/.ssh/config und ruft einen interaktiven Finder auf.

„fzf + ssh“ combo

Senden Sie ein Signal an einen Prozess

Manchmal wollen wir ein Signal an einen Prozess senden, aber zuerst müssen wir seine PID mit Namen erhalten. Normalerweise benutzt man pgrep <process_name>, um die PID aufzulösen, gefolgt von by a kill <process_pid>, das sich auf dieset PID bezieht. Mit fzf können Sie die Schritte steps. Type kill <TAB> und fzf kombinieren, um alle Ihre Prozesse aufzulisten. Sie müssen nicht mehr zu einem speziellen Prozessmonitor wechseln, wie z.B. „Activity Monitor“ auf dem Mac.

Einen Prozess finden und ein Signal senden

Dateien während der Suche ansehen

Angenommen, Sie suchen nach Dateien, aber manchmal sagt Ihnen der Dateiname selbst nicht genug. Daher möchten Sie vielleicht einen kurzen Blick auf den Inhalt einer Datei werfen, um eine Entscheidung zu treffen. fzfDas gilt auch hier.

Vorschaufenster

Standardmäßig ist das Vorschaufenster ausgeschaltet, aber ich schalte es ein, wenn ich einen Blick in die Dateien werfen möchte. Außerdem habe ich es mit einer farbigen Ausgabe und Syntaxhervorhebung verbessert, indem ich bat als Vorschau-Befehl verwendet habe.

Anpassung

Es gibt zwei Hauptmöglichkeiten, die Standardversion von fzf anzupassen:

  • Ändern Sie das Verhalten des Finder-Dialogs (Vorschaufenster, Tastenkombinationen, Abmessungen, benutzerdefinierte Aktionen usw.). Siehe FZF_DEFAULT_OPTS Umgebungsvariable.
  • Ändern Sie das zugrundeliegende Such-Backend. Standardmäßig wird das GNU find Utility verwendet, aber Sie können zu den fortgeschritteneren Tools wie fd oder ripgrep wechseln. Erstens ist es schneller als das Standardprogramm find. Zweitens respektieren diese Werkzeuge die .gitignore-Regeln, so dass Sie keine node_modules– oder .git-Dateien in Ihren Suchergebnissen erhalten. Sie können auch git ls-tree verwenden, um Dateien aufzulisten, wenn Sie sich in einem Git Repo befinden. Siehe FZF_DEFAULT_COMMAND Umgebungsvariable.

Die Konfiguration erfolgt über die Umgebungsvariablen. Hier ist der Schnipsel aus meinem Setup. Ich bin mir nicht sicher, ob es so funktioniert, wenn ich es kopiere und einfüge, wahrscheinlich fehlen noch andere Abhängigkeiten. Aber das ist nur, um Ihnen eine Vorstellung davon zu geben, wie die Konfiguration aussieht.

Fzf und Vim

Bis jetzt haben wir nur die Verwendung der Kommandozeile gesehen. Aber fzf wird auch als Vim-Plugin ausgeliefert. Und glauben Sie mir, wenn Sie ein Vimmer sind, lohnt es sich, es zu Ihrem vimrc hinzuzufügen. Die Verwendung von Vim fällt nicht in den Rahmen dieses Beitrags, sonst würde ihn niemand lesen ? Aber ich spreche ausführlich darüber im zweiten Teil meines Videos, das auch am Anfang des Beitrags verlinkt ist.

Wenn Sie ungeduldig sind, hier ein kleiner Auszug, um Ihre Aufmerksamkeit zu erregen. Verwenden Sie den :grep-Befehl für die projektweite Textsuche, öffnen Sie die Treffer im fzf-Fenster im Vollbildmodus, filtern Sie die Treffer innerhalb von fzf weiter und springen Sie zu dem ausgewählten Treffer. Und vergessen Sie nicht die sofortige Dateivorschau an der genauen Zeilenposition. Das ist großartig, nicht wahr?

fzf ❤️ vim

Abschluss

Ich hoffe, du bist beeindruckt, wie super großartig fzf ist. Wahrscheinlich bist du schon bereit, es zu installieren und auszuprobieren.

Denke daran, dass fzf nicht nur für die Dateisuche gedacht ist, obwohl das die Hauptfunktion ist. Wie Sie sehen können, ist „Suche + Aktion“ ein allgemeines Prinzip, aber es ist abstrakt und mächtig genug, um mit jeder Art von Liste zu arbeiten: Dateien, Verzeichnisse, Prozesse, Hostnamen, etc. Erinnern Sie sich an den Anfang dieses Beitrags – fzf ist nur ein Unix-Filter. Lassen Sie Ihrer Phantasie freien Lauf, füttern Sie es mit jeder beliebigen Liste und passen Sie es an Ihre eigenen Bedürfnisse an. Sie können sich von einer Fülle von Beispielen inspirieren lassen.

BTW, schätzen Sie, wie überlegen die Unix-Philosophie ist. fzf ist ein großartiges Beispiel für ein Programm, das sich an diese Prinzipien hält.

  • Lassen Sie das Programm eine Sache tun und tun Sie sie gut (Prinzip der einzigen Verantwortung)
  • Machen Sie es abstrakt genug, um sich nicht um irrelevante Details oder Datentypen kümmern zu müssen
  • Zusammensetzen Sie separate Einzelprogramme unter Verwendung von gut definierten Standardschnittstellen.

Halten Sie sich in Ihrer Karriere als Softwareentwickler an diese Prinzipien. Die Kenntnis grundlegender Prinzipien, die hinter dem schnellen Entstehen und Sterben zahlreicher Tools, Sprachen und Frameworks stehen, unterscheidet professionelle Entwickler von Amateuren.

Ressourcen

junegunn/fzf: A command-line fuzzy finder – https://github.com/junegunn/fzf

Vim universe. fzf – command line fuzzy finder – YouTube – https://www.youtube.com/watch?v=qgG5Jhi_Els

My Youtube channel. Es gibt nur ein paar Videos, da ich meine ersten Schritte in der Erstellung von Screencasts mache. Habt Geduld, ich verspreche, dass ich mehr Videos machen werde. Alexey Samoshkin – Youtube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Eine einfache, schnelle und benutzerfreundliche Alternative zu ‚find‘ – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep durchsucht Verzeichnisse rekursiv nach einem Regexmuster – https://github.com/BurntSushi/ripgrep

junegunn/fzf.vim: fzf vim – https://github.com/junegunn/fzf.vim

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.