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…
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.
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
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
.
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 us
e ^ an
d $ a karakterlánc elejére, illetve végére való illesztéshez, és us
e ! az illesztés negálásához.
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!
**
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.
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.
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.
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_na
me>-t használjuk a PID feloldására, majd a by a kill <pro
cess_pid>-t követi at P
ID-re hivatkozva. Az fzf segítségével kombinálhatjuk a steps. Typ
e 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.
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.
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 stockfind
segédprogram. Másodszor, ezek az eszközök tiszteletben tartják a.gitignore
szabályokat, így nem kapsznode_modules
vagy.git
fájlokat a keresési eredményekben. Agit ls-tree
-t is használhatod a fájlok listázására, ha egy Git repóban vagy. Lásd aFZF_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?
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