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…
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 fzf
Projektseite 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.
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
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
.
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 us
e ^ an
d $, um den Anfang bzw. das Ende der Zeichenkette abzugleichen, und us
e !, um den Abgleich zu negieren.
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!
**
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.
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+C
Die Tastenkombination ist eine alternative Möglichkeit, fzf
im Verzeichniswechselmodus auszulösen.
Befehlsverlauf
Sie verwenden vielleicht die Ctrl+R
Tastenkombination, 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.
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.
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_na
me>, um die PID aufzulösen, gefolgt von by a kill <pro
cess_pid>, das sich auf dieset P
ID bezieht. Mit fzf können Sie die Schritte steps. Typ
e 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.
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. fzf
Das gilt auch hier.
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 Standardprogrammfind
. Zweitens respektieren diese Werkzeuge die.gitignore
-Regeln, so dass Sie keinenode_modules
– oder.git
-Dateien in Ihren Suchergebnissen erhalten. Sie können auchgit ls-tree
verwenden, um Dateien aufzulisten, wenn Sie sich in einem Git Repo befinden. SieheFZF_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?
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