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…
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.
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
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
.
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 us
e ^ an
d $ gebruiken om respectievelijk het begin en het einde van de tekenreeks te matchen, en us
e ! om het matchen te ontkennen.
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!
**
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.
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.
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.
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_na
me> om de PID op te lossen, gevolgd door by a kill <pro
cess_pid> die verwijst naar det P
ID. Met fzf kunt u zowel steps. Typ
e 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.
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.
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 standaardfind
hulpprogramma. Ten tweede respecteren deze programma’s de.gitignore
regels, dus u krijgt geennode_modules
of.git
bestanden in uw zoekresultaten. U kuntgit ls-tree
ook gebruiken om bestanden te tonen als u in een Git repo bent. ZieFZF_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?
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