Waarom je fzf zou moeten gebruiken, de command line fuzzy finder

door Alexey Samoshkin

Missing demo found

In deze tutorial help ik je om je command line gewoontes naar een volgend niveau te tillen met fzf . Begin met het doorzoeken van bestanden als een pro. Leer minder bekende functies, zoals het wijzigen van een directory, het doorzoeken van een opdrachtgeschiedenis, het opzoeken van de hostnaam om in te SSH-en, het doden van een proces, het direct bekijken van bestanden met syntax highlighting, en nog veel meer…

quick demo

Vandaag ga ik je vertellen over een tool die je tech-leven kan veranderen in “voor” en “na” delen. Geloof me – dit is geen hyperbool. Ontmoet fzf, wat staat voor fuzzy finder. Zoals de definitie zegt, is het een algemene commando regel fuzzy finder. Dat klinkt niet erg beschrijvend en aantrekkelijk voor degenen die er voor het eerst van horen. Maar het is een zeer populair project met ongeveer 21.000 sterren op Github. Dus het is tijd om de mist op te ruimen en een dieper inzicht te krijgen.

Dit bericht begeleidt mijn recente screencast over het onderwerp. Dus, als je een persoon bent die leert door te kijken, check it out. Anders, bekijk het ook ?, omdat hulpmiddelen zoals fzf het beste worden geïntroduceerd met een live demo in plaats van tonnen tekst.

Omdat de fzf project pagina tot nu toe geen demo video heeft, heb ik deze post “ontbrekende demo gevonden” genoemd. Maar nu is deze video al in de fzf repo getrokken en een deel van de readme van het project geworden.

Zoeken naar bestanden

Mensen die gewend zijn aan een command line omgeving zijn waarschijnlijk bekend met het concept van Unix filters. Dit is wanneer verschillende onafhankelijke utilities worden samengevoegd tot een pijplijn om stap voor stap de gewenste uitvoer te produceren. Deze pijplijn produceert bijvoorbeeld een lijst van strings:

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

Elk programma fungeert als een filter. Eenvoudig gezegd, fzf is gewoon een ander Unix filter. Het leest regels uit stdin, start een interactieve zoekdialoog, en schrijft tenslotte geselecteerde items naar stdout. Het belangrijkste punt en verschil met hulpprogramma’s als GNU find, is de interactieve zoekdialoog die items direct filtert terwijl u typt.

“fzf” als interactief Unix-filter

Het klinkt misschien niet al te praktisch, maar de primaire gebruikssituatie voor fzf is het zoeken naar bestanden op de opdrachtregel. Met fuzzy matching en directe feedback bent u slechts enkele tekens verwijderd van het vinden van het juiste bestand, ongeacht hoe diep het in de directoryhiërarchie verloren is gegaan. U hoeft niet terug te springen naar uw bestandsbeheerder, de maphiërarchie te doorkruisen, het pad van een bestand te kopiëren en het terug te plakken in de commandoregel.

fzf vs file manager vergelijking

fzf ondersteunt fuzzy matching, zodat u meerdere tekens achter elkaar kunt typen en de zoekresultaten overeenkomen met regels met deze tekens verspreid over de tekenreeks. U kunt ook een zoekterm vooraf laten gaan door een enkel aanhalingsteken, zoals 'string, om te kiezen voor exacte overeenkomsten, of uitvoeren als fzf --exact .

fuzzy vs exacte overeenkomst

Het ondersteunt geen reguliere expressies of glob-patronen, dus *.sh-patroon zou niet werken. Maar houd het simpel – productiviteit en snelheid is je doel vandaag. Je hebt geen vrije tijd om correcte reguliere expressies samen te stellen en in te typen. In plaats daarvan typt u gewoon een aantal woorden, of zelfs delen van woorden, afgebakend met een spatie, en dat zou >90% van de use-cases afdekken. Voor de overige 10% kunt use ^ and $ gebruiken om respectievelijk het begin en het einde van de tekenreeks te matchen, en use ! om het matchen te ontkennen.

fzf matching syntax

Het afdrukken van geselecteerde bestanden naar een commandoregel is niet super handig, dus meestal wordt zoeken gecombineerd met een of andere verdere actie. Je zou het bijvoorbeeld kunnen openen met Vim, of geselecteerde items naar het volgende programma kunnen pijpen.

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

Fuzzy completion voor bash en zsh

Om het nog handiger te maken, kan fuzzy completion worden getriggerd als het woord voor de cursor eindigt met de trigger-sequentie die standaard ** is. Typ bijvoorbeeld vim ~/path/** en druk op TAB . Voilà, fzf stapt in!

Double star fuzzy completion

** sequence triggers fzf finder en het lijkt op * dat is voor native shell expansion. Op een gegeven moment vergeet u misschien zelfs de aanwezigheid van fzf en krijgt u de indruk dat het een native shell-functie is.

Opmaak is als volgt, waarbij FUZZY_PATTERN optioneel is.

COMMAND **<TAB>

Als u de **-reeks niet leuk vindt, kunt u sneltoetsen gebruiken. CTRL+T activeert fzf en plakt het geselecteerde bestand op de opdrachtregel, terwijl ALT+C in de geselecteerde directory verandert.

Veranderen van directory

Ok, genoeg over het zoeken van bestanden. Laten we het eens hebben over andere nuttige toepassingen. Het veranderen van je werkdirectory is zo’n veel voorkomende handeling. Maar toch zit ik altijd een beetje vast bij het herinneren en intypen van het juiste pad van de directory, waarbij ik onderweg verschillende fouten maak. Het vertraagt mijn tempo. Zelfs zsh aanvullingen compenseren het niet. Maar met fzf is het veranderen van directory een fluitje van een cent, hoe diep en ver het ook is. Typ gewoon cd ** en je bent er bijna.

van directory wisselen is als een makkie

Merk op dat terwijl fzf je directoryboom indexeert, je meteen kunt beginnen met zoeken. Het wijzigen van mappen is mijn favoriete toepassing, en fuzzy matching blinkt hier echt uit. Het vergt van u dezelfde inspanning om een map te wijzigen, of het nu één niveau diep is of tien niveaus diep.

ALT+C sneltoets is een alternatieve manier om fzf te activeren in een modus voor het wijzigen van mappen.

Commando geschiedenis

U gebruikt misschien de Ctrl+R sneltoets om uw commando geschiedenis te doorzoeken. Geweldig, maar hoe zit het met het superchargen van het met fuzzy finder? Kijk en vergelijk.

Zoek door opdrachtgeschiedenis

Het geselecteerde item wordt op de opdrachtregel geplakt, zodat u het verder kunt aanpassen.

Zoek de hostnaam om in te SSH-en

Als u een backend-ontwikkelaar bent en met een aantal externe servers werkt, zou u de ssh+fzf-combinatie kunnen waarderen. Gebruik dezelfde dubbele ster triggervolgorde en type ssh ** . Het haalt recent gebruikte IP-adressen en hostnamen uit uw ~/.ssh/config en toont een interactieve zoeker.

“fzf + ssh” combo

Een signaal naar een proces sturen

Soms willen we een signaal naar een proces sturen, maar dan moeten we eerst zijn PID bij naam kennen. Gewoonlijk gebruikt men pgrep <process_name> om de PID op te lossen, gevolgd door by a kill <process_pid> die verwijst naar det PID. Met fzf kunt u zowel steps. Type kill <TAB> als fzf stappen combineren in het opsommen van al uw processen. U hoeft niet meer over te schakelen op een speciale procesmonitor, zoals “Activity Monitor” op de Mac.

Vind een proces en stuur een signaal

Bestanden bekijken terwijl u zoekt

Voorstel dat u naar bestanden zoekt, maar soms zegt de bestandsnaam zelf u niet genoeg. Dus wilt u misschien even naar de inhoud van een bestand gluren om een beslissing te nemen. fzf Ook dit is mogelijk.

Preview-venster

Het preview-venster staat standaard uit, maar ik schakel het in als ik in de bestanden wil gluren. Bovendien heb ik het uitgebreid met een gekleurde uitvoer en syntax highlighting met behulp van bat als een preview commando.

Aanpassing

Er zijn twee belangrijke manieren om de standaard versie van fzf aan te passen:

  • Het gedrag van de finder dialoog veranderen (preview venster, sneltoetsen, afmetingen, aangepaste acties, etc). Zie FZF_DEFAULT_OPTS omgevingsvariabele.
  • Verander het onderliggende zoek backend. Standaard gebruikt het GNU find utility, maar je kunt overschakelen naar de meer geavanceerde tools zoals fd of ripgrep. Ten eerste is het sneller dan het standaard find hulpprogramma. Ten tweede respecteren deze programma’s de .gitignore regels, dus u krijgt geen node_modules of .git bestanden in uw zoekresultaten. U kunt git ls-tree ook gebruiken om bestanden te tonen als u in een Git repo bent. Zie FZF_DEFAULT_COMMAND omgevingsvariabele.

Configuratie wordt gedaan via de omgevingsvariabelen. Hier is de snippet van mijn setup. Niet zeker of het zou werken zoals het is wanneer copy-n-geplakt, hoogstwaarschijnlijk zijn er enkele andere ontbrekende afhankelijkheden. Maar dit is alleen om je een idee te geven van hoe de configuratie eruit ziet.

Fzf en Vim

Tot nu toe hebben we alleen command-line gebruik gezien. Maar fzf wordt ook geleverd als een Vim plugin. En geloof me, als u een Vimmer bent, is het de moeite waard om aan uw vimrc toe te voegen. Het gebruik van Vim valt buiten het bestek van dit artikel, anders zou niemand het lezen. Maar ik praat er grondig over in het tweede deel van mijn video, ook gelinkt aan het begin van de post.

Als je ongeduldig bent, hier is een klein fragment om je aandacht te trekken. Gebruik :grep commando voor project-wide tekst zoeken, open matches in fzf venster in een volledig scherm modus, filter matches verder binnen fzf, en spring naar de geselecteerde match. En vergeet niet de onmiddellijke bestandsvoorvertoning op de exacte regelpositie. Dat is toch geweldig?

fzf ❤️ vim

Conclusie

Ik hoop dat je onder de indruk bent van hoe super geweldig fzf is. De kans is groot dat je het al wilt installeren en proberen.

Houd in gedachten dat fzf niet alleen voor het zoeken van bestanden is, hoewel het de primaire functie ervan is. Zoals je kunt zien, “zoeken + actie” is een algemeen principe, maar het is abstract en krachtig genoeg om met elke soort lijst te werken: bestanden, mappen, processen, hostnamen, enz. Denk aan het begin van dit artikel – fzf is gewoon een Unix filter. Laat je verbeelding de vrije loop, geef het eender welke lijst, en pas het aan je eigen behoeften aan. Je zou wat inspiratie kunnen halen uit een schat aan voorbeelden.

BTW, waardeer hoe superieur de Unix filosofie is. fzf is een goed voorbeeld van een programma dat zich aan deze principes houdt.

  • laat het programma één ding doen en doe het goed (single responsibility principle)
  • maak het abstract genoeg om agnostisch te zijn van irrelevante details of datatypes
  • samenstel afzonderlijke individuele programma’s met behulp van standaard goed gedefinieerde interfaces.

Blijf bij deze principes in je software ontwikkel carrière. Het kennen van fundamentele principes die staan achter de snelle geboorte en dood van meerdere tools, talen, en frameworks die er zijn, is wat professionele ontwikkelaars onderscheidt van amateurs.

Bronnen

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

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

Mijn Youtube-kanaal. Er zijn maar een paar video’s, omdat ik mijn eerste stappen zet in het maken van screencasts. Heb geduld, ik beloof meer video’s te maken. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Een eenvoudig, snel en gebruiksvriendelijk alternatief voor ‘find’ – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep zoekt recursief in mappen naar een regex-patroon – https://github.com/BurntSushi/ripgrep

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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.