Miksi sinun pitäisi käyttää fzf:ää, komentorivin fuzzy finderia

by Alexey Samoshkin

Puuttuva demo löytyi

Tässä opetusohjelmassa autan sinua viemään komentorivin tavat seuraavalle tasolle fzf . Aloita tiedostojen haku kuin ammattilainen. Opi vähemmän tunnettuja ominaisuuksia, kuten hakemiston vaihtaminen, komentohistorian läpikäynti, SSH:lla käytettävän isäntäkoneen nimen etsiminen, prosessin tappaminen, tiedoston välitön esikatselu syntaksin korostuksella ja paljon muuta…

pikademo

Tänään kerron sinulle työkalusta, joka voi muuttaa teknisen elämäsi ”ennen”- ja ”jälkeen”-osiin. Luota minuun – se ei ole liioittelua. Tutustu fzf:hen, joka on lyhenne sanoista fuzzy finder. Kuten määritelmä väittää, se on yleiskäyttöinen komentorivin sumea etsijä. Se ei kuulosta kovin kuvaavalta ja houkuttelevalta niille, jotka kuulevat siitä ensimmäistä kertaa. Mutta se on erittäin suosittu projekti, jolla on noin 21 000 tähteä Githubissa. On siis aika hälventää sumua ja saada syvempi oivallus.

Tämä viesti liittyy hiljattain pitämääni screencastiin aiheesta. Jos siis olet henkilö, joka oppii katsomalla, tutustu siihen. Muuten, tsekkaa se myös ?, koska fzf :n kaltaiset työkalut esitellään parhaiten elävän demon avulla eikä tonneittain tekstiä.

Koska fzfprojektin sivulla ei toistaiseksi ole demovideota, olen kutsunut tätä viestiä nimellä ”puuttuva demo löytyi”. Mutta nyt tämä video on jo vedetty fzf repoon ja siitä on tullut osa projektin readmea.

Tiedostojen etsiminen

Komentoriviympäristöön tottuneet tuntevat todennäköisesti Unix-suodattimien käsitteen. Tällöin useita itsenäisiä apuohjelmia kootaan yhteen putkistoksi, joka tuottaa halutun tulosteen askel askeleelta. Esimerkiksi tämä putki tuottaa listan merkkijonoja:

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

Jokainen ohjelma toimii suodattimena. Yksinkertaistettuna fzf on vain yksi Unix-suodatin. Se lukee rivejä stdin:sta, käynnistää interaktiivisen finder-dialogin ja lopuksi kirjoittaa valitut kohteet stdout:een. Keskeinen seikka ja ero GNU find:n kaltaisiin työkaluihin on sen interaktiivinen finder-dialogi, joka suodattaa kohteita välittömästi kirjoittaessasi.

”fzf” interaktiivisena unix-suodattimena

Ei ehkä kuulosta kovin käytännölliseltä toistaiseksi, mutta fzf:n ensisijainen käyttötapaus on tiedostojen etsiminen komentoriviltä. Sumean täsmäytyksen ja välittömän palautteen ansiosta olet vain muutaman merkin päässä oikean tiedoston löytämisestä, vaikka se olisi kuinka syvällä hakemistohierarkiassa. Ei tarvitse hypätä takaisin tiedostonhallintaan, käydä läpi hakemistohierarkiaa, kopioida tiedoston polkua ja liittää sitä takaisin komentotulkkiin. Vertaa ”tiedostonhallinta” vs. ”fzf”-työnkulkuja alla.

fzf vs. tiedostonhallinta-vertailu

fzf tukee sumeaa täsmäytystä, joten voit vain kirjoittaa useita merkkejä peräkkäin, ja se etsii rivejä, joissa nämä merkit ovat hajallaan. Vaihtoehtoisesti voit asettaa hakusanan etuliitteeksi yksinkertaisen lainausmerkin, kuten 'string, jos haluat valita vain tarkat osumat, tai suorittaa sen muodossa fzf --exact .

sumea vs. tarkka täsmäys

Se ei tue säännönmukaisia lausekkeita tai globaalikuvioita, joten *.sh-kuvio ei toimisi. Pidä se kuitenkin yksinkertaisena – tuottavuus ja nopeus ovat tänään tavoitteesi. Sinulla ei ole vapaa-aikaa laatia ja kirjoittaa oikeita säännöllisiä lausekkeita. Kirjoita sen sijaan vain useita sanoja tai jopa sanojen osia välilyönnillä rajattuna, ja se kattaisi >90 % käyttötapauksista. Jäljelle jäävää 10 % varten use ^ and $ vastaa merkkijonon alkua ja loppua, ja use ! kumoaa vastaavuuden.

fzf-täsmäyssyntaksi

Valittujen tiedostojen tulostaminen komentoriville ei ole superhyödyllistä, joten tavallisesti haku yhdistetään johonkin muuhun toimintaan. Voit esimerkiksi avata sen Vimillä tai viedä valitut kohteet putkella seuraavaan ohjelmaan.

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

Sumea täydennys bashille ja zsh:lle

Käyttökelpoisemmaksi sumea täydennys voidaan käynnistää, jos kursoria edeltävä sana päättyy laukaisusekvenssiin, joka on oletuksena **. Kirjoita esimerkiksi vim ~/path/** ja paina TAB . Voilà, fzf astuu sisään!

Kaksoistähden sumea täydennys

** sekvenssi laukaisee fzf finder ja se muistuttaa *, joka on natiivia komentotulkin laajennusta varten. Jossain vaiheessa saatat jopa unohtaa fzf:n läsnäolon ja saada vaikutelman, että se on natiivin komentotulkin ominaisuus.

Muotoilu on seuraava, jossa FUZZY_PATTERN on valinnainen.

COMMAND **<TAB>

Jos et pidä **-sekvenssistä, voit käyttää pikanäppäimiä. CTRL+T laukaisee fzf ja liittää valitun tiedoston komentoriville, kun taas ALT+C vaihtaa valittuun hakemistoon.

Hakemiston vaihtaminen

Okei, tarpeeksi tiedostojen etsimisestä. Puhutaanpa muista hyödyllisistä sovelluksista. Työhakemiston vaihtaminen on niin yleinen toimenpide. Siitä huolimatta olen aina hieman jumissa yrittäessäni muistaa ja kirjoittaa oikean hakemiston polun, tehden useita virheitä matkan varrella. Se hidastaa tahtiani. Edes zsh-täydennykset eivät kompensoi sitä. Mutta fzf:n kanssa hakemistojen vaihtaminen on lastenleikkiä, olipa se kuinka syvällä ja kaukana tahansa. Kirjoita vain cd ** ja olet melkein perillä.

hakemiston vaihtaminen on kuin tuulenhenkäys

Huomaa, että kun fzf indeksoi hakemistopuusi, voit aloittaa haun heti. Hakemistojen vaihtaminen on suosikkikäyttötilanteeni, ja fuzzy matching todella loistaa tässä. Se vaatii sinulta saman vaivannäön vaihtaaksesi hakemistoa, olipa se yhden tai kymmenen tason syvyydessä.

ALT+C Pikanäppäin on vaihtoehtoinen tapa laukaista fzf hakemiston muutostilassa.

Komentohistoria

Komentohistorian läpikäyntiin saatat käyttää Ctrl+R-näppäinyhdistelmää. Hienoa, mutta entäpä sen superlataaminen sumealla etsimellä? Katso ja vertaa.

Komentohistorian haku

Se liittää valitun kohteen komentoriville, joten voit viritellä sitä edelleen.

Haku SSH:n isäntänimi

Jos olet backend-kehittäjä ja työskentelet useiden etäkäyttöisten palvelimien parissa, saatat arvostaa ssh+fzf-komboa. Käytä samaa kaksoistähden laukaisusekvenssiä ja kirjoita ssh ** . Se hakee viime aikoina käytetyt IP-osoitteet ja isäntänimet ~/.ssh/config:stä ja tuo esiin interaktiivisen etsimen.

”fzf + ssh” combo

Signaalin lähettäminen prosessille

Joskus haluamme lähettää signaalin jollekin prosessille, mutta ensin meidän on saatava sen PID-nimi. Yleensä käytetään pgrep <process_name> PID:n ratkaisemiseen ja sen jälkeen by a kill <process_pid> viitaten that PID:hen. Fzf:n avulla voit yhdistää sekä steps. Type kill <TAB> että fzf:n vaiheet kaikkien prosessien listaamisessa. Enää ei tarvitse siirtyä erilliseen prosessimonitoriin, kuten ”Activity Monitor” Macissa.

Etsi prosessi ja lähetä signaali

Katsele tiedostoja haun aikana

Asettele, että etsit tiedostoja, mutta joskus tiedoston nimi itsessään ei kerro tarpeeksi. Haluat siis ehkä kurkistaa hetken aikaa tiedoston sisältöä, jotta voit tehdä päätöksen. fzf kattaa sinut tässäkin.

Katseluikkuna

Oletuksena minulla on esikatseluikkuna pois päältä, mutta kytken sen päälle, kun haluan kurkistaa tiedostoihin. Lisäksi olen parantanut sitä värillisellä ulostulolla ja syntaksin korostuksella käyttäen bat-komentoa esikatselukomentona.

Räätälöinti

Varastoversion fzf muokkaamiseen on kaksi pääasiallista tapaa:

  • Muuttaa finder-dialogin käyttäytymistä (esikatseluikkuna, näppäimistön pikanäppäimet, dimensiot, räätälöidyt toiminnot jne). Katso FZF_DEFAULT_OPTS-ympäristömuuttuja.
  • Muuttaa taustalla olevaa finderin backendiä. Oletusarvoisesti se käyttää GNU find -apuohjelmaa, mutta voit vaihtaa sen edistyneempiin työkaluihin kuten fd tai ripgrep. Ensinnäkin se on nopeampi kuin alkuperäinen find-apuohjelma. Toiseksi nämä työkalut noudattavat .gitignore-sääntöjä, joten et saa node_modules– tai .git-tiedostoja hakutuloksiin. Voit myös käyttää git ls-tree-tiedostojen listaamiseen, kun olet Git-repossa. Katso FZF_DEFAULT_COMMAND-ympäristömuuttuja.

Konfigurointi tapahtuu ympäristömuuttujien avulla. Tässä on pätkä asetuksestani. En ole varma toimisiko se copy-n-pastettuna sellaisenaan, todennäköisesti sieltä puuttuu joitain muita riippuvuuksia. Mutta tämä on vain antaakseen sinulle käsityksen siitä, miltä konfiguraatio näyttää.

Fzf ja Vim

Tässä vaiheessa olemme nähneet vain komentorivin käyttöä. Mutta fzf toimitetaan myös Vim-lisäosana. Ja luota minuun, jos olet Vimmer, se kannattaa lisätä vimrc. Vim-käyttö ei kuulu tämän viestin piiriin, muuten kukaan ei lukisi sitä ?. Mutta puhun siitä perusteellisesti videoni toisessa osassa, joka on myös linkitetty postauksen alussa.

Jos olet kärsimätön, tässä on pieni ote, joka kiinnittää huomiosi. Käytä :grep-komentoa koko projektin laajuiseen tekstihakuun, avaa osumat fzf-ikkunassa koko näytön tilassa, suodata edelleen osumia fzf:n sisällä ja hyppää valitun osuman kohdalle. Äläkä unohda välitöntä tiedoston esikatselua tarkassa rivin sijainnissa. Eikö olekin mahtavaa?

fzf ❤️ vim

Loppupäätelmä

Toivottavasti olet vaikuttunut siitä, miten super mahtava fzf on. Todennäköisesti olet jo halukas asentamaan ja kokeilemaan sitä.

Pitäkää mielessä, että fzf ei ole vain tiedostojen etsimiseen, vaikka se onkin sen ensisijainen ominaisuus. Kuten näet, ”haku + toiminta” on yleinen periaate, mutta se on tarpeeksi abstrakti ja tehokas toimimaan minkä tahansa listan kanssa: tiedostojen, hakemistojen, prosessien, isäntänimien jne. kanssa. Muista tämän viestin alussa – fzf on vain Unix-suodatin. Päästä mielikuvituksesi valloilleen, syötä sille mikä tahansa lista ja räätälöi se omiin tarpeisiisi. Voit ottaa inspiraatiota runsaista esimerkeistä.

BTW, arvosta, kuinka ylivertaista Unix-filosofia on. fzf on loistava esimerkki ohjelmasta, joka noudattaa näitä periaatteita.

  • anna ohjelman tehdä yksi asia ja tehdä se hyvin (yhden vastuun periaate)
  • tee ohjelmasta tarpeeksi abstrakti, jotta se ei välitä merkityksettömistä yksityiskohdista tai tietotyypeistä
  • kokoa erilliset yksittäiset ohjelmat käyttäen vakiomuotoisia, hyvin määriteltyjä rajapintoja.

Kannattaa noudattaa noita periaatteita ohjelmistonkehitysurallasi. Perusperiaatteiden tunteminen, jotka ovat monien työkalujen, kielten ja kehysten nopean synnyn ja kuoleman taustalla, erottaa ammattikehittäjät amatööreistä.

Resurssit

junegunn/fzf: Komentorivin sumea etsijä – https://github.com/junegunn/fzf

Vim-universumi. fzf – komentorivin sumea etsijä – Youtube – https://www.youtube.com/watch?v=qgG5Jhi_Els

My Youtube channel. Videoita on vain muutama, sillä otan ensiaskeleita screencastien tekemisessä. Ole kärsivällinen, lupaan tehdä lisää videoita. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Yksinkertainen, nopea ja käyttäjäystävällinen vaihtoehto ’find’ille – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep etsii rekursiivisesti hakemistoista regex-kuvion – https://github.com/BurntSushi/ripgrep

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

Vastaa

Sähköpostiosoitettasi ei julkaista.