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…
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 fzf
projektin 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.
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
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
.
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 us
e ^ an
d $ vastaa merkkijonon alkua ja loppua, ja us
e ! kumoaa vastaavuuden.
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!
**
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ä.
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.
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.
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_na
me> PID:n ratkaisemiseen ja sen jälkeen by a kill <pro
cess_pid> viitaten that P
ID:hen. Fzf:n avulla voit yhdistää sekä steps. Typ
e kill <TAB> että fzf:n vaiheet kaikkien prosessien listaamisessa. Enää ei tarvitse siirtyä erilliseen prosessimonitoriin, kuten ”Activity Monitor” Macissa.
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.
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äinenfind
-apuohjelma. Toiseksi nämä työkalut noudattavat.gitignore
-sääntöjä, joten et saanode_modules
– tai.git
-tiedostoja hakutuloksiin. Voit myös käyttäägit ls-tree
-tiedostojen listaamiseen, kun olet Git-repossa. KatsoFZF_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?
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