„Simple Emacs Spreadsheet“ alebo „Starý Excel, ten ťa už unavil nakoniec“
„Mami, kúp mi tabuľkový procesor.“ „Nič také, máme tabuľkový procesor doma.“ A je to tak. V GNU Emacs. Mama ma vždy pravdu
WTF!
Slabšie povahy by konštatovanie uvedené v perexe mohlo zaskočiť? Tabuľkový procesor/editor/spreadsheet - v Emacse…? No čo si to tí ľudia už nedovoľujú, že áno? A ešte ten dovetok s Excelom - tu je určité prepojenie na sériu článkov o Emacse a Worde.
Už samotná myšlienka tabuľkového procesora v textovom režime sa zdá podivná. Ale nebolo tomu vždy tak, a samozrejme všetko začalo pradávno, keď textový (a len textový) režim bol doménou profesionálneho používania počítača. A naopak - malé 8-bity mali len grafický režim, ktorý textový dokázal emulovať, ale kvôli nízkemu rozlíšeniu pomerne nekvalitne a nevhodne pre dlhodobú prácu.
Len narýchlo spomenieme, že Microsoft Excel alebo Libre(Open)Office Calc tu neboli odjaživa. V minulosti bol veľmi rozšírený Lotus 1-2-3, ja som roky pracoval s Quattro Pro, ktorý mal síce aj grafický režim, ale dobové počítače sa pri práci s ním „zadýchavali“, preto bol tento vhodný len na prácu s grafmi. Užívatelia Apple ][ mali k dispozícii Visicalc a viacero grafických režimov, i monochromatický, ktorý si dobre poradil s požadovanou ostrosťou znakov. A tak ďalej. Neskoršia história, ktorá ale nie je predmetom tohto zápisku, spoznala už prevažne len grafické programy, ako český Calc602,… a potom klasika - MS Excel, Gnumeric, KSpread a samozrejme Libre(Open)Office Calc či ONLYOFFICE Spreadsheet Editor.
![]() |
Obr. 0: Známy Lotus 1-2-3. |
![]() |
Obr. 1: A možno menej známe Quattro Pro, v textovej i grafickej verzii. |
V GNU/linuxovom svete existujú samozrejme tiež textové tabuľkové procesory vhodné pre konzolu. Asi najznámejší je SC, ale tiež Teapot, ktorý umožňuje pridať tabuľkám i tretí rozmer a tým ich poriadne zneprehľadniť (ale zase možno na to nazerať aj ako na ďalšiu vrstvu dát viažúcich sa k aktuálnej bunke, ktoré by sme inak museli mať v osobitnej tabuľke alebo liste).
![]() |
Obr. 2: SC pre súčasný svet. |
Takže textové tabuľkové procesory nie sú tak exotické a už vôbec nie nepoužiteľné. Napríklad ja v svojej praxi tvorím tabuliek veľmi veľa - ale zase grafov minimum, takže nepotrebujem grafický režim.
A - ako dobré by pritom bolo zostať v hrejivom objatí GNU Emacs.
SES - Simple Emacs Spreadsheet
A veru v onom objatí aj zostaneme.
Osobne tvorím množstvo tabuliek v známom org mode, ktorému sme už venovali veľa pozornosti. Ten umožňuje nakresliť automatizovane tabuľky, ktorých čiary, bunky,… sa dynamicky prispôsobujú obsahu (takže žiadne pracné kreslenie ASCII znakov). Dokáže zaiste prevádzať s údajmi numerické operácie a to pomocou vstavaných funkcií, vlastných vzorcov a tiež pomocou elispových funkcií derivovaných zo silného calc módu.
Výhodou je, že tieto tabuľky sú pekne integrované do ostatného textu, môže sa potlačiť ich export (takže napríklad v ponukách mám priamo výpočty, ale tie sa neexportujú a teda ich nevidí ten, ktorý ich vidieť nemá). Dokážu pracovať s gnuplot a tiež s nadstavbami pre legder účtovníctvo. A je toho viac. V podstate nemajú žiaden neduh, nevýhodu. Až na to, že to nevyzerá ako prostredie tabuľkového procesora.
![]() |
Obr. 3: Tabuľka v org mode. |
Ale aby toho nebolo málo, Emacs nám ponúka aj niečo naviac. A konečne sa dostávam k Simple Emacs Spreadsheet. A je skutočne „simple“, ale pritom silný. Nech láskavý čitateľ posúdi sám.
Zadávanie údajov
Vytvoríme si súbor s príponou .ses
, ktorá automaticky invokuje rovnomemenné rozšírenie.
Údaje do tabuľky zadávame - no proste klasicky, akurát s jedným rozdielom, že textové reťazce zadáme znakom "
.
Niektoré užitočné klávesové skratky a príkazy:
Klávesová skratka | Alt. príkaz | Funkcia |
---|---|---|
C-o | ses-insert-row | vloženie riadku |
M-o | ses-insert-column | vloženie stĺpca |
C-k | ses-delete-row | zmazanie riadku |
M-k | ses-delete-column | zmazanie stĺpca |
w | ses-set-column-width | nastavenie šírky stĺpca |
TAB | ses-forward-or-insert | presun kurzora do bunky napravo |
C-j | ses-append-row-jump-first-column | vloženie nového riadku a presun kurzora do stĺpca A |
Aha - asi treba spomenúť, že stĺpce sa značia písmenami a riadky číslami. Že to je úplne normálne? Dozaista je, hoci v org-mode sa dá používať i adresovanie @<riadok>$<stĺpec>
. Spomínať fakt, že pri vkladaní buniek sa menia adresy a odkazy na bunky vo vzorcoch je zrejme zbytočné.
![]() |
Obr. 4: Plníne tabuľku údajmi. |
„Printer“ funkcie
Je trochu nezvyčajný názov pre formátovanie. Výzva na špecifikovanie sa zobrazí po stlačení p
. Aké máme možnosti?
Príkaz | Funkcia |
---|---|
ses-center | centrovanie s vizuálnym orezaním údajov podľa šírky stĺpca |
ses-center-span | centrovanie, ale tentokrát s presahom do nasledujúcej bunky |
ses-dashfill | centrovanie, ale namiesto znaku medzera sa použije - |
ses-dashfill-span | detto, ale opäť s presahom dlhého textu |
ses-tildefill | centrovanie, ale namiesto znaku medzera sa použije ~ |
ses-tildefill-span | detto, ale opäť s presahom dlhého textu |
nil | defaultné zarovnanie vpravo |
-vlastná funkcia- | definovanie vlastného formátovania |
Definovanie vlastného formátovania
Tu sa dostaneme na tenší ľad, ktorý možno pre niekoho bude príliš tenký a aby sa vyhol ľadovému kúpeľu, radšej rýchlo ujde z prostredia SES.
Definovanie vlastného formátovania môže byť napr. také:
(ses-define-local-printer 'euro (lambda (udaj) (cond ((null udaj) "") ((numberp udaj) (format "%.2f €" udaj)) (t (ses-center-span udaj ?# 'ses-prin1)))))
Rýchly opis: ak udaj
je rovný prázdnemu reťazci, neudeje sa nič; aj je zadané číslo, tak naformátuje udaj
definovaným formátom; ak je tam iný typ ako číslo, tak ho zobrazí vycentrované so znakom #
naokolo.
A kde to zadať?
Ako často v živote, pravda je skrytá pod povrchom. V Emacse exituje systém zužovania a rozširovania pohľadu; na to slúžia funkcie narrow-to*
a widen
. Potlačený (neviditeľný) text a údaje sa samozrejme nestratia, len nie sú zobrazovné.
Ak si v našom .ses dokumente zavoláme widen
, napr. pomocou M-x
alebo skratkou C-x n w
, tak sa odhalí zvyšok buffera, v ktorom sú uložené samotné obsahy buniek i formátovacie príkazy a vlastnosti.
A práve pod tieto si môžeme dávať naše vlastné funkcie.
![]() |
Obr. 5: Zúžený a rozšírený pohľad (na vec). |
![]() |
Obr. 6: Vlastná funkcia na konci dokumentu. |
Vzorce
Bez vzorcov by tabuľkový procesor nemal zmysel. SES používa lispovú infixovú syntax, ktorá zrejme nie je úplne bežná. Mne nerobí plynulo prechádzať z postfixovej, nakoľko používam výlučne kalkulačky s reveznou poľskou notáciou (kde operátory sú zadávané až za operandami) na inú, hoci aj infixovú alebo „klasickú algebraickú“.
Jednoducho zadáme vzorec na sčítanie 2. stĺpca napísaním (+ B2 B3 B4)
.
Druhou možnosťou je použitie vstavanej funkcie: (ses+ B2 B3 B4)
. Tá je navyše „odolnejšia“ a ignoruje nelogické zadania, napríklad ak je v stĺpci zadaný text alebo aj nič, tak to proste pri sčítavaní preskočí.
A do tretice zadaním rozsahu: (apply 'ses+ (ses-range B2 B4))
.
Vyhodnotíme si to odzadu: (ses-range B2 B4)
vytvorí zoznam hodnôt. Na tento aplikujeme funkciu ses+
(alebo aj inú). Nakoniec apply
je funkcia, ktorá berie ako prvý argument funkciu (ses+) a ako druhý argument zoznam hodnôt. Podivný znak '
hovorí: ses+ je symbol a nebude sa vyhodnocovať na hodnotu, ale namiesto toho sa použije ako referencia na funkciu ses+ (zjednodušenie mu povieme, že ses+ nie je slovo „ses+“ ale rovnomenná funkcia).
Tento prístup zaiste ľudí odradí - v porovnaní s „klasickými“ programami. Ale je to len otázka zvyku. Samozrejme, nič nám nebráni si na to spraviť makro alebo obaľujúcu funkciu:
(defun sum (start end) "Vráti súčet hodnôt od START po END." (apply 'ses+ (ses-range start end)))
Túto funkciu využijeme takto: (sum B2 B4)
. A už je to veselšie. A hneď vidíme, že už nie sme a nebudeme obmedzovaní funkciami, ktoré ponúka samotný program.
Výber buniek sa dá robiť aj myšou, ale kto by sa takým stochastickým zariadením zaoberal 🙄.
SES navyše ešte dokáže usporiadať údaje v stĺpcoch.
Export + import
V deväťdesiatych rokoch sa toto spojenie často používalo i v názvoch firiem. Ako Super-tuti Export-import. Aby bolo jasné.
V SES je to takto:
Klávesová skratka | Alt. príkaz | Funkcia |
---|---|---|
x t | (ses-export-tsv) | Exportuje hodnoty v tabuľke (alebo rozsahu) ako údaje oddelené TAB . |
x T | (ses-export-tsf) | Exportuje vzdorce v tabuľke (alebo rozsahu) ako údaje oddelené TAB . |
Exportovaný text sa presunie do schránky. Stĺpce sú oddelené tabulátormi, riadky novými riadkami.
Import sa deje vložením údajov zo schránky, ak tieto obsahujú tabulátory alebo nové riadky, tak sa korektne vložia do tabuľky.
(Vloženú) tabuľku je možné ľahko konvertovať i do org módu pomocu org-table-covert-region
.
| Verzia jadra | Počet súborov | Formátovaný typ | Suma všetkých buniek | | 1.0 | 561 | 20.555 | 3 | | 2.0 | 2048 | 10.5 | 10 | | 2.6.0 | 17784 | 20.3 | 1 | | | | | | | Σ | 20393 | 51.355 | 20458.355 | | ---------Σ €-------- | | | 20444.355 | | Verzia jadra | Počet súborov | Formátovaný typ | Suma všetkých buniek | | 1.0 | 561 | 20.555 | 3 | | 2.0 | 2048 | 10.5 | 10 | | 2.6.0 | 17784 | 20.3 | 1 | | | | | | | Σ | (apply 'ses+ (ses-range B2 B4)) | (sum C2 C5) | (apply 'ses+ (ses-range B2 D4)) | | ---------Σ €-------- | | | (sum B2 D5) |
Pár poznámok na záver
Bunky je možné i pomenovať pomocou ses-rename-cell
a potom k nim pristupovať (alebo sa na ne presúvať a tiež si ich zobraziť a používať pri zadávaní vzorcov) pomocou tohto identifikátora.
Tiež je možné namiesto prvého (hlavičkového) riadku (A B C D …
) mať umiestnené názvy buniek v prvom riadku. To sa udeje pomocou (ses-set-header-row)
.
Dátová oblasť (normálne skrytá)
Tá sa začína znakom posuvu formulára (ktorého kód ASCII je 014 v osmičkovej notácii), za ktorým nasledujú sady makier a definície buniek pre každý riadok, za ktorými nasleduje sada definícií formátovania buniek, za ktorými nasledujú šírky stĺpcov, formát a hlavička riadku. Potom sú tu globálne parametre (ID formátu súboru, počet riadkov, počet stĺpcov, počet lokálnych tlačiarní) a lokálne premenné.
Pri načítaní súboru SES sa najprv načítajú globálne parametre, potom sa vyhodnotí celá oblasť údajov a nakoniec sa spracujú lokálne premenné.
Dátovú oblasť možno upravovať, ale okrem časti s lokálnymi premennými neradno vkladať ani odstraňovať žiadne nové riadky, pretože SES lokalizuje veci počítaním nových riadkov (newline). Pomocou C-x C-e
na konci riadku sa presunú úpravy do dátových štruktúr tabuľky, pričom sa ale ešte neaktualizuje oblasť tlače, to treba spraviť ručne C-c C-l
.
Ale lepšie je samozrejme do toho nezasahovať a nechať to na Emacs.
A to je vari aj všetko. Pár ďalších detailov možno nájsť na https://www.gnu.org/software/emacs/manual/html_mono/ses.html.
Záver
Simple Emacs Spreadsheet dozaista nie je ťažkotonážny nástroj a ani sa ním nesnaží byť. Nezvláda parádičky ako orámovanie, zmeny fontov, hyperlinky, obrázky.
Ale to neznamená, že je na nič. Je práve na to, načo bol určený: na rýchle usporiadanie údajov v tabuľke spolu s príslušnými numerickými operáciami. Prepojenie so vstavaným calc mu umožňuje vykonávať i ťažšie výpočty, od diferenciálneho počtu po štatistiku.
A keďže sme stále v jednom prostredí, môžeme to jednoducho linkovať s inými štruktúrami a rozšíreniami, námatkou e-mail alebo zettelkasten.
Pre pridávanie komentárov sa musíte prihlásiť.
V 1986 roku vznikol veľmi slušný Shareware tabuľkový procesor v DOSe As-Easy-As. Dosť dlho sme ho v práci používali hlavne na výpočty cien výrobkov. Bol rýchly a jednoduchý. Jediné, čo bolo trošku obmedzujúce bolo, že sa nedalo uložiť do jednoho adresára viacej než 512 súborov. Kolega k tomu dokonca niekde vyhrabal aj zdrojový text. V tej dobe to bola špica.
Odkaz na tabuľkový procesor As-Easy-As
Vďaka za tip a link, idem sa trochu zahrať...