Fzf plugin a Ranger-hez

Ranger bővítése, azaz plusz funkciókkal lesz jobban kezelhető a kedvenc terminálos fájlkezelőnk. A Ranger ismert és elterjedt fájlkezelő, sokban eltér a megszokott grafikus programoktól. Ezért sokan nem használják, bár gyorsan megtanulható és kis gyakorlás után már hatékony is lehet. Az alap bővítése sem sokkal nehezebb, hiszen a billentyű kombinációkhoz egy-egy parancs társítható. A bővítés, a funkciók beilletése sem bonyolultabb! Bár a legtöbb grafikus fájlkezelőben ezt plug-in módszerrel oldották meg, amikor egy fájlt, vagy csomagot töltünk le és azt automatikusan beépíti a rendszer magába, itt nekünk kell kézzel szerkeszteni. Igaz, van tucatnyi olyan hivatalos plug-in ami sima „bemásoljuk egy könyvtárba” módszerrel működik, azért ennél több található az interneten, amit nekünk kell beilleszteni a megfelelő konfigurációs fájlba. Ez sokakat elijeszt, mert félnek, hogy a Rangert elrontják.
Ettől nem kell tartani, hiszen ha egy, vagy több szöveges állományba kell valamit beírni, akkor nem tudjuk elrontani a Ranger programot. Ha mentjük a szöveges konfigurációs állományt, majd csak azután szerkesztjük bármikor visszaállítható az eredeti állapot. A legtöbben a mentésnél buknak el, a túlzott önbizalom okán ezt az egyszerű lépést elfelejtik megtenni.

A Ranger bővítése fzf kereséssel

A keresés az egyik leggyakrabban előforduló művelet, így azt érdemes bővíteni. Az fzf egy kis program, ami ezt gyorsabbá és hatékonyabbá teszi. Sok program kereső ezt használja, így előfordulhat, hogy már ismered is. Az fzf github oldalán elég jó leírást találsz, érdemes azt is elolvasni.

Az fzf Ranger integrációjához több megoldás is létezik, én egyet mutatok be. Ha ezt nem kedveled meg, akkor biztosan találsz másikat is.

Az első lépés minden esetben a leírások elolvasása. Majdnem mindig jól dokumentáltak a telepítéshez az ilyen kiegészítők, így nagy probléma nem lehet. Én azért választottam ezt, mert van hozzá egy videó is, ami kezdeti időben nem hátrány.

A teljes működéshez feltétlen telepíteni kell az elvárt függőségeket: ranger fzf findutils mlocate.
Ezek nagy valószínűséggel már fent lesznek a gépeden, így gyorsan átesünk ezen is.

A legtöbb leírásban nem jelzik, de én minden esetben azt javaslom, hogy a következő lépés előtt egy mentést tegyél meg. A mentés követően a meg kell nyitni a ~/.config/ranger/commands.py állományt. Ezt a leírások jellemzően nvim, vagy vim szerkesztővel ajánlgatják, ahogy a fenti github oldalon is. Bár alapvetően nem jelent gondot a vim, neovim stb. használata sem, de ha bizonytalan vagy ezekkel a szerkesztőkkel nyugodtan használj olyant, amit kedvelsz és ismersz. Nincs túl nagy értelme csak azért elrontani a telepítést, mert egy általad nem ismert szerkesztővel dolgozol!

# https://github.com/ranger/ranger/wiki/Integrating-File-Search-with-fzf
# Now, simply bind this function to a key, by adding this to your ~/.config/ranger/rc.conf: map <C-f> fzf_select
class fzf_select(Command):
    """
    :fzf_select

    Find a file using fzf.

    With a prefix argument select only directories.

    See: https://github.com/junegunn/fzf
    """
    def execute(self):
        import subprocess
        if self.quantifier:
            # match only directories
            command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \
            -o -type d -print 2> /dev/null | sed 1d | cut -b3- | fzf +m"
        else:
            # match files and directories
            command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \
            -o -print 2> /dev/null | sed 1d | cut -b3- | fzf +m"
        fzf = self.fm.execute_command(command, stdout=subprocess.PIPE)
        stdout, stderr = fzf.communicate()
        if fzf.returncode == 0:
            fzf_file = os.path.abspath(stdout.decode('utf-8').rstrip('\n'))
            if os.path.isdir(fzf_file):
                self.fm.cd(fzf_file)
            else:
                self.fm.select_file(fzf_file)
# fzf_locate
class fzf_locate(Command):
    """
    :fzf_locate

    Find a file using fzf.

    With a prefix argument select only directories.

    See: https://github.com/junegunn/fzf
    """
    def execute(self):
        import subprocess
        if self.quantifier:
            command="locate home media | fzf -e -i"
        else:
            command="locate home media | fzf -e -i"
        fzf = self.fm.execute_command(command, stdout=subprocess.PIPE)
        stdout, stderr = fzf.communicate()
        if fzf.returncode == 0:
            fzf_file = os.path.abspath(stdout.decode('utf-8').rstrip('\n'))
            if os.path.isdir(fzf_file):
                self.fm.cd(fzf_file)
            else:
                self.fm.select_file(fzf_file)

A fájl megnyitása után a végére be kell illeszteni az ajánlott sorokat. Mentés.

A hivatalos verzió ez, én itt is kiegészítettem a a teendőket. Nagyon jó, ha valamivel kiegészítjük a programunkat, vagy egy konfigurációs fájlba változtatások eszközölünk. Ma és esetleg holnap még azt is tudjuk, hogy hol szedtük össze, vagy miért is írtuk át a sorokat. De ha legközelebb is tudni akarjuk, akkor azt fel kell jegyezni. A legegyszerűbb, ha kikommentelt sorban a változtatások elé beírjuk a konfigba. Itt a példa is mutatja, hogy erre nem csak én gondoltam, hanem a szerző is. Pár kikommentelt sor nem teszi olvashatatlanná a konfigot, de később segíteni fog. Itt is érdemes ezt megtenni, mert a kezdő, kikommentelt sorokban a link már nem működik.
Ha az elejére írtad a kommentet, a végét is érdemes megjelölni, hogyha később ki akarod törölni, tudd meddig tart.

A használata

Két lehetséges megoldás van a használatára. Mindegyiket próbáld ki! A Ranger (és a legtöbb ilyen Linuxos program) több lehetőséget ad egy-egy funkció elérésére. Azt használjuk, ami kézreálló és kényelmes. Alapesetben ez a két lehetőség a parancsbeviteli mező megnyitása a : gombbal és a parancs beírása.
:fzf_select illetve a :fzf_locate begépelése adja meg a funkciót, enter, majd a keresendő állomány nevét, vagy annak egy részét írjuk be. Ez gyors megoldás, kényelmes. A keresés hamar lefut, gépelés közben láthatóan szűkül a lista.

A másik megoldás a billentyű kombináció használata. A ~/.config/ranger/rc.conf fájlban a megszokott módszerrel megadhatod a kívánt beállítást. Itt is érdemes magyarázattal ellátni a sorokat.
Apró tipp: minden, szó szerint minden billentyű kombinációval megy a Ranger vezérlésénél. Minden. Ami több tucat alap és több tucat kiegészítő kombinációt jelent. Ezt fejben tartani nem lehet, főleg, ha sok saját szkriptet, parancsot is használsz. Érdemes lehet ezeket valami rendszerbe foglalni, és azt a rendszert betartani. Így könnyebb lesz megjegyezni őket.

Én ilyen rendszert használok: A keresési és hasonló funkciókhoz az f(ind) rendeltem. Így a
ff az eredeti, a Ranger által adott keresés
fs a fzf_select
fl a fzf_locate
stb. stb. billentyű kombinációkat kapta. Ha lenyomom az f betűt a Ranger kilistázza az összes f betűs kötéseket, és így mindig kapok súgót is.

Gyors és egyszerű a Ranger használata, ha megismerjük a lehetőségeket!

Ami még fontos

A konfigurációs fájlok szerkesztése után le kell állítani a Ranger fájlkezelőt, majd újraindítani, hogy beolvassa az összes állományt.

Egyszerű? Az! Jogos kérdés, hogy ha ilyen egyszerű a Ranger, akkor miért írtam róla ennyit? Az oka egyszerű: ha eddig eljutottál, már tudod, hogy nem kell tartani a Ranger bővítésétől, nem tudod elrontani. Így már bármilyen elgondolásodat, bővítésedet megteheted, megfelelő magabiztossággal, rutinnal.

Ha tetszett a bejegyzés látogass el a blogomba: https://magyarlinux.hu/

A youtube csatornám: https://www.youtube.com/channel/UCk1lOfX4qlaeEk2VhLu5DRg

Ha a bejegyzéshez tartalmi kiegészítést teszel, amit érdemes lehet az eredetibe is elhelyezni, akkor azt jelezd a linuxvideok@protonmail.com címemere! A blog alatti hozzászólásokat nem mindig nézem.