Varför du bör använda fzf, kommandoradens fuzzy finder

av Alexey Samoshkin

Missing demo found

I den här handledningen hjälper jag dig att ta dina kommandoradsvanor till nästa nivå med fzf . Börja söka filer som ett proffs. Lär dig mindre kända funktioner, som att byta katalog, söka genom en kommandohistorik, leta upp värdnamnet för att SSH in, döda en process, ha omedelbar förhandsgranskning av filer med syntaxmarkering och mycket mer…

Snabb demo

I dag kommer jag att berätta om ett verktyg som kan förändra ditt tekniska liv i ”före” och ”efter” delar. Lita på mig – det är ingen överdrift. Möt fzf, som står för fuzzy finder. Som definitionen påstår är det en allmänt användbar fuzzy finder på kommandoraden. Det låter inte särskilt beskrivande och attraktivt för dem som hör talas om det för första gången. Men det är ett mycket populärt projekt som rankas med cirka 21 000 stjärnor på Github. Så det är dags att rensa dimman och få en djupare inblick.

Detta inlägg följer med min senaste screencast om ämnet. Så om du är en person som lär dig genom att titta, kolla in den. Annars kolla den också ? eftersom verktyg som fzf introduceras bäst med en live-demo snarare än tonvis med text.

Eftersom fzfs projektsida inte har någon demovideo än så länge har jag kallat det här inlägget för ”missing demo found” (saknad demo hittad). Men nu har denna video redan dragits in i fzf repo och blivit en del av projektets readme.

Söka efter filer

De som är vana vid en kommandoradsmiljö är troligen bekanta med begreppet Unix-filter. Detta är när flera oberoende verktyg sätts samman till en pipeline för att steg för steg producera det önskade resultatet. Denna pipeline producerar till exempel en lista med strängar:

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

Varje program fungerar som ett filter. Enkelt uttryckt är fzf bara ännu ett Unix-filter. Det läser rader från stdin, startar en interaktiv sökdialog och skriver slutligen valda objekt till stdout. Den viktigaste punkten och skillnaden från verktyg som GNU find, är dess interaktiva sökdialog som filtrerar objekt direkt när du skriver.

”fzf” som interaktivt unix-filter

Det kanske inte låter så praktiskt än så länge, men det primära användningsområdet för fzf är att söka efter filer på kommandoraden. Med fuzzy matchning och omedelbar återkoppling är du bara några få tecken från att hitta rätt fil, oavsett hur djupt den är försvunnen i kataloghierarkin. Du behöver inte hoppa tillbaka till filhanteraren, gå igenom kataloghierarkin, kopiera en fils sökväg och klistra in den i skalet igen. Jämför ”filhanterare” vs ”fzf”-arbetsflöden nedan.

fzf vs filhanterare jämförelse

fzf har stöd för fuzzy matchning så att du bara kan skriva in flera tecken i rad och den kommer att matcha rader med dessa tecken utspridda över strängen. Alternativt kan du sätta ett enkelt citationstecken före en sökterm, som 'string, för att endast välja exakta matchningar, eller köra som fzf --exact .

fuzzy vs exakt matchning

Den har inte stöd för reguljära uttryck eller globmönster, så *.sh-mönstret skulle inte fungera. Men håll det enkelt – produktivitet och snabbhet är ditt mål idag. Du har inte tid över för att komponera och skriva korrekta reguljära uttryck. Skriv istället bara flera ord, eller till och med delar av ord, avgränsade med ett mellanslag, så täcker det >90 % av användningsfallen. För de resterande 10 % används use ^ and $ för att matcha början respektive slutet av strängen, och use ! för att negera matchningen.

fzf matchningssyntax

Att skriva ut utvalda filer på en kommandorad är inte superanvändbart, så vanligtvis kombineras sökning med någon ytterligare åtgärd. Du kan till exempel öppna den med Vim eller pipa utvalda objekt till nästa program.

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

Fuzzy completion för bash och zsh

För att göra det bekvämare kan fuzzy completion utlösas om ordet före markören slutar med den utlösande sekvensen som som standard är **. Skriv till exempel vim ~/path/** och tryck TAB . Voilà, fzf kliver in!

Double star fuzzy completion

**-sekvensen utlöser fzf finder och den liknar * som är för native shell expansion. Vid en viss tidpunkt kan du till och med glömma fzfs närvaro och få intrycket att det är en funktion för det infödda skalet.

Formatet är följande, där FUZZY_PATTERN är valfritt.

COMMAND **<TAB>

Om du inte gillar **-sekvensen kan du använda tangentbordsgenvägar. CTRL+T utlöser fzf och klistrar in den valda filen på kommandoraden, medan ALT+C byter till den valda katalogen.

Byte av katalog

Okej, nog om att söka filer. Låt oss tala om andra användbara tillämpningar. Att byta arbetskatalog är en så vanlig operation. Men trots det fastnar jag alltid lite när jag försöker komma ihåg och skriva in rätt katalogsökväg och gör flera misstag på vägen. Det sänker mitt tempo. Inte ens zsh-kompletteringar kompenserar för det. Men med fzf är det lätt att byta kataloger, oavsett hur djupt och långt det är. Skriv bara cd ** så är du nästan framme.

Att byta katalog är som en bris

Bemärk att medan fzf indexerar ditt katalogträd kan du börja söka direkt. Byte av kataloger är mitt favoritanvändningsfall, och fuzzy matching utmärker sig verkligen här. Det krävs samma ansträngning av dig för att ändra en katalog oavsett om den är en nivå djup eller tio nivåer djup.

ALT+C genväg är ett alternativt sätt att utlösa fzf i läget för katalogändring.

Kommandohistorik

Du kanske använder Ctrl+R tangentbordsgenväg för att söka igenom din kommandohistorik. Bra, men hur vore det om du kunde ge den en extra laddning med fuzzy finder? Titta och jämför.

Sökning i kommandohistorik

Det klistrar in det valda objektet på kommandoraden, så att du kan finjustera det ytterligare.

Sök värddatornamnet för att SSH-anslutas till

Om du är en backend-utvecklare och arbetar med ett antal fjärrservrar kan du uppskatta ssh+fzf-kombinationen. Använd samma utlösningssekvens med dubbla stjärnor och skriv ssh ** . Den hämtar nyligen använda IP-adresser och värdnamn från din ~/.ssh/config och visar en interaktiv sökare.

”fzf + ssh” combo

Sänd en signal till en process

Ibland vill vi skicka en signal till en process, men först måste vi få fram dess PID med namn. Vanligtvis använder man pgrep <process_name> för att lösa PID följt by a kill <process_pid> som hänvisar that PID. Med fzf kan du kombinera både steps. Type kill <TAB> och fzf-stegen för att lista alla dina processer. Du behöver inte längre byta till en dedikerad processövervakare, som ”Activity Monitor” på Mac.

Hitta en process och skicka en signal

Förhandsgranska filer medan du söker

Antag att du söker efter filer, men ibland säger inte själva filnamnet tillräckligt. Så du kanske vill kika på en fils innehåll en stund för att kunna fatta ett beslut. fzf täcker dig även här.

Fönster för förhandsgranskning

Som standard har jag fönstret för förhandsgranskning avstängt, men jag slår på det när jag vill kika in i filerna. Dessutom har jag förbättrat det med en färgad utskrift och syntaxmarkering genom att använda bat som ett förhandsvisningskommando.

Anpassning

Det finns två huvudsakliga sätt att anpassa standardversionen av fzf:

  • Ändra beteendet i sökardialogen (förhandsvisningsfönster, tangentbordsgenvägar, dimensioner, anpassade åtgärder, etc.). Se FZF_DEFAULT_OPTS miljövariabel.
  • Ändra den underliggande sökmotorn. Som standard används GNU find utility, men du kan byta till mer avancerade verktyg som fd eller ripgrep. För det första är det snabbare än standardverktyget find. För det andra respekterar dessa verktyg .gitignore-regler, så du får inte node_modules eller .git-filer i dina sökresultat. Du kan också använda git ls-tree för att lista filer när du befinner dig i en Git-repo. Se FZF_DEFAULT_COMMAND miljövariabel.

Konfigurationen sker via miljövariablerna. Här är ett utdrag från min installation. Är inte säker på om det skulle fungera som det är när det kopieras-n-klistras in, troligen finns det några andra saknade beroenden. Men detta är bara för att ge dig en idé om hur konfigurationen ser ut.

Fzf och Vim

So långt har vi bara sett kommandoradsanvändning. Men fzf levereras också som ett Vim-plugin. Och tro mig, om du är en Vimmer är den värd att lägga till i din vimrc. Vim-användning ligger utanför det här inläggets räckvidd, annars skulle ingen läsa det ?. Men jag talar om det grundligt i den andra delen av min video, som också är länkad i början av inlägget.

Om du är otålig kommer här ett litet utdrag för att fästa din uppmärksamhet. Använd kommandot :grep för textsökning i hela projektet, öppna matchningar i fönstret fzf i helskärmsläge, filtrera ytterligare matchningar inom fzf och hoppa till den valda matchningen. Och glöm inte den omedelbara förhandsgranskningen av filen vid den exakta radpositionen. Det är häftigt, eller hur?

fzf ❤️ vim

Slutsats

Jag hoppas du är imponerad av hur superhäftigt fzf är. Chansen är stor att du redan är villig att installera och ge det ett försök.

Håll i minnet att fzf inte bara är till för att söka efter filer, även om det är den primära funktionen i det. Som du kan se är ”search + action” en allmän princip, men den är tillräckligt abstrakt och kraftfull för att fungera med alla typer av listor: filer, kataloger, processer, värdnamn osv. Kom ihåg i början av det här inlägget – fzf är bara ett Unix-filter. Släpp loss din fantasi, mata den med vilken lista som helst och skräddarsy den för dina egna behov. Du kan hämta inspiration från en mängd exempel.

BTW, uppskatta hur överlägsen Unixfilosofin är. fzf är ett utmärkt exempel på ett program som följer dessa principer.

  • Låt programmet göra en sak och göra det bra (principen om ett enda ansvar)
  • Gör det tillräckligt abstrakt för att vara agnostiskt mot irrelevanta detaljer eller datatyper
  • Sammanställ separata enskilda program med hjälp av standardiserade och väldefinierade gränssnitt.

Håll dig till dessa principer i din karriär inom programvaruutveckling. Att känna till grundläggande principer som ligger bakom den snabba födelsen och döden av flera verktyg, språk och ramverk där ute är det som skiljer professionella utvecklare från amatörer.

Resurser

junegunn/fzf: En fuzzy finder på kommandoraden – https://github.com/junegunn/fzf

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

Min Youtube-kanal. Det finns bara några få videor, eftersom jag tar mina första steg i att göra screencasts. Ha tålamod, jag lovar att göra fler videor. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Ett enkelt, snabbt och användarvänligt alternativ till ”find” – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep söker rekursivt i kataloger efter ett regex-mönster – https://github.com/BurntSushi/ripgrep

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

Lämna ett svar

Din e-postadress kommer inte publiceras.