Hvorfor du bør bruge fzf, kommandolinjens fuzzy finder

af Alexey Samoshkin

Missing demo found

I denne vejledning hjælper jeg dig med at tage dine vaner på kommandolinjen til et nyt niveau med fzf . Begynd at søge i filer som en professionel. Lær mindre kendte funktioner, som at skifte mappe, søge i en kommandohistorik, slå værtsnavnet op for at SSH ind, dræbe en proces, få øjeblikkelig visning af filer med syntaksmarkering og meget mere …

hurtig demo

I dag vil jeg fortælle dig om et værktøj, der kan ændre dit tekniske liv i “før” og “efter” dele. Stol på mig – det er ikke en overdrivelse. Mød fzf, som står for fuzzy finder. Som definitionen hævder, er det en generel kommandolinje fuzzy finder til generelle formål. Det lyder ikke særlig beskrivende og attraktivt for dem, der hører om det for første gang. Men det er et meget populært projekt, der er rangeret med omkring 21.000 stjerner på Github. Så det er på tide at rydde op i tågen og få et dybere indblik.

Dette indlæg ledsager mit seneste screencast om emnet. Så hvis du er en person, der lærer ved at se, skal du tjekke det ud. Ellers skal du også tjekke det ud ? fordi værktøjer som fzf er bedst introduceret med en live-demo frem for tonsvis af tekst.

Da fzf-projektets side indtil videre ikke har nogen demovideo, har jeg kaldt dette indlæg for “manglende demo fundet”. Men nu er denne video allerede blevet trukket ind i fzf repo’en og er blevet en del af projektets readme.

Søgning efter filer

Personer, der er vant til et kommandolinjemiljø, er sandsynligvis bekendt med begrebet Unix-filtre. Det er, når flere uafhængige hjælpeprogrammer sammensættes sammen til en pipeline for at producere det ønskede output trin for trin. Denne pipeline producerer f.eks. en liste af strenge:

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

Hvert program fungerer som et filter. I enkle vendinger er fzf blot endnu et Unix-filter. Det læser linjer fra stdin, starter en interaktiv finderdialog og skriver til sidst de udvalgte elementer til stdout. Det vigtigste punkt og forskellen fra værktøjer som GNU find er dens interaktive finder-dialog, der filtrerer elementer øjeblikkeligt, mens du skriver.

“fzf” som interaktivt Unix-filter

Det lyder måske ikke så praktisk indtil videre, men det primære anvendelsesområde for fzf er at søge efter filer på kommandolinjen. Med fuzzy matching og øjeblikkelig feedback er du kun få tegn fra at finde den rigtige fil, uanset hvor dybt den er forsvundet i mappehierarkiet. Du behøver ikke at hoppe tilbage til din filhåndtering, krydse mappehierarkiet, kopiere en fils sti og indsætte den tilbage til shell’en. Sammenlign “filhåndtering” vs “fzf”-arbejdsgange nedenfor.

fzf vs filhåndtering sammenligning

fzf understøtter fuzzy matching, så du kan bare skrive flere tegn i en række, og den vil matche linjer med disse tegn spredt ud over strengen. Alternativt kan du sætte et søgeudtryk med et enkelt citationstegn foran, som 'string, for kun at vælge nøjagtige match, eller køre som fzf --exact .

fuzzy vs. nøjagtig match

Den understøtter ikke regulære udtryk eller glob-mønstre, så *.sh-mønsteret ville ikke fungere. Men hold det enkelt – produktivitet og hastighed er dit mål i dag. Du har ikke fritid til at sammensætte og skrive korrekte regulære udtryk. I stedet skal du blot skrive flere ord, eller endog dele af ord, afgrænset af et mellemrum, og det ville dække >90% af anvendelsestilfældene. For de resterende 10 % bruges use ^ and $ til at matche henholdsvis starten og slutningen af strengen, og use ! til at negere matchningen.

fzf matching syntax

Udskrivning af udvalgte filer til en kommandolinje er ikke superbrugelig, så normalt kombineres søgning med en eller anden yderligere handling. Du kan f.eks. åbne den med Vim eller pipe-fremføre udvalgte elementer til det næste program.

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

Fuzzy completion for bash and zsh

For at gøre det mere praktisk kan fuzzy completion udløses, hvis ordet før markøren slutter med triggersekvensen, som som som standard er **. Skriv f.eks. vim ~/path/**, og tryk på TAB . Voilà, fzf træder ind!

Double star fuzzy completion

**-sekvensen udløser fzf finder, og det ligner *, som er til native shell-udvidelse. På et tidspunkt glemmer du måske endda fzfs tilstedeværelse og får indtryk af, at det er en native shell-funktion.

Format er som følger, hvor FUZZY_PATTERN er valgfrit.

COMMAND **<TAB>

Hvis du ikke bryder dig om **-sekvensen, kan du bruge tastaturgenveje. CTRL+T udløser fzf og indsætter den valgte fil på kommandolinjen, mens ALT+C skifter til den valgte mappe.

Skift af mappe

Okay, nok om søgning af filer. Lad os tale om andre nyttige anvendelser. Ændring af din arbejdsmappe er en så almindelig operation. Men ikke desto mindre sidder jeg altid lidt fast i forsøget på at huske og skrive den rigtige mappes vej og laver flere fejl undervejs. Det sænker mit tempo. Selv zsh-kompletteringer kompenserer ikke for det. Men med fzf er det en leg at skifte mappe, uanset hvor dybt og langt det er. Du skal bare skrive cd **, og så er du der næsten.

Det er som en leg at skifte mappe

Bemærk, at mens fzf indekserer dit mappetræ, kan du begynde at søge med det samme. Ændring af mapper er mit foretrukne anvendelsestilfælde, og fuzzy matching excellerer virkelig her. Det kræver den samme indsats af dig at ændre en mappe, uanset om den er et niveau dybt eller ti niveauer dybt.

ALT+C genvej er en alternativ måde at udløse fzf i en tilstand til at ændre mappe.

Kommandohistorik

Du bruger måske Ctrl+R tastaturgenvej til at søge i din kommandohistorik. Fint, men hvad med at supercharging det med fuzzy finder? Se og sammenlign.

Søgning i kommandohistorik

Det indsætter det valgte element på kommandolinjen, så du kan justere det yderligere.

Søg værtsnavnet til SSH ind

Hvis du er backend-udvikler og arbejder med en række fjernservere, vil du måske sætte pris på ssh+fzf kombi. Brug den samme dobbelte stjerneudløsersekvens, og skriv ssh ** . Den trækker nyligt anvendte IP-adresser og værtsnavne fra din ~/.ssh/config og viser en interaktiv finder.

“fzf + ssh” combo

Send et signal til en proces

Sommetider ønsker vi at sende et signal til en proces, men først skal vi have fat i dens PID ved navn. Normalt bruger man pgrep <process_name> til at opløse PID efterfulgt af by a kill <process_pid>, der henviser til that PID. Med fzf kan du kombinere både steps. Type kill <TAB> og fzf-trinnene til at liste alle dine processer. Du behøver ikke længere at skifte til en dedikeret procesovervågning, som “Activity Monitor” på Mac.

Find en proces og send et signal

Se filer, mens du søger

Sæt, at du søger efter filer, men nogle gange fortæller selve filnavnet dig ikke nok. Så du vil måske gerne kigge lidt på en fils indhold for at træffe en beslutning. fzf dækker dig også her.

Fremvisningsvindue

Som standard har jeg fremvisningsvinduet slået fra, men jeg slår det til, når jeg vil kigge ind i filerne. Desuden har jeg forbedret det med et farvet output og syntaksmarkering ved hjælp af bat som en preview-kommando.

Anpasning

Der er to primære måder at tilpasse standardversionen af fzf:

  • Ændre opførslen af finder-dialogen (preview-vindue, tastaturgenveje, dimensioner, brugerdefinerede handlinger osv.). Se FZF_DEFAULT_OPTS miljøvariabel.
  • Ændre den underliggende find backend. Som standard bruger den GNU find utility, men du kan skifte til de mere avancerede værktøjer som fd eller ripgrep. For det første er det hurtigere end det almindelige find-værktøj. For det andet respekterer disse værktøjer .gitignore-regler, så du får ikke node_modules– eller .git-filer i dine søgeresultater. Du kan også bruge git ls-tree til at liste filer, når du befinder dig i et Git-repo. Se FZF_DEFAULT_COMMAND miljøvariabel.

Konfigurationen sker via miljøvariablerne. Her er udsnittet fra min opsætning. Ikke sikker på om det ville fungere som det er, når copy-n-pasted, højst sandsynligt er der nogle andre manglende afhængigheder. Men det er bare for at give dig en idé om, hvordan konfigurationen ser ud.

Fzf og Vim

Så langt har vi kun set brug af kommandolinjen. Men fzf bliver også leveret som et Vim-plugin. Og tro mig, hvis du er en Vimmer, er det værd at tilføje til din vimrc. Vim-brug er uden for rammerne af dette indlæg, ellers ville ingen læse det ?. Men jeg taler grundigt om det i anden del af min video, der også er linket i starten af indlægget.

Hvis du er utålmodig, er her et lille uddrag for at henlede din opmærksomhed. Brug kommandoen :grep til tekstsøgning i hele projektet, åbn kampe i fzf-vinduet i fuldskærmstilstand, filtrer yderligere kampe inden for fzf, og spring til den valgte kamp. Og glem ikke den øjeblikkelige filfremvisning ved den præcise linjeposition. Det er fedt, ikke sandt?

fzf ❤️ vim

Konklusion

Jeg håber du er imponeret over hvor super fedt fzf er. Chancerne er, at du allerede er villig til at installere og give det en chance.

Husk på, at fzf ikke kun er til filsøgning, selv om det er den primære funktion i det. Som du kan se, er “søgning + handling” et generelt princip, men det er abstrakt og kraftfuldt nok til at arbejde med enhver form for liste: filer, mapper, processer, værtsnavne osv. Husk i starten af dette indlæg – fzf er bare et Unix-filter. Frigør din fantasi, giv den en hvilken som helst liste, og skræddersy den til dine egne behov. Du kan måske lade dig inspirere af et væld af eksempler.

BTW, værdsæt hvor overlegen Unix-filosofien er. fzf er et godt eksempel på et program, der overholder disse principper.

  • lad programmet gøre én ting og gøre det godt (single responsibility principle)
  • gør det abstrakt nok til at være agnostisk over for irrelevante detaljer eller datatyper
  • sammensæt separate individuelle programmer ved hjælp af standardiserede, veldefinerede grænseflader.

Hold dig til disse principper i din karriere inden for softwareudvikling. At kende de grundlæggende principper, der står bag den hurtige fødsel og død af flere værktøjer, sprog og frameworks derude, er det, der adskiller professionelle udviklere fra amatører.

Ressourcer

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

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

Min Youtube-kanal. Der er kun få videoer, da jeg tager mine første skridt til at lave screencasts. Vær tålmodig, jeg lover at lave flere videoer. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Et simpelt, hurtigt og brugervenligt alternativ til ‘find’ – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep søger rekursivt i mapper efter et regex-mønster – https://github.com/BurntSushi/ripgrep

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

Skriv et svar

Din e-mailadresse vil ikke blive publiceret.