1 Punkte von GN⁺ 4 시간 전 | 1 Kommentare | Auf WhatsApp teilen
  • fzf verbessert 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 an fzf ü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, grep und cut zu lernen; in moderneren Rollen der Systemadministration gehören auch sed und awk dazu
  • fzf kann 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+R eine rückwärtsgerichtete Suche im Befehlsverlauf
    • Das normale Ctrl+R braucht 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 fzf installiert, werden mehrere Tastenkürzel mit besserem Verhalten überschrieben, und auch Ctrl+R wird gegenüber der bisherigen Methode stark verbessert
    • Bei einer Installation über Paketmanager wie apt ist diese Integration der Tastenkürzel möglicherweise nicht enthalten, was ein Grund für das fzf-Installationsskript ist
  • Alt+C: schnell in ein Verzeichnis springen, an das man sich nur vage erinnert

    • fzf macht aus Alt+C ein 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 fzf direkt 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
  • 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 mit emacs, nano, code oder jedem anderen Editor
  • vi $(find . '/' | fzf)

    • Kombiniert man find . '/' | fzf mit 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.conf sucht und sich nicht mehr erinnert, wo sie liegt, muss man nicht die FHS-Kenntnisse hervorkramen, raten oder den Pfad auswendig wissen — man kann einfach die find-Ergebnisse in fzf pipen
    • Mit einer Suche wie conf$ kann man auf Zeilen filtern, die auf conf enden
    • Wenn find auf viele Permission denied-Fehler stößt, kann fzf kurz 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
  • vi **<TAB>

    • Aus einem Hacker-News-Kommentar von sigmonsays stammt die Funktion einer Fuzzy-Tab-Vervollständigung mit zwei Sternchen, die ungefähr zwischen Tastenkürzel-Überschreibung und dem direkten Ausführen von fzf liegt
    • vi **<TAB> kann ähnlich wie vi $(fzf) verwendet werden, um eine Datei auszuwählen
    • Nachdem der eigentliche Befehl vervollständigt wurde, muss man noch einmal Enter drücken
    • In bash und zsh funktioniert das gut, in fish kann 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

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 finstem verlinkt

Mit rg kombiniert bis in Dateiinhalte per Fuzzy Search

  • rg: schnelles grep mit rekursiver Suche als Standard

    • Die folgende Kombination ist auch mit grep möglich, aber rg beziehungsweise ripgrep hat hier einen Vorteil, weil rekursive Suche standardmäßig aktiviert ist
    • Um die Beispiele nachzuvollziehen, wird empfohlen, rg zu installieren und zu verwenden
  • rg . | fzf

    • rg . gibt jede Zeile aus Dateien als Suchergebnis aus, und wenn man das an fzf ü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 . | fzf ausgewählte Ergebnis noch cut -d ":" -f 1 an, 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
  • 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, in vim
    • 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

 
GN⁺ 4 시간 전
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

    • Der Kern ist die Integration in die vorhandene Shell-Konfiguration, persönliche Skripte und Aliase. Ich benutze fzf ständig, starte es aber fast nie direkt
  • 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

    • Tatsächlich ist es eher ein verbesserter Standard. Man sollte es ruhig ctrl-r ersetzen lassen, und die Hälfte des Reizes besteht darin, dass vertraute Abläufe erhalten bleiben, man aber fast denselben Flow mit einer deutlich reicheren Erfahrung bekommt
      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 mit git, wenn ich Dateien für eine bestimmte Änderung auswähle, und habe es auch schon verwendet, um grep-Ausgaben zu filtern und den Suchbereich einzugrenzen

  • Neben der verbesserten Shell-Verlaufssuche habe ich fzf auch mit den folgenden zwei Aliasen verwendet
    alias 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/config umschalten. Ich überlege inzwischen, auch einen ähnlichen Alias zum Wechseln von Kubernetes-Namespaces zu bauen

  • Mit 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 fzf so definiert

    [alias]  
      # Browse commit history with fzf  
      # Inspired by: https://chrismanbrown.gitlab.io/67.html  
      fzf = "!git log --oneline --color=always --decorate=short $@ | \  
          fzf --ansi --reverse --no-sort \  
            --preview 'git show --color=always {1}' \  
            --preview-window '<50(down)' \  
            --bind 'enter:become(git show {1})' #"  
    
  • Ich 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