Dnes vydávám Mini Commander verze 2.0, novou verzi malého dvoupanelového správce souborů pro Linux. Je napsaný v C, používá ncurses a obsahuje vlastní prohlížeč i editor souborů. Hlavními novinkami jsou podpora UTF‑8, pohodlnější práce s názvy souborů a několik důležitých oprav kopírování, přesouvání a ukládání. Aktuální binárka má 64 KiB, staticky slinkovaná binárka zabírá přibližně 120 KiB.
Původní Mini Commander vznikal s pomocí ChatGPT 4. Při přípravě nové verze pracoval ChatGPT Astra 6, který sám navrhl a implementoval řadu změn a oprav ve stávajícím kódu. Od předchozího vývoje s ChatGPT 4 se podle mé zkušenosti AI programování zlepšilo extrémním způsobem. Na tomto projektu se to projevilo schopností procházet související části programu, hledat chyby, upravovat implementaci a ověřovat výsledek. Součástí práce bylo dokonce sestavování a testování linuxových binárek v QEMU a měření různých optimalizací velikosti (Astru jsem spouštěl totiž na Windows, samo od sebe se to rozhodlo stáhnout QEMU a nějakou náhodnou linuxovou distribuci, aby to v ní všechno vyzkoušelo).
Nejviditelnější změnou tohoto vydání je podpora UTF‑8 v panelech, prohlížeči, editoru a vstupních polích dialogů. Implementace rozlišuje pozici v bajtech od sloupce na obrazovce. To je důležité nejen pro českou diakritiku, ale také pro znaky zabírající dva terminálové sloupce a pro kombinující diakritická znaménka. Zkrácení dlouhého názvu už nerozdělí vícebajtovou sekvenci a pohyb kurzoru či mazání v editoru respektují hranice znaků. Program nyní používá širokoznakovou variantu ncurses, tedy ncursesw. Podpora má ještě své hranice: složené emoji sekvence se nezpracovávají jako jeden celek, ale to budeme ignorovat.
Vestavěný editor, dostupný přes F4, získal také základní zvýrazňování syntaxe C a shellových skriptů. Rozpoznává soubory .c,.h a .sh; shellové zvýraznění zapne i u souboru začínajícího shebangem #!/. Pravidla používají regulární výrazy, které se kompilují při otevření editoru, takže se tato práce neopakuje při každém překreslení. Přibylo rovněž hledání textu přes F7, další výskyt najde Shift+F7. Hledání ignoruje velikost písmen podle aktivního locale. Při práci s neobvyklým obsahem pomůže stavový řádek s pozicí v bajtech a Unicode kódem znaku pod kurzorem.
Pro běžné souborové operace přibyly zkratky Shift+F5, Shift+F6 a Shift+F7. Otevřou dialog kopírování, přesunu či přejmenování nebo vytvoření adresáře s předvyplněným názvem položky pod kurzorem, bez její cesty. Kurzor je připravený k úpravě názvu a psaní původní text rovnou nezahodí. Například pro vytvoření kopie config pod názvem config.old stačí použít Shift+F5 a dopsat příponu. Relativní cílová cesta se vyhodnocuje vůči aktivnímu adresáři.
Drobnou změnou prošlo také řazení podle názvu: položky začínající tečkou mají přednost. Platí to při vzestupném i sestupném řazení,.git se tak zobrazí před názvem začínajícím například plusem. Zbytek porovnávání nadále používá strcmp(), takže jde o bajtové řazení rozlišující velikost písmen. Česká abecední pravidla ani přirozené řazení číselných částí názvů tato změna nezavádí.
Důležitější než pořadí položek jsou opravy kopírování a přesouvání. Kopírování nyní kontroluje, zda zdroj a cíl nejsou tentýž soubor. Porovnává zařízení a inode, tedy st_dev a st_ino, což zachytí i případ dvou různých názvů představujících pevné odkazy na stejný soubor. Přesouvání nově vyžaduje potvrzení před přepsáním existujícího cíle. Kde je k dispozici potřebná podpora, používárenameat2() s příznakem RENAME_NOREPLACE , který odmítne přepsat existující cílovou položku. Na starších systémech zůstává náhradní postup s kontrolou existence a běžným rename();
Editor dostal také spolehlivější ukládání souborů. Zapisuje do dočasného souboru ve stejném adresáři, kontroluje chyby zápisu, obnovuje vlastníka, skupinu a unixová oprávnění a před nahrazením cíle volá fsync(). Při editaci přes symbolický odkaz upravuje jeho cílový soubor a samotný odkaz zachová. Pokud ukládání selže, například kvůli nedostatku místa, editor ponechá změny v paměti a oznámí chybu. Opravena je i nenápadná chyba, kdy stisk mazací klávesy na místě, kde nebylo co smazat, mohl nesprávně zrušit příznak neuložených změn.
Další opravy se týkají názvů souborů jako vstupních dat. Názvy obsahující procenta se v dialozích předávají jako text, takže například %s uvnitř názvu není formátovací instrukce. Spuštění vybraného programu zase používá přímo fork() a execl(). Název souboru se díky tomu neposílá shellu k interpretaci a mezery nebo středníky v něm nemají význam oddělovačů příkazů. Příkazy, které uživatel vědomě napíše do příkazového řádku Mini Commanderu, si běžné shellové chování zachovávají.
Pro nasazení do menších systémů je připravený automatizovaný statický build pro 32bitové x86, konkrétně i686. Skript stáhne vlastní toolchain, musl a ncurses, ověří archivy pomocí pevných SHA‑256 součtů a vše sestaví v dočasném adresáři bez systémové instalace knihoven. Do programu jsou zabudované popisy terminálů linux, vt100, xterm,screen a tmux, včetně příslušných 256barevných variant. Výsledek tak nepotřebuje sdílené knihovny libc a ncurses ani externí databázi terminfo. Na 64bitovém x86 Linuxu potřebuje zapnutou podporu spouštění 32bitových programů v jádře.
Ve výchozím nastavení se statická binárka komprimuje pomocí UPX. Běžný build přes make automatické balení pomocí UPX neprovádí.
Při ladění velikosti se ukázalo, že samotné přidávání dalších optimalizačních přepínačů nemusí vést k menšímu souboru. Program i knihovny už používaly -Os, odstranění nepoužitých sekcí a stripování symbolů. Největší další úsporu přineslo explicitní -fno-pie při kompilaci: linker sice už používal -no-pie, ale překladač stále standardně generoval kód pro PIE. Jde o dvě odlišné části sestavení, jak popisuje i dokumentace GCC. Na stejných zdrojích se podařilo dostat zabalený program ze 129 816 na 123 296 bajtů, přibližně o pět procent níž. LTO pro ncurses ani agresivnější režim UPX lepší finální výsledek nepřinesly.
Zdrojové kódy, statická binárka i návod k sestavení jsou v repozitáři Mini Commanderu na GitHubu. Budu rád za zkušenosti z dalších distribucí a terminálů, zvlášť pokud narazíte na problém s neobvyklým názvem souboru, kódováním nebo kombinací kláves.
Hezká věcička. Za mě trochu zbytečné vymýšlet nové kolo, ale zase proč ne. Proti gustu ...
Osobně jsem si prošel na Linuxu tolika souborovými správci, že to ani nespočítám. Nakonec jsem ale po nějaké době vždy zpět u MC. Chvíli jsem zakotvil také u Yazi, a podobných, ale jen do doby, než jsem potřeboval pracovat rychle s minimálním mentálním modelem. Filozofii přístupu "vizuální pohled dvou panelů (odkud kam)" jen těžko něco skutečně nahradí.
Pár věci je přeci jen ale potřeba na moderním desktopu, a tak jsem si MC trochu upravil. Je to především možnost přepínání světlé/tmavé téma pomocí kl. zkratky, funkce koše pomocí 'gio', podpora schránky pro Wayland desktopy a ještě některé další maličkosti.
Switch between light and dark skins Alt+Shift+T
Move to trash Delete, F12
Delete permanently F8, Shift+Delete
Copy full path Alt+Shift+F
Copy parent directory path Alt+Shift+D
Copy item name Alt+Shift+N
Copy item to clipboard Alt+Shift+C
Moderní MC si můžete sami zkompilovat, větev mc-modern
https://github.com/tomasmark79/mc
Jestli potřebujete pracovat "rychle s minimálním mentálním modelem", tak doporučuju co nejjednoduššího správce. Třeba takový nnn, který má sice jenom jeden panel, ale ten zahrnuje osm "tabů" mezi kterými se triviálně přepínáte (klávesy 1-8) - jednodušší model, stejná efektivita. Pro mě je nnn naprostá jednička pro práci se soubory když nemám grafické prostředí (jinak normálně používám Double Commander).
Každopádně dneska už bych správce souborů bez podpory tabů nepoužíval - to zahrnuje jak MC, tak i tenhle jeho jednodušší klon.
Snažil jsem se přizpůsobit se k Yazi. Jsou tam také karty. A je to celkem intuitivní. Ale mám jakýsi problém zatěžovat mozek nutností myslet na to, kam vlastně chci kopírovat. Když není cílová destinace stále na očích, je to ve skutečnosti problém, který se musí kognitivně zpracovávat při každém přepnutí tabu OD - DO. Jednou, dvakrát ano. Vícekrát je to prostě otrava. A když přijde na řadu např. potřeba nějak "uklidit" dvě složky s hromadou obsahu, tak je Yazi nepoužitelné.
Tím jsem samozřejmě nevysvětlil proč používám MC. Ten používám proto, abych nemusel přepínat mezi servery a desktopem a používat jen jeden nástroj všude. Nakonec i v MC je možnost mít pravou stranou jako živý náhled aktuálního souboru na levém panelu. V MC je toho opravdu mnoho k objevování. Ale fandím i novému přístupu, který zmiňujete.
V minulosti jsem párkrát zaslechl, že MC je údajně napsaný tak řekněme nehezky, že se tím zdrojákem nikdo moc zabývat nechce. To by se pak mělo projevovat na úpravách, nových funkcích, ... . Ale jak říkám, zaslechl jsem. Sám to neumím posoudit, takže bych autorům nerad křivdil. Osobně ten produkt používám.
Je to přesně tak. Sám mám vlastní MC-like commander napsaný s pomocí Claude v Rustu. Dělá, co po něm chcijá a třeba unzip v něm mám za okamžik, na rozdíl od mc.
Hmm, já takhle uvažoval o něčem na obrázky. FastStone Image Viewer je super, ale je to napsané v BorlandC nebo Delphi pro Windows. Umí to skoro přesně to, co potřebuji, kromě měření. V Linuxu je Qwenview, který mi nevyhovuje, ale aspoň má anotace, spectacle na screenshoty co má ořez a anotaci taky, a Nomacs, který je "divný", umí pracovat s jednou složkou, ale zase je strašně rychlý, zatímco Qwenview je při čtení adresáře se stovkami větších souborů (kopie karty z foťáku) příšerný a chybí mi v něm taky funkce a rychlé ovládání.
Asi bych to psal zhruba C++, libtiff, opencv, ... bohužel abstrakce nad formáty obrázků se mi nikdy neosvědčila, protože často neřeší speciality formátů (pyramidální/dlaždicový tiff, více stránek, metadata, náhledy...)
"...bohužel abstrakce nad formáty obrázků se mi nikdy neosvědčila..."
Mnohem lepší než takovouhle zhovadilou otročinu je udělat program jako rozhraní do knihovny, která už je sama o sobě abstrakcí nad jednotlivými formáty (např. GraphicsMagick/ImageMagick).
Qwenview, Nomacs... to jste si prošel podobnou cestou jako já. Na vyzkoušení můžu doporučit ClassicImageViewer, který je rychlý, psaný v C++ (Qt6) a má architekturu přesně jako jsem popsal (rozhraní do GraphicsMagick).
Bolo by fajn keby sa dalo zapnut vyhladavanie suborov ako vo FAR manageri, teda alt+znak hned zacne hladanie v aktualnom adresari.
Vo FAR je tiez sikovna vec kombinacia ctrl+[0-9] ako skratka adresarov a ich rychle definovanie cez shift+ctrl+[0-9]. Ak je adresarov na danu klavesu definovanych viac ako 1, zobrazi sa ich zoznam. V zozname sa daju definovat skratky, ak nie su definovane tak FAR ich vyberie a vyznaci automaticky podla prvych unikatnych pismen nazvu daneho riadku.
Originální midnight commander i mini-commander toto umí, jen je potřeba zmačknout Alt+S
pak psát písmena. Taky jsem byl kdysi dávno zvyklý na Alt+písmena přímo, ale velice jednoduše jsem si na Alt+S zvykl taky.
Dobry den,
dakujem za odpoved.
Viem ze mc toto vyhladavanie cez alt+s maju, pouzivam to v mc so zatatymi zubami roky, ale stale sa mi ten alt+pismeno sposob z FAR zda lepsi.
Tych 10 skratiek na rychly skok do adresara (plus nasobne skratky pri duplicite) ale mc nema a vo FAR je to velmi efektivne.
Tiez je v mc komplikovane editovanie F2 user menu.
Tomáš je autorem několika více či méně známých projektů jak z oblasti operačních systémů, tak internetu. V současnosti samozvaný expert na Linux, Bash, PHP a MySQL.
Přečteno 45 601×
Přečteno 27 256×
Přečteno 22 216×
Přečteno 21 040×
Přečteno 15 319×