Miért kellene használnod az fzf-et, a parancssori fuzzy finder-t

by Alexey Samoshkin

Missing demo found

Ebben a bemutatóban segítek, hogy a parancssori szokásaidat egy következő szintre emeld a fzf . Kezdj el fájlokat keresni, mint egy profi. Ismerd meg a kevésbé ismert funkciókat, mint például a könyvtárváltás, a parancsok előzményeinek átnézése, az SSH-hoz szükséges állomásnév megkeresése, egy folyamat megállítása, azonnali fájl előnézet a szintaxis kiemeléssel, és még sok más…

gyors demo

Most egy olyan eszközről fogok neked mesélni, amely megváltoztathatja a technikai életedet “előtte” és “utána” részekre. Hidd el – ez nem túlzás. Ismerd meg az fzf-et, ami a fuzzy finder rövidítése. Ahogy a definíció állítja, ez egy általános célú parancssori fuzzy finder. Ez nem hangzik túl leíróan és vonzóan azok számára, akik most hallanak róla először. De ez egy nagyon népszerű projekt, a Githubon körülbelül 21 000 csillaggal rangsorolva. Itt az ideje tehát, hogy eloszlassuk a ködöt, és mélyebb betekintést nyerjünk.

Ez a bejegyzés a témában nemrég készített screencastomhoz kapcsolódik. Szóval, ha olyan ember vagy, aki nézéssel tanul, nézd meg. Ellenkező esetben nézd meg te is ?, mert az olyan eszközöket, mint az fzf a legjobb élő demóval bemutatni, nem pedig tonnányi szöveggel.

Mivel a fzf projektoldalon egyelőre nincs demóvideó, ezt a bejegyzést “hiányzó demót találtam” címmel láttam el. De mostanra ez a videó már be lett húzva a fzf repóba, és a projekt readme részévé vált.

Fájlok keresése

Azok, akik parancssori környezethez szoktak, valószínűleg ismerik a Unix-szűrők fogalmát. Ilyenkor több független segédprogramot állítanak össze egy csővezetékké, hogy lépésről lépésre előállítsák a kívánt kimenetet. Ez a csővezeték például egy stringekből álló listát állít elő:

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

Minden program szűrőként működik. Egyszerűbben fogalmazva, a fzf csak egy újabb Unix-szűrő. Sorokat olvas be a stdin-ből, elindít egy interaktív kereső párbeszédet, és végül a kiválasztott elemeket a stdout-ba írja. A legfontosabb pont és különbség az olyan eszközöktől, mint a GNU find, az interaktív kereső párbeszéd, amely azonnal, gépelés közben szűri az elemeket.

“fzf” mint interaktív unix-szűrő

Ez eddig talán nem hangzik túl praktikusan, de a fzf elsődleges felhasználási területe a parancssori fájlkeresés. A fuzzy megfeleltetéssel és az azonnali visszajelzéssel csak néhány karakter választ el attól, hogy megtaláld a megfelelő fájlt, függetlenül attól, hogy milyen mélyen van elveszve a könyvtárhierarchiában. Nem kell visszaugrani a fájlkezelőbe, bejárni a könyvtárhierarchiát, bemásolni egy fájl elérési útvonalát, majd beilleszteni a héjba. Hasonlítsa össze az alábbiakban a “fájlkezelő” és az “fzf” munkafolyamatokat.

fzf vs. fájlkezelő összehasonlítás

fzf támogatja a fuzzy matchinget, így egyszerűen beírhat több karaktert egymás után, és a program olyan sorokat talál, amelyekben ezek a karakterek elszórtan vannak a karakterláncban. Alternatívaként a keresőkifejezés elé egy szimpla idézőjelet tehet, például 'string, ha csak a pontos egyezést szeretné választani, vagy fzf --exact .

fuzzy vs pontos egyezés

A program nem támogatja a reguláris kifejezéseket és a globális mintákat, így a *.sh minta nem működne. De maradjon egyszerű – ma a termelékenység és a sebesség a cél. Nincs szabadidőd a helyes reguláris kifejezések összeállítására és begépelésére. Ehelyett csak írjon be néhány szót, vagy akár szóközzel határolt szórészleteket, és ez a felhasználási esetek >90%-át lefedné. A fennmaradó 10%-hoz use ^ and $ a karakterlánc elejére, illetve végére való illesztéshez, és use ! az illesztés negálásához.

fzf illesztési szintaxis

A kiválasztott fájlok parancssorba való nyomtatása nem szuper hasznos, ezért általában a keresést valamilyen további művelettel kombinálják. Például megnyithatjuk a Vim-mel, vagy a kiválasztott elemeket átvezethetjük a következő programba.

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

Fuzzy completion for bash and zsh

A kényelmesebbé tétel érdekében a fuzzy completion kiváltható, ha a kurzor előtti szó a kiváltó szekvenciával végződik, ami alapértelmezés szerint **. Például írja be vim ~/path/** és nyomja meg a TAB billentyűt . Voilà, az fzf belép!

A kétcsillagos fuzzy completion

** szekvencia kiváltja a fzf keresőt, és hasonlít a *-re, ami a natív shell bővítésre szolgál. Egy bizonyos ponton akár el is felejthetjük a fzf jelenlétét, és azt a benyomást kelthetjük, hogy ez egy natív shell funkció.

A formátum a következő, ahol a FUZZY_PATTERN opcionális.

COMMAND **<TAB>

Ha nem tetszik a ** szekvencia, akkor használhatunk billentyűparancsokat. A CTRL+T kiváltja a fzf-ot, és beilleszti a kiválasztott fájlt a parancssorba, míg a ALT+C a kiválasztott könyvtárba vált.

Könyvtárváltás

Oké, elég a fájlok kereséséből. Beszéljünk más hasznos alkalmazásokról. A munkakönyvtár megváltoztatása egy ilyen gyakori művelet. Ennek ellenére mindig elakadok egy kicsit, amikor megpróbálom felidézni és beírni a helyes könyvtár elérési útvonalát, és közben több hibát is elkövetek. Ez lelassítja a tempómat. Ezt még a zsh kitöltések sem kompenzálják. De a fzf segítségével a könyvtárváltás gyerekjáték, függetlenül attól, hogy milyen mélyen és milyen messze van. Csak be kell írni cd **, és máris majdnem ott vagy.

a könyvtárváltás olyan, mint egy gyerekjáték

Megjegyezzük, hogy amíg az fzf indexeli a könyvtárfádat, rögtön elkezdheted a keresést. A könyvtárváltás a kedvenc felhasználási esetem, és a fuzzy matching itt igazán kiválóan teljesít. Ugyanannyi erőfeszítést igényel tőled egy könyvtár megváltoztatása, akár egy, akár tíz szint mélyen van.

ALT+C A gyorsbillentyű egy alternatív módja a fzf kiváltásának könyvtárváltási módban.

Parancselőzmények

A parancselőzmények kereséséhez a Ctrl+R billentyűparancs gyorsbillentyűt használhatod. Remek, de mi lenne, ha felturbóznád a fuzzy finderrel? Nézd meg és hasonlítsd össze.

Keresés a parancstörténetben

Elhelyezi a kiválasztott elemet a parancssorba, így tovább finomíthatsz rajta.

Keresd az SSH-hozzáférés állomásnevét

Ha backend fejlesztő vagy és több távoli szerverrel dolgozol, értékelheted a ssh+fzf kombót. Használja ugyanazt a kettőscsillagos kiváltási sorozatot, és írja be a ssh ** . Ez előhívja a nemrégiben használt IP-címeket és állomásneveket a ~/.ssh/config-ből, és egy interaktív keresőt hoz létre.

“fzf + ssh” combo

Szignál küldése egy folyamatnak

Néha jelet akarunk küldeni egy folyamatnak, de először meg kell szereznünk a PID-jét név szerint. Általában a pgrep <process_name>-t használjuk a PID feloldására, majd a by a kill <process_pid>-t követi at PID-re hivatkozva. Az fzf segítségével kombinálhatjuk a steps. Type kill <TAB> és az fzf lépéseket az összes folyamat listázása során. Nem kell többé külön folyamatfigyelőre váltani, mint például a Mac-en az “Activity Monitor”-ra.

Keresd meg a folyamatot és küldj jelet

Fájlok megtekintése keresés közben

Tegyük fel, hogy fájlokat keresel, de néha maga a fájlnév nem mond eleget. Ezért érdemes egy pillanatra belekukkantani egy fájl tartalmába, hogy döntést hozzon. fzf Ez a funkció itt is lefedi Önt.

Előnézeti ablak

Nálam alapértelmezés szerint az előnézeti ablak ki van kapcsolva, de bekapcsolom, ha bele akarok kukkantani a fájlokba. Ráadásul színes kimenettel és szintaxis-kiemeléssel bővítettem a bat mint előnézeti parancs használatával.

Szabályozás

Két fő módja van a fzf stock verziójának testreszabására:

  • A kereső dialógus viselkedésének megváltoztatása (előnézeti ablak, billentyűkombinációk, méretek, egyéni műveletek stb.). Lásd FZF_DEFAULT_OPTS környezeti változó.
  • A mögöttes keresési háttértár megváltoztatása. Alapértelmezés szerint a GNU find segédprogramot használja, de átválthat a fejlettebb eszközökre, mint az fd vagy a ripgrep. Először is, gyorsabb, mint a stock find segédprogram. Másodszor, ezek az eszközök tiszteletben tartják a .gitignore szabályokat, így nem kapsz node_modules vagy .git fájlokat a keresési eredményekben. A git ls-tree-t is használhatod a fájlok listázására, ha egy Git repóban vagy. Lásd a FZF_DEFAULT_COMMAND környezeti változót.

A beállítás a környezeti változókon keresztül történik. Itt van a részlet az én beállításomból. Nem biztos, hogy úgy működne, ahogy van, ha copy-n-paste, valószínűleg van még néhány hiányzó függőség. De ez csak azért van, hogy képet adjon arról, hogyan néz ki a konfiguráció.

Fzf és Vim

Eleddig csak parancssori használatot láttunk. De fzf Vim pluginként is szállítják. És hidd el, ha Vimmer vagy, érdemes hozzáadni a vimrc-edhez. A Vim-használat nem tartozik ennek a posztnak a tárgykörébe, különben senki sem olvasná el ?. De alaposan beszélek róla a videóm második részében, amit szintén a poszt elején linkeltem.

Ha türelmetlen vagy, itt egy kis részlet, hogy felhívjam a figyelmedet. Használja a :grep parancsot a projekt egészére kiterjedő szöveges kereséshez, nyissa meg a találatokat fzf ablakban teljes képernyős módban, szűrje tovább a találatokat fzf-on belül, és ugorjon a kiválasztott találatra. És ne feledkezzen meg az azonnali fájlelőnézetről a pontos sorpozícióban. Ez félelmetes, nem igaz?

fzf ❤️ vim

Következtetés

Remélem, lenyűgözött, milyen szuper király az fzf. Esélyes, hogy máris hajlandó vagy telepíteni és kipróbálni.

Ne feledd, hogy a fzf nem csak fájlkeresésre szolgál, bár ez az elsődleges funkciója. Mint láthatod, a “keresés + művelet” egy általános elv, de elég absztrakt és erős ahhoz, hogy bármilyen listával dolgozzon: fájlokkal, könyvtárakkal, folyamatokkal, hosztnevekkel stb. Emlékezzünk a bejegyzés elején – az fzf csak egy Unix szűrő. Engedd szabadjára a fantáziádat, etess meg vele bármilyen listát, és szabd a saját igényeidre. Inspirálódhatsz a rengeteg példából.

BTW, értékeld, mennyire felsőbbrendű a Unix filozófiája. fzf egy nagyszerű példa egy olyan programra, amely betartja ezeket az elveket.

  • a program egyetlen dolgot csináljon, és azt jól csinálja (egy felelősség elve)
  • tegye elég absztrakttá ahhoz, hogy irreleváns részletektől vagy adattípusoktól független legyen
  • különálló egyedi programokat állítson össze szabványos, jól definiált interfészek segítségével.

Szoftverfejlesztői pályafutása során tartsa magát ezekhez az elvekhez. A számos eszköz, nyelv és keretrendszer gyors születése és halála mögött álló alapelvek ismerete az, ami megkülönbözteti a profi fejlesztőket az amatőröktől.

Források

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

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

My Youtube channel. Csak néhány videó van, mivel az első lépéseimet teszem a screencastok készítésében. Legyetek türelemmel, ígérem, hogy több videót fogok készíteni. Alexey Samoshkin – YouTube – https://www.youtube.com/channel/UCfju8u-YOpNMO4CbyzIsc9Q.

sharkdp/fd: Egy egyszerű, gyors és felhasználóbarát alternatívája a ‘find’-nek – https://github.com/sharkdp/fd

BurntSushi/ripgrep: ripgrep rekurzívan keres könyvtárakat egy regex minta alapján – https://github.com/BurntSushi/ripgrep

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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.