A LinuxPortál bemutatja: Bevezetés az Emacs használatába

A LinuxPortál nyíltforrású technológiákat érintő és szabadszoftveres közösségeket, projekteket népszerűsítő tévéműsor 348. adásában Bevezetés az Emacs használatába címen előadtam. A bemutató logikus folytatása a korábbi műsorban tartott Emacs apéritif prezentációmnak. Ezúttal az Emacssal ismerkedők számára az alkalmazás alapvető használatához szükséges fogásokat ismertettem. A továbbiakban az előadás szöveges kivonata olvasható. A tévéműsor felvétele megtekinthető a Bevezetés az Emacs használatába címmel a Google Video felületén.

To dear Emacs Planet readers: some weeks ago, I hold my second presentation on Emacs in the hungarian FLOSS related TV programme LinuxPortál. I talked about the basic steps needed to feel convenient in Emacs. I highlighted the main reasons to choose GNU Emacs 23, explained its user interface, keybinding conventions, terminology, mentioned the modes, and covered a lot of other things a user meets when she starts Emacs for the first time.

Emacs 21, 22, 23?

Az Emacs telepítésekor az első felmerülő kérdés, hogy melyik verziót szerezzük be. Jelen sorok keltekor az Emacs hivatalos stabil kiadása a 22.3-as, de sok helyütt találkozhatunk még 21-es verzióval is. Az utóbbi évben az Emacs fejlesztése rendkívül felélénkült, 23-as rajtszámmal – még alfa stádiumban – beszerezhető a legfrissebb funkciókat, szolgáltatásokat tartalmazó csomag. Aki hosszabb ismeretséget kíván kötni az Emaccsal, mindenképpen a 23-as kiadást javasolom a számára. Néhány terület, melyben kiváltképp jeleskedik:

  • teljes körű unicode támogatás
  • GTK mint alapértelmezett toolkit
  • élsimított betűk
  • grafikus felületű szerverhez akár karakteres felületű kliens indítása és vice versa
  • SVG támogatás
  • PDF-olvasó
  • nyíltkulcsú titkosítás támogatása
  • JSON támogatás
  • nXML-mode az XML dokumentumok szerkesztéséhez
  • kitörölt fájlok akár a munkakörnyezet (pl. GNOME) szemetesébe is kerülhetnek

Naprakész részletekért lapozza fel a CVS forrásfa híreit.

Emacs 23 telepítése

A legtöbb linuxos disztribúció emacs-snapshot néven szállítja az Emacs 23-at. Ha még sem lenne így, külső, nem hivatalos tárolókból, vagy közvetlenül a CVS (illetve átjárókon keresztül Arch, bzr vagy akár git) forrásból is telepíthetjük az alkalmazást.

Emacs indítása

Az Emacsot a grafikus munkakörnyezetünk biztosította parancsindítóval, vagy az emacs utasítással indíthatjuk. Automatikusan az Emacs grafikus felülete (GTK+) indul. A -nw kapcsolóval karakteres üzemmódra kényszeríthetjük. Az Emacs filozófiája szerint lehetőséghez mérten egy futó Emacsot használjunk, ne indítsunk több példányt belőle. Ha az Emacsot szerver módban indítjuk, lehetőségünk van hozzá kliensekkel kapcsolódni. Ezek a kliensek a megadott fájlt akár a már futó vagy egy önálló Emacs programablakban képesek megnyitni – mint említett – akár a szöveges, akár grafikus felületen. Ez utóbbinak több haszna is lehet: például távolról SSH-n bejelentkezve, szöveges felületen is dolgozhatunk az egyébiránt a grafikus felületen indított Emacson; egy másik felhasználása, amit én a mindennapokban használok, hogy a háttérben egy screen sessionben elindul az Emacs szerver, a GNOME munkakörnyezetben pedig ehhez csatlakozó grafikus felületű kliensekben nyitom meg a munkafájlokat. Ennek a módszernek járulékos előnye, hogy a screen miatt az Emacs szerver addig fut, amíg le nem kapcsolom a számítógépet, még véletlenül sem fogok kilépni belőle.

UI

Az Emacs felhasználói felülete némileg eltért a megszokottaktól, azonban hamar meg lehet vele barátkozni. Az Emacs terminológiában a programablakot keretnek (frame) hívják. Keretet nyithatunk Emacs klienssel vagy meglévő keretből. Keretek között az Emacs gyorsbillentyűivel is válthatunk. Minden kerethez tartozik menüsor és eszközsáv (ez utóbbi csak grafikus felületen), egy ún. echo area (ez szolgál az Emacs üzeneteinek a megjelenítésére, továbbá parancsbevitelkor ennek a helyén jelenik meg a minipuffer, amelyen keresztül az Emacsnak üzenhetünk), a keret fennmaradó részét pedig tetszőleges ablakra oszthatjuk (split window) fel.

Az Emacs felhasználói felülete linuxos környezetben

Az egyes ablakok a tényleges munkaterületek. Ha megnyitunk egy fájlt, az Emacs létrehoz a számára egy ablakot. Az ablak azon egységét puffernek nevezzük, amely a megnyitott fájl tartalmát jeleníti meg. Minden ablakhoz tartozik egy modeline, amely a puffer állapotát tükrözi (aktuális sor, bekapcsolt funkciók stb.). Az ablakok opcionálisan tartalmazhatnak még görgetősávot, valamint sorszámozást. Találkozhatunk olyan szolgáltatásokkal is az Emacson belül, amelyek felhasználói felületükön füleket (tab) alkalmaznak.

Egyszerre ugyan megnyithatunk több fájlt, de nem szükségszerűen látjuk valamennyit. Az ablakok segítségével oszthatjuk fel az Emacs keretet munkafelületekre. Az ablakok az egyidejűleg látni kívánt tartalmak megjelenítésére szolgálnak (pl. két fájl összevetése, diff). Egyszerre egy ablak lehet aktív, amely a kiadott parancsokat fogadja és feldolgozza. Ahogy a keretek között, ablakok és pufferek között is billentyűparancsokkal válthatunk.

Fájlok

Fájlt többféleképpen nyithatunk meg. Belehúzhatjuk a keretbe (húzd-és-ejtsd), kiválaszthatjuk az eszköztárra helyezett ikon segítségével, valamint – a hosszú távon preferált módon a C-x C-f billentyűkombinációval a minipufferben felbukkanó bevitelen keresztül adhatjuk meg. Az Emacs fájlkezelőt (file manager, commander) is tartalmaz, ha nem fájlt, hanem könyvtárat választottunk, automatikusan betöltődik.

Az Emacs „hurok” (hook) rendszerű felépítésének köszönhetően az alapvető szolgáltatásokra (pl. fájl megnyitás) rátelepülhetnek további kiegészítő funkciók. Ilyen például a tramp, amely segítségével távoli erőforrásokhoz csatlakozhatunk. A C-x C-f esetében megadott elérést amennyiben protokollal (és szükség esetén belépési témaszámmal, jelszóval) egészítjük ki, az Emacs automatikusan csatlakozik a kiszolgálóhoz, majd annak fájljai és könyvtárai között ugyanúgy böngészhetünk, mint ha csak a helyi fájlrendszeren lennénk.

A tramp teszi lehetővé továbbá, hogy helyi állományokat más felhasználóként szerkeszthessünk. Ha su vagy sudo megjelöléssel adjuk meg a path-t, az Emacs bekéri a vonatkozó jelszót, és akár rendszergazdai állományokat is módosíthatunk úgy, hogy el sem kellett hagynunk az Emacsot.

C-x C-f /su:root@localhost:/etc/hosts

Mozgás

Az Emacs elsajátításának talán legnagyobb kihívása – amely az antipatikusok körében a legtöbbet emlegetett –, hogy elsőre bonyolultnak tűnnek a billentyűkombinációk (keybinding). Az Emacs a legtöbb texteditorhoz hasonlóan nem modális, tehát mindig – vimes terminussal élve – „insert módban” vagyunk, a különféle funkciókat a módosító billentyűkkel társított kombinációkkal érhetjük el. Az Emacsot symbolics-os billentyűzetre találták ki, annak kiosztásán voltak nagyon kényelmesen elérhetők az emacsos billentyűkombinációk.

Aki már esetleg használt egyéb GNU-s alkalmazást (pl. bash), és ismeri annak gyorsbillentyűit, magabiztosan érezheti magát eleinte az Emacsban is.

A pufferen belüli mozgás elsajátításához célszerű a beépített angol nyelvű Emacs Tutorialt (C-h t) átolvasni, és az ott szereplő feladványokat gyakorolni. A kurzorbillentyűk, PgUp, PgDown és hasonszőrű társaik használatáról idővel nyugodtan leszokhatunk: feleslegesen kell mozgatnunk a kézfejünket a billentyűzet felett, hogy elérjük őket. Nagyobb hátrányuk azonban, hogy rossz magatartásformákat kölcsönöznek. Az emacsos mozgások lehetnek fizikai vagy logikai mozgások. Léphetünk előre karaktert, szót, paragrafust, függvénytörzset stb. Ezek használatára csak akkor lesz igényünk, ha túllépünk azon, hogy a kurzorral lépkedünk, ergo csak karakter alapú mozgást használunk. A villogó kurzor pozíciójától két mondattal hátrébb szereplő mondat első szavát elgépeltük. Odagyalogol a nyílakkal, vagy M-a M-a M-f?

Tipp: a Caps Lock helyett állítsuk be, hogy az a jövőben a Control billentyű szerepét töltse be. A felhasználónk könyvtárában elhelyezett .xmodmap állományba szúrjuk be az alábbi kódot:

! capslock to ctrl_l
keycode 66 = Control_L
clear Lock
add Control = Control_L

Keresés

Az Emacs keresés gyorsbillentyűjével (C-s) inkrementális keresést kezdeményezhetünk a pufferen (a keresőkifejezés begépelése során egyből jelzi az egyezéseket). Ha csupa kisbetűvel adjuk meg a kifejezést, keresés során a program figyelmen kívül hagyja a kis- és nagybetűk közötti különbséget. Kezeli továbbá a reguláris kifejezéseket (inkrementálisan is), és további egyéb szolgáltatást is nyújt.

Bármilyen billentyűparancsról a C-h c-vel lekérdezhető, hogy milyen utasítást hajt végre a háttérben. Adott utasítás működéséről pedig a C-h f-fel kapunk részletes tájékoztatást. A keresés példájánal maradva az isearch-forward fut le a háttérben. Ha megnézzük a függvény súgóját (C-h f isearch-forward), láthatjuk, hogy keresés közben tucat további billentyűparancs áll a rendelkezésünkre, amivel a keresés irányát, típusát, a keresés kifejezést stb. szabályozhatjuk.

Szerkesztés

A mozgás során intelemként feltüntetett „nem nyilazunk” a szerkesztésre is vonatkozik. Felcserélünk gépelés során két szót. Kitöröljük azokat, majd a helyes sorrendbe begépeljük újra? Ehelyett álljunk inkább a második szóra (M-f M-f), majd adjuk ki az Emacs transpose-words utasítását (M-t). Ki akarjuk mégis törölni a következő szót? M-d. Ki akarjuk törölni a teljes sort? C-k.

Temérdek szerkesztő funkciót támogat az Emacs. Értelemszerűen ezek nem mindegyikéhez nyújt gyorsbillentyűt. Parancsokat közvetlenül a M-x billentyűkombinációval felbukkanó minipufferben adhatunk ki.

Bármelyik parancs előtt a C-u szám vagy ESC szám prefixummal az adott parancs számszor fog lefutni. Próbáljuk ki! ESC 10 a. A pufferbe tíz darab „a” betű kerül. (Az Emacsban minden billentyű vagy billentyűkombináció a háttérben egy függvényt futtat le. Így van ez még az olyan triviális esetekben is, mint egy „a” betű. Házi feladat: nézzük meg, milyen utasítás fut le az „a” betű lenyomásakor.)

Kivágás–másolás

Az Emacs Edit menüpontjában bekapcsolható a CUA (Common User Access) szabvány támogatása. Ennek hatására például a kivágás–másolás–beillesztés a megszokott billentyűkombinációkon lesz elérhető (ezek ugyanis Emacsban eltérőek). Ezzel a lehetőséggel csak megfelelő indok esetén érdemes élni, ugyanis üti az Emacs alapvető billentyűkombinációit.

Emacsban a kijelölés kezdetét ún. mark (C-SPC), a kijelölés végét pedig a kurzor pozíciója jelöli. A kivágás Emacs szakszava kill. Minden, amit kivágunk, rákerül egy végtelen előzménylistával rendelkező kill-ringre (gyakorlatilag vágólap). Billesztéskor (másnéven yank, C-y) a kill-ringre legutóbb másolt (jobban mondva kivágott) elemet illeszthetjük be. A M-y billentyűkombinációval végig pörgethetjük az előzménylistát.

Undo–redo

Egy szövegszerkesztőben a legutóbbi akciókat undóval tehetjük semmissé, majd a redóval ismételhetjük meg. Emacsban nincs külön redo funkció, ha megszakítjuk az undózást, az undók undózásával érhetjük el a redót. Ez a működés abból fakad, hogy az Emacs az undo eseményeket is undoként tárolja el. Míg a hagyományos, lineáris undokezelésben egy undót követő akció felülírja a redot, Emacsban a puffer bármelyik korábbi állapotát visszanyerhetjük.

Faszerű, végtelen előzménylista az Emacsban

Forrás: Vimming to New Heights

Mode-ok

Noha korábban úgy nyilatkoztam, az Emacs modeless, mégis beszélhetünk az esetében mode-okról (a továbbiakban: módokról). Minden megnyitott pufferhez tartozik egy major mód, amely annak viselkedését (így érvényes billentyűkombinációk), megjelenését (így színkiemelés) határozza meg. Ilyen major mód a python-mode, amely praktikusan Python forráskódok szerkesztéséhez nyújt segítséget. Valamennyi pufferhez kapcsolhatók további szolgáltatások, ún. minor módok. Ezek kötődhetnek egy adott pufferhez, de jelen lehetnek globális módként is. Egy pufferhez tetszőleges minor mód hívható meg. Minor mód például a linum-mode, amely a soreleji sorszám kijelzésért felelős. Egy adott pufferen aktív módok listáját a C-h m gyorsbillentyűvel kérhetjük le.

Kilépés

Az Emacsból legegyszerűbben úgy léphetünk ki, ha a programablakot (keretet) a megszokott módon bezárjuk. A C-5 0 billentyűparanccsal egy keretből, a C-x C-c pedig magából az Emacs alkalmazásból is kiléphetünk. (Ha ez utóbbit egy szerverhez kapcsolódó kliensen adjuk ki, az természetesen csak a klienset zárja be, a szerver tovább fut.)

Hibajegyzék

Az alábbiakban az élő adásban tett egy-némely pontatlan megfogalmazásom helyesbítem.

  • a Meta nem karakter, hanem módosító billentyű
  • a pufferlistát C-x C-b-vel kérdezhetjük le, nem C-x b-vel (ez utóbbi a megadott pufferre vált)
  • a C-l nem a center-line utasítás „rövidítése”, hanem ahhoz rendelt gyorsbillentyű
  • természetszerűen a „kedvenc vesszőparipám” kifejezés redundáns, annak valamely tagját hagyjuk el
  • az Emacs undo kezelése nem hagyományos, hanem rendhagyó