Hlavní navigace

Souborový manažer ranger – konfigurace

Jan Knížek

Používáte VIM už nějaký ten pátek a nedáte na něj dopustit? Chtěli byste jej používat ještě více? Zkuste netradiční souborový manažer ranger, který se snaží přinést co nejvíce z VIMu do světa práce se soubory.

V minulém článku jsme si souborový manager ranger představili, dnes se podíváme na jeho konfiguraci.

Metadata souborů

Ve výchozím nastavení se u každého souboru zobrazuje jméno a vpravo jeho velikost, popř. počet souborů a podsložek v případě složky. Informací si ale můžeme zobrazit mnohem více. Stiskem M (pozor, velké M, nikoliv malé, které ukládá záložky) následovaným písmenkem režimu se zobrazení změní. Níže jsou uvedeny základní režimy. Je však možné si dodefinovat i vlastní.

i
Výpis podobný, jaký bychom dostali při zavolání příkazu file na každý soubor
f
Výchozí výše zmíněný výpis
t
Meta data, souborů vytvořená pomocí příkazu :meta; Zobrazená ve formátu  [[year - ]title] [authors]
m
čas poslední úpravy souboru
p
Oprávnění a vlastník
s
Čas poslední úpravy a velikost

Konfigurace

Veškerá uživatelská konfigurace se nachází v adresáři $XDG_CONFIG_HOME případně ~/.config/ranger. Spuštěním následujícího příkazu si do něj můžeme zkopírovat výchozí konfiguraci:

ranger --copy-config=all

Ekvivalent .vimrc najdeme v souboru rc.conf. Ranger při každém běhu spustí postupně jednotlivé řádky v řádkovém režimu. Můžeme tak snadno nastavit mapování kláves, či výchozí hodnotu přepínačů. Čtenáři doporučuji si soubor projít, volby jsou hezky okomentovány a nejjednodušší je tak je rovnou nastavovat.

Jako příklad si ukážeme vylepšení spouštění příkladů v shellu. Pokud chceme spustit nějaký příkaz v shell, stiskneme s a napíšeme daný příkaz. Bohužel výpis je ihned přepsán oknem manažeru. Přestože se tedy příkaz provedl, nevidíme výstup. Pomocí map si můžeme příkaz přemapovat tak, aby se automaticky ještě spustil příkaz read, který čeká, dokud nestiskneme enter.

map s console -p6 shell ; read

Příkaz console -p6 zajistí, že se vše zapíše do konzole ve stavovém řádku a přepínač nastaví kurzor na šestý znak, abychom mohli rovnou začít psát.

Výchozí programy pro otevírání souborů

Ranger ve výchozím nastavení umí otevírat spoustu souborů ve vhodných dostupných programech. Priorita mezi více dostupnými soubory je jednoduchá. Čím je program méně známý, tím vyšší má prioritu, protože se předpokládá, že když už jej uživatel nainstaloval, pravděpodobně jej bude používat. Naopak programy, které jsou typicky instalovány s prostředím (jako třeba konquerror) mají prioritu nízkou. Chování, které je definované v rifle.conf, je samozřejmě možné změnit. Čím výše je daná řádka, tím vyšší má prioritu. Stačí tedy vhodně přeházet řádky.

Náhled souborů

Pokud nastavíme přepínač preview_files na hodnotu True, ranger se pokusí zobrazit náhled souboru pod kurzorem ve třetím sloupci. Protože toto může být pomalejší na síťových discích. Mé osobní nastavení v rc.conf, které povolí náhledy všude, kromě složky s připojenými oddíly:

set preview_directories true
set preview_files true
setlocal path=/mnt preview_directories=False
setlocal path=/mnt preview_files=False

Jak přesně bude náhled zobrazen, určuje skript scope.sh, který si můžeme upravit dle vlastních potřeb. Pro co nejlepší funkčnost je nutné nainstalovat některé závislosti: file pro rozpoznání typu souboru, w3m pro náhled html stránek, či pdftotex pro zobrazení obsahu pdf dokumentů. Přesný seznam najde zájemce na oficiální stránkách.

Kromě obyčejných textových náhledů je možné také zobrazovat přímo obrázky. K tomu však potřebujeme kompatibilní emulátor terminálu. Terminály, které určitě fungují, jsou rxvt-unicode, xterm a st. Dále musíme nainstalovat w3m pro vykreslování obrázků. Na Arch Linuxu je obsaženo v balíku w3m, na debianu v w3m-img. Nakonec ještě přidáme do rc.conf řádku set preview_images true. Pokud nemáme povoleny náhledy souborů, pak je musíme také povolit. Nyní by se již obrázky měli zobrazovat ve své skutečné podobě.

Definování vlastních příkazů

Protože je ranger napsaný v pythonu, je možné jej bez problému rozšiřovat bez nutnosti kompilace. Můžeme si vytvořit libovolný řádkový příkaz prostým vytvořením třídy v souboru commands.py, který najdete v konfigurační složce. Pro příklady se můžeme podívat do souboru commands_full.py, kde jsou definovány některé příkazy. Navíc je na začátku v komentářích hezky vysvětleno, jak vytvořit nový příkaz.

Stačí vytvořit třídu, která dědí od třídy Command. Příkaz v rangeru pustíme jménem třídy. Nejdůležitější je metoda execute, jejíž účel je zřejmý. Kromě toho můžeme také definovat metodu tab, díky které můžeme doplňovat parametry pomocí tabulátoru. Pojďme si místo sáhodlouhého popisu raději ukázat příklad.

Představme si, že máme složku plnou video souborů a titulků k nim, a protože nemají systematická jména, přehrávač je nenajde. Vytvoříme si tedy příkaz, který vezme soubory z výběru, vybere, který z nich jsou titulky, a video spustí v mplayer. Příklad je jen ukázkový, takže kód předpokládá, že ve výběru budou titulky právě jednou s příponou srt a druhý soubor bude video podporované přehrávačem mplayer.

class prehraj(Command):
    def execute(self):
        if len(self.fm.thistab.get_selection())!=2:
            self.fm.notify("Ve výběru musí být přesně dva soubory.", bad=True)
            return

        if str(self.fm.thistab.get_selection()[0])[-3:]=="srt":
            tit,film=self.fm.thistab.get_selection()
        else:
            film,tit=self.fm.thistab.get_selection()

        self.fm.execute_command("mplayer '{0}' -sub '{1}'".format(str(film), str(tit)))

V požadované složce označíme třeba mezerníkem dva soubory a poté spustíme příkaz :prehraj, čímž se spustí metoda execute v naší třídě. Výběr najdeme jako prostý seznam pod jménem self.fm.thistab.get_selection(). Poté otestujeme, jestli první soubor končí písmenky srt. Pokud ano, první soubor jsou titulky a druhý video. Pokud ne, pořadí jen prohodíme. Na závěr již jen stačí pomocí zabudované metody self.fm.execute_command spustit mplayer se správnými parametry. Vidíme, že vytváření nových příkazu je velice jednoduché a může ušetřit spoustu práce. Můžeme si například vytvořit přikaz, který vezme archiv a dekomprimuje jej, či příkaz, který naopak zkomprimuje soubory ve výběru. Fantazii se meze nekladou.

Hezký trik na závěr

Ranger bohužel poněkud pomaleji startuje. Snadno se však můžeme vyhnout jeho opakovanému zapínaní v rámci jednoho terminálu. Přímo v rangeru můžeme spustit shell stiskem S, jehož pracovní adresář je aktuální složka. Pro návrat do rangeru pak jen stačí napsat  exit.

Trochu nešikovné je, že musíme si pamatovat, jestli nás exit vrátí zpět do ranger, nebo ukončí terminál. Kromě toho by také bylo hezké, aby se ranger přepnul do složky, ze které opouštíme shell. Toho se dá docílit několika šikovně mířenými řádky. Nejdříve v souboru commands.py definujeme:

class shellpath(Command):
    def execute(self):
        tmp=subprocess.run("mktemp", stdout=subprocess.PIPE)
        tmpFile=tmp.stdout.decode().strip()
        self.fm.execute_command("RANGER_WD='"+tmpFile+"' "+os.environ["SHELL"])
        with open(tmpFile, "r") as wd:
            self.fm.cd(wd.readline().strip())

Když v rangeru spustíme příkaz :shellpath, vytvoří se nový dočasný soubor pomocí programu mktemp a cesta k tomuto souboru se předá shellu, který spouštíme. Po skončení očekáváme, že v tomto souboru bude cesta posledního pracovního adresáře, ve kterém jsme se vrátili zpět to rangeru. Proto se tam jednoduše přepneme.

V shellu si pak vytvoříme následující funkci:

r() {
    if [[ -z "$RANGER_LEVEL" ]]
    then
        tempfile="$(mktemp)"
        ranger --choosedir="$tempfile" "$@"
        [ -f "$tempfile" ] && cd -- "$(cat "$tempfile")"
        rm -f -- "$tempfile"
    else
        pwd > $RANGER_WD
        exit
    fi
}

Ta nejdříve zjistí pomocí proměnné $RANGER_LEVEL, jestli je ranger spuštěný. Pokud ne, spustí jej. Kromě toho si pomocí stejného mechanismu výše zjistí složku, ve které byl ranger ukončen a přepne se do ní. Pokud ranger je spuštěný, tak jednoduše to dočasného souboru vloží aktuální pracovní adresář a skončí.

K dokonalosti již jen chybí přidat řádek map S :shellpath do rc.conf. Díky kteřem můžeme v rangeru stisknout S a dostat se do shellu a v shellu kdykoliv spustit r a dostat se do rangeru. Kromě toho se nám synchronizuje aktuální pracovní adresář. Pokud z nějakého důvodu nechceme, aby ranger dál běžel, ukončíme jej a dostaneme se do shellu, ve kterém bude opět synchronizován pracovní adresář.

Vidíme, že tímto poněkud zašmodrchaným postupem jsme připraveni na všechny alternativy a máme tak jistotu, že nikdy nespustíme ranger v rangeru, který běží v rangeru.

Doufám, že vás souborový manažer ranger zaujal. Doporučuji prostudovat dokumentaci a před smělými pokusy nejdříve zazálohovat.

Našli jste v článku chybu?