GNU Emacs - vždy je čo vylepšiť, #1

26.08 | 11:11 | Richard | Richard

Blog pojednáva o tom, ako šikovnými rozšireniami, funkciami, nastaveniami, vytlačiť ešte viac z (nielen) textového editora GNU Emacs.

 

1 Textový editor… ako životný štýl?

To znie riadne pritiahnuté za vlasy. Ale - ak som napríklad obchodný zástupca a 8 hodín denne sedím v aute, tak kvalitné sedačky v aute sú pre mňa dôležitejšie ako sedačka v obývačke. A keď používam textový editor na väčšinu svojej práce, tak to platí rovnako.
Každý máme ten svoj, niekto aj viacero, a každý si musel zrejme prejsť svojou cestou, kým si vybral ten najvhodnejší.
Ja som začal s Vi(m)-om. Bolo to asi pred 15-mi rokmi. Ale zrejme som nevedel plne doceniť jeho schopnosti, alebo z iného dôvodu ma nenadchol, pretože asi po pol roku, keď som stále bol domotaný z tých režimov a klávesových príkazov, som povedal, že nasilu to robiť nebudem.
Takže Nano. To som poznal z Alpine. Je to rýchly a jednoduchý editor, ktorý robí presne to, čo užívateľ očakáva, bez nejakých prekvapení.
Ale jednoduchý bol až príliš. Práca s viacerými súbormi bola nemožná, zvýrazňovanie syntaxe bolo obmedzené a komplikovane editovateľné. Ale zase je v každej distribúcii zrejme predvolene nainštalovaný, takže vedomosti je potrebné mať.

 

2 A potom to prišlo

GNU Emacs. Najprv som si o ňom len čítal a trochu sa ho obával. Nové termíny, nové skratky, mnoho hanlivých slov, ale tiež tie neobmedzené možnosti, opísané v manuále (a ten má cez 600 strán).

A tento známy graf "learning curve" zobrazuje skutočnosť:

Dlhoročné vojny Vi(m) vs Emacs nemajú zmysel, pretože - Vi(m) je textový editor. Emacs je masívny (e)Lispový nástroj, ktorý má v sebe aj editor. Alebo, ako tvrdí aj jeho meno - editor makier, všetko je makro, a teda aj to hlavné, ktoré sa prezentuje ako textový editor. Základné funkcie (od pohybu kurzora po zobrazovanie) sú naprogramované v C (existuje i fork naprogramovaný tuším v Rust-e), vyššie i odvodené práve v Lispe. Čo dodáva tomu obrovský rozmer (isteže, aj Vi(m) má svoj skriptovací jazyk).

Recenzií, návodov, opisov a videí o Emacse je nespočetne veľa. Nemá zmysel opisovať jeho ovládanie, prácu s buffermi či kill-ringom, programátorské či iné pluginy.
Len pre prípadnú motiváciu uvediem zopár rozšírení a trikov, ktoré aktívne využívam.
Takže tento príspevok nie je návodom ani propagačným materiálom. Nemusíme sa preto uchyľovať k niečomu tak silnému, ako je masívna letáková kampaň.

Nakoľko je Emacs je známy používaním chordov, t.j. klávesových skratiek, pri ktorých sa používajú všetky modifikátory, nasledovný obrázok je bežnou realitou.

Niekoľko trikov pomôže pri prevencii pred zápalom karpálneho tunela:

 

2.1 Ako na kláves Hyper?

Mnohí užívatelia Emacsu si mapujú Hyper na Caps Lock. Ide to v bashi nejako takto:

xmodmap -e "clear Lock"
xmodmap -e "keycode 66 = Hyper_L"
xmodmap -e "mod4 = Hyper_L"

Má to ale slabinu - a to, že sa nevyhneme používaniu malíčka a súčasne iného klávesu.

Ja som to vyriešil takto:

xmodmap -e "clear Lock" -e "keycode 66 = F12"
xmodmap -e "keycode 96 = Caps_Lock"

Čo vlastne prehodí F12 a Caps Lock.
A kedže F12 nie je klasický modifikátor, môžem ho využiť v definovaní skratky postupnými (ale i súčasnými) stlačeniami, napr. (úryvok z ~/.emacs):

(global-set-key (kbd "<f12> <f10>") 'ispell-word)
(global-set-key (kbd "<f12> g") 'goto-line)
(global-set-key (kbd "<f12> r") 'recentf-open-files)
(global-set-key (kbd "<f12> l s") 'scroll-lock-mode)
(global-set-key (kbd "<f12> l l") 'visual-line-mode) 
(global-set-key (kbd "<f12> m") 'text-mode) 
(global-set-key (kbd "<f12> f") 'auto-fill-mode) 
(global-set-key (kbd "<f12> k") 'kill-whole-line)

Takže ak stlačím Caps Lock (teraz je to samozrejme F12) a následne napr. k, celý riadok, na ktorom sa nachádza kurzor, sa zmaže a presunie do kill-ring-u.

Len toto samozrejme nestačí.
Skratky C-c, C-x, C-v zaviedol ako prvý Xerox PARC, ale udomácnili sa až s rozvojom GUI od Microsoftu (pamätníci vedia, že v DOS-e to bol break). Aj v našom obľúbenom emulátore terminálu je to SIGINT. Ale ľudia si na tieto skratky zvykli (teda, to závisí od konkrétneho jedinca ☺). A navyše C-x a C-c sú dôležité prefixy v Emacse pre ďalší kláves alebo ďalšiu skratku (napr. C-x C-b pre zobrazenie zoznamu bufferov).
Ja používam radšej F2, F3, F4. Je to len na jedno stlačenie.
Na webe ergoemacs.org sú dostupné návody a hotové riešenia, ako si nezapliesť prsty. Pár z nich aj používam.

 

3 Ten Emacs, kým sa spustí, to človek…

To sú len neprajné reči z počítačového praveku. Áno, pri spustení Emacsu sa načítava inicializačný súbor, v ktorom sú definované parametre, nastavenia, vlastné funkcie. Na webe sa dajú nájsť súbory .emacs so stovkami až tisíckami riadkov. Ale dá sa to spraviť aj lepšie.

Dá sa to pomocou tzv. hook-ov. Napr. v mojom prípade mám v .emacs:

(add-hook 'c-mode-hook (lambda () 
                               (load-file "/home/richard/.emacs.d/load-c-hooks.el")))

Takže otvorím program v C a nahrá sa príslušný súbor load-c-hooks.el.

Podobne to mám pre programy pre Arduino, Tcl/Tk, Bash, či org

No a v onom hook-u môže byť napríklad (úryvok):

(autopair-mode)
(setq fci-rule-column 70)
(fci-mode)
(hlinum-activate)
(setq compilation-finish-function
  (lambda (buf str)
    (if (null (string-match ".*exited abnormally.*" str))
	(progn
	  (run-at-time
	   "1 sec" nil 'delete-windows-on
	   (get-buffer-create "*compilation*"))
	  (message "No Compilation Errors!")))))
(setq tags-revert-without-query t)

(Pozn.: O fičúrach v oných hook-och bude ešte reč v ďalšich pokračovaniach.)

 

4 Pluginy, funkcie a vôbec

Ale tento článok má byť najmä o tom, ako som GNU Emacs priohol pre svoje potreby ja. Pretože písať o rozšíreniach, na čo slúžia a aké sú ich prednosti a ako sa používajú - takých článkov či videí je mnoho.
Plus spomeniem tie rozšírenia a funkcie, ktoré nie sú úplne bežné, ale sú užitočné.Väčšinu rozšírení je vhodné, kvôli závislostiam, inštalovať cez package manager-a. Avšak má to neduh - že tieto rozšírenia sa automaticky pridajú do .emacs ako autoload. Je potrebné ich odtiaľ pomazať, alebo presunúť do patričného hook-u.

 

Čo teda používam (prvá časť)?

 

4.1 HELM

Helm je všeobecný framework na rýchly prístup k príkazom, parametrom… a vôbec všetkému. Jedná sa o inkrementálne doplňovanie a dynamické zužovanie (s ďalšími rozšíreniami môže byť i fuzzy). Nasledujúci obrázok ukazuje, ako som zadal "pa li pa" a helm mi predhodil príkazy s týmito výskytmi.

Funguje to so všetkým možným, napr. s výberom posledne otvorených súborov:

 

4.2 BM

Bm.el uľahčuje prácu so záložkami, ktoré sú (a tiež registre) v Emacse už v základe fantastické. Toto rozšírenie im dáva vizuálny rozmer.
Je to prosté, pomocou príkazu bm-toggle (u mňa F5) si záložku nastavím/zruším, pomocou bm-show (u mňa F6) na záložky skáčem.
Obrázok napovie:

 

4.3 Er/Expand-region

Er/expand-region je šikovná hračka pri programovaní. Podľa typu jazyku príkaz er/expand-region (u mňa <H> e) rozširuje označený región podľa semantiky jazyka (takže napr. v C rozširuje najprv po (), potom {}, potom po ďalšiu úroveň kódu, …, potom až celú funkciu…).

 

4.4 Fill-column-indicator

Fci nerobí nič viac a nič menej, ako zobrazovanie čiary, kde by bolo vhodné zalamovať kód. Je skôr zvláštne, že toto rozšírenie nie je v základnej inštalácii Emacsu (ale možno je to aj dobré, závisí to od uhla pohľadu).

 

4.5 Htmlize

Htmlize konvertuje buffer alebo región (prekvapivo) do html, včítane jeho dekorácií (t.j. napr. zvýraznenie syntaxe).
S nadsádzkou by sa dalo povedať, že je možné vytlačiť si programy na papier a čítať si ich počas dlhých zimných večerov. So zvýraznením syntaxe to bude zábavnejšie ☺.

Na obrázku je výber zo súboru .emacs: a výsledný html súbor:

 

4.6 TLDR

Tldr.el je tldr klient pre Emacs. A čo je to tldr? Jednak je to skratka Too Long; Didn't Read a jednak je to linuxový program, ktorý je podobný man. S rozdielom, že ponúka okamžite časté príklady použitia príkazov, programov.
No a tldr.el je jeho implementácia pre Emacs. Jeden screenshot si hádam zaslúži:

 

4.7 Undo-tree

Undo-tree je undo/redo na steroidoch. Dokáže vrátiť ľubovoľný minulý stav buffera (a teda aj ten, ktorý by sa v štandardnom undo stratil to spravení redo). A navyše to dokáže aj graficky zobraziť a interaktívne zobrazovať jednotlivé stavy. Proste skvelé.

Dokonca podľa autorov dokáže aj také vetvenie:

	      o
	  ____|______
	 /           \
	o             o
    ____|__         __|
   /    |  \       /   \
  o     o   o     o     x
  |               |
 / \             / \
o   o           o   o

 

4.8 Which-key

Which-key je rozšírenie, ktoré dokáže zobrazovať možné klávesové skratky po ich nekompletnom zadaní, ak sa prekročí nastavený interval (defaultne 2 sekundy) pri ich zadávaní.
Takže napr. stlačím C-x a nič viac, a po krátkom čakaní sa zobrazí zoznam dostupných pokračovaní:

Takže stlačím napríklad n a objaví sa ďalšia nápoveda:

Takto sa dozviem, že napr. C-x n n je zúženie zobrazenia buffera, konkrétne na veľkosť regiónu (t.j. označenej oblasti).

 

5 Zatiaľ koniec

Na dnes už hádam stačilo. Ono pridlhé články sa ťažko píšu. A aj ťažko čítajú.
V ďalšom pokračovaní si ukážeme iné šikovné rozšírenia či funkcie, ktoré mi spríjemňujú prácu v textovom editore.
A že ich bude dosť.

Teraz je jasné, že GNU Emacs dokáže vybudovať i nezdravú závislosť. Ak si človek (alebo aj android či kocúr) zvykne na jeho parádičky, tak ich bude vyžadovať (a hľadať) aj inde. A ľahko sa stane, že ich alebo nenájde, alebo sa k nim bude dopracovávať (podobne ako je to aj v mojom prípade s Emacsom) roky.

    • RE: GNU Emacs - vždy je čo vylepšiť, #1 26.08 | 22:12
      Avatar bedňa LegacyIce-antiX  Administrátor

      Pár hodím som hľadal všetko okolo Emacsu a potom som si pozrel Absolute Beginner's Guide to Emacs a zistil som, že absolutný začiatočník je pre mňa nedosiahnuteľná meta.

      napísal som emacs aaa
      Do súboru som vložil:

      111
      222
      333
      444
      555

      Stlačil som odporúčané C-h C-h : help mno a mazalo mi znaky smerom vľavo.

      Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
      • RE: GNU Emacs - vždy je čo vylepšiť, #1 27.08 | 07:22
        Avatar Richard Antix  Používateľ

        Ehm, asi je to tam napísané trochu zmätočne, lebo

        C-h C-h je ozaj help, ale napísané je to tak:

        "C-h C-h : help", ako keby bolo treba zadať C-h C-h a potom napísať dvojbodka help.

        Keby to autorka dala do peknej tabuľky, nestalo by sa takéto nedorozumenie.

        ... ale prečo by to malo mazať znaky... iba ak by to bol nejaký vim mód alebo Doom Emacs, ktorý simuluje vim, a teda : tuším uvádza príkaz.

        • RE: GNU Emacs - vždy je čo vylepšiť, #1 27.08 | 08:27
          Avatar bedňa LegacyIce-antiX  Administrátor

          Aha, problém je u mňa, ja som nič neinštaloval, ale už som mal predinštalovaný balíček emacsen-common, čo je nejaký orezaný Emacs.

          Doinštaloval som Emacs a teraz mi to už funguje OK.

          Ja som včera veľa času zabil hľadaním vecí okolo Lispu a ostatných jazykov na ktoré som popritom narazil. Samozrejme som hľadal Emacs a Python. Tiež som si pozrel aj projekt Emacs v Ruste, ten umrel a teraz je Emacs-ng, Rust + Javascript + Akcelerácia cez veci od Mozilly.

          K tomu dlhému štartu Emacsu. To je mi úplne jedno. Editor mám zapnutý bežne pár mesiacov bez vypnutia, takže toto ma vôbec netrápi.

          Táto správa neobsahuje vírus, pretože nepoužívam MS Windows. http://kernelultras.org
          • RE: GNU Emacs - vždy je čo vylepšiť, #1 27.08 | 08:40
            Avatar Richard Antix  Používateľ

            Ja mám na svojom starom stroji štart čistého Emacsu cca 0,4 s, s maximálnymi hookmi okolo 0,5 s.

    • RE: GNU Emacs - vždy je čo vylepšiť, #1 30.08 | 22:27
      Avatar LUcoRP Debian, *Ubuntu, Android  Administrátor
      <flame>
      Emacs je dobry OS, ale ten textovy editor v nom stoji za hovno.
      </flame>

      Pred par rokmi som riesil ci emacs, alebo vim. Nakoniec zvitazil vim, postupne si ho tiez upravujem k svojmu obrazu, ale ako primarne IDE pouzivam zatial stale riesenia od Jetbrains + sublime. Ale cim dalej, tym viac sa uchylujem k vim-u, specialne na hobby projektoch, kde ma netlacia deadliny ho pouzivam vylucne. 

      git blame | Muj Desvorc je vetsi nez tvuj!
      • RE: GNU Emacs - vždy je čo vylepšiť, #1 31.08 | 07:17
        Avatar Richard Antix  Používateľ

        Jeden čas bolo populárne (aspoň mi to tak prišlo, že príspevky boli v jednom období) vyrábať si pedál na prepínanie režimov vo vim-e. Ktovie, či je to stále tak.

        • RE: GNU Emacs - vždy je čo vylepšiť, #1 31.08 | 19:21
          Avatar LUcoRP Debian, *Ubuntu, Android  Administrátor

          Nieco taketo? Na prepinanie modov som si zvykol pomerne rychlo. Vacsi problem mam stale s kopirovanim blokov textu, ak dlhsie s vimom nerobim. Zvyk oznacovat text cez mys, pripadne klasicke klavesove skratky (Shift, control, kurzorove sipky) je u mna velmi tazko odburatelny :(

          git blame | Muj Desvorc je vetsi nez tvuj!
          • RE: GNU Emacs - vždy je čo vylepšiť, #1 01.09 | 10:36
            Avatar Richard Antix  Používateľ

            Hm, tá poznámka toho autora na githube: "According to russian DIY traditions electrical tape should be blue. Only blue electrical tape (also known as izolenta) guarantees 100% reliability!"

            S týmto som sa osobne stretol! Modrá je najlepšia.

          • RE: GNU Emacs - vždy je čo vylepšiť, #1 01.09 | 11:11
            Avatar Richard Antix  Používateľ

            A ešte taká vec - ak je človek silne navyknutý na nejaký spôsob práce, a občasne musí návyk zmeniť, tak je to sprvu trápenie.

            Napr. ja používam iné rozloženie klávesnice - pozmenené QWERTY (takže nie Dvorak či Colemak) - napr. znaky "(" a ")" mám tam, kde je normálne "[" a "]", pretože okrúhle zátvorky zadávam (napr. v C) nepomerne častejšie a načo ich shiftovať s 9 a 0.

            ( "{" a "}" zadávam pomocou S-[ a S-], "[" a "]" pomocou AltGr+S+[ resp. AltGr+S+], pričom "ú" a "ä" pomocou AltGr+[ resp. AltGr+] (takto to znie zmätočne, ale je v tom logika) ).

            No a keď prídem ku klientovi k jeho počítaču, že akože odborník ☺ (ja), ktorý ma navyše Win (klient) a bežné rozloženie klávesnice, tak tam pôsobím chaoticky. Časom sa to samozrejme zlepší.

            A potom, keď mám opäť svoj PC či laptop, to je úľava.

            • RE: GNU Emacs - vždy je čo vylepšiť, #1 01.09 | 11:16
              Avatar Richard Antix  Používateľ

              Len ak by to niekoho zaujímalo: môj layout

              CLI: setxkbmap -layout skp2