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…
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 fzf
s 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.
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
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
.
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 us
e ^ an
d $ för att matcha början respektive slutet av strängen, och us
e ! för att negera matchningen.
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!
**
-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 fzf
s 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.
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.
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.
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_na
me> för att lösa PID följt by a kill <pro
cess_pid> som hänvisar that P
ID. Med fzf kan du kombinera både steps. Typ
e 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.
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.
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 standardverktygetfind
. För det andra respekterar dessa verktyg.gitignore
-regler, så du får intenode_modules
eller.git
-filer i dina sökresultat. Du kan också användagit ls-tree
för att lista filer när du befinner dig i en Git-repo. SeFZF_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?
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