Ubuntu Konferencia 2008, benne: Emacs és Vim fej-fej mellett

A második magyarországi Ubuntu konferencián Horák György barátommal Emacs és Vim fej fej mellett c. előadásunkat tartottuk meg. Köszönjük a nagy számú érdeklődést, valamint a hasznos visszajelzéseket*. Köszönjük a konferencia kérdőívét kitöltők közül azoknak, akik az ötös skálán hatossal pontozták előadásunkat, és végül köszönjük a konferencia szervezőinek a színvonalas rendezvényt.

With my friend, Horák György, we gave a 20-minutes talk at the second hungarian Ubuntu conference. We presented two high-tech text editors—Emacs and Vim—to the audience. We tried to convince them, it’s time to switch to a better editing tool.

Konferenciakitűzők az Ubuntu Konferenciáról

Előadásunk tárgya nem két rivális eszköz közötti feszültség élezése, hanem a GNU Emacs (továbbiakban: Emacs) és Vim szolgáltatásainak bemutatása volt. Úgy véljük, hogy az Emacs és Vim együtt versenytársai más texteditoroknak. Az alábbiakban a prezentáción elhangzottak Emacs-vetületének szövegezése olvasható.

Hogyan indítható el a program?

Az Emacsot az emacs paranccsal indíthatjuk. Ha grafikus munkakörnyezetben indítjuk az alkalmazást, automatikusan a program GTK-s felülete indul. X-kiszolgáló hiányában vagy az -nw kapcsoló megadásával az Emacs karakteres felületű verziója töltődik be. Az Emacsot célszerű szerver-kliens üzemmódban használni. Akár már a bootup során elindítható egy Emacs-szerver, amelyhez a munkafolyamat során kliensekkel kapcsolódhatunk (akár karakteres, akár grafikus módban).

Hol fut?

Az Emacs nyílt forrású, minden elterjedt operációs rendszer alatt telepíthető. A linuxos disztribúcióknak emacs nevű csomagként képezi a részét. Nem feltétlenül kerül telepítésre az alaprendszerrel.

Milyen nyelven érhető el?

Az Emacs felhasználói felülete angol nyelvű. Jelenleg nem nyújt támogatást lokalizációra. Az Emacs beépített dokumentációja szintén angol nyelvű.

Indulási sebesség

A gyári kiszerelés néhány másodperc alatt indul. A bekapcsolt funkciók mennyiségétől függően természetesen ez az érték változhat. A -Q kapcsolóval a .emacs-ot nem olvassa be az Emacs. Rendszeres használatra javallott az Emacsot szerver üzemmódban használni, a hozzá kapcsolódó kliensek így azonnal indulnak. Az Elisp (Emacs Lisp) kódokat az Emacs képes bájtkódra fordítani. Ezt célszerű figyelembe venni a külső tárolókból beszerzett csomagok esetén, de a .emacs-ot (ld. következő pont) is lehetőség van lefordítani, ezzel is sebesség növekedés érhető el.

Konfiguráció, testreszabás

Az Emacs definició szerint kiterjeszthető, testreszabható texteditor. Az Emacs Elisp nyelvű konfigurációs állománya a $HOME alatt található .emacs (ejtsd: dotemacs). Lehetőség van a főbb opciókat a programablak menüjének segítségével is beállítani, akár a jelenlegi, akár a későbbi munkafolyamatok számára. Az Emacs kiterjedt Customization alrendszerének köszönhetően menüvezérelten valamennyi funkció paraméterei állíthatók. Minden felülbírálható, testreszabható, megváltoztatható Emacs Lisp nyelven.

Felhasználói felület felépítése

Az ablakkezelő szempontjából ablaknak tekintett programablakot az Emacs keretnek (frame) nevezi. Keretből nyitható több, ezek között billentyűparancsok segítségével válthatunk. Minden kerethez tartozik egy menüsor, egy eszköztár (ezek elrejthetők) és egy minibuffer. Egy keretet feloszthatunk több – Emacs terminussal élve – ablakra (split windows).

Az Emacs felhasználói felülete

Az ablakok egy pufferből (buffer) és modeline-ból állnak. A puffer egy megnyitott fájl tartalmát vagy egy esemény eredményét tükrözheti. Puffer lehet írható vagy olvasható. A modeline a pufferről, annak tartalmáról és ahhoz kapcsolódó szolgáltatásokról ad részletes tájékoztatást. A pufferen végezhető műveleteket ún. mode-ok határozzák meg. Minden pufferhez tartozik pontosan egy major mode, és további tetszőleges számú minor mode. A minor mode-ok nem feltétlenül pufferhez kötöttek, vonatkozhatnak valamennyi pufferre is.

Billentyűkombinációk

Az alapvető – többnyire navigálásra szolgáló – billentyűkombinációk egybevágnak a GNU-kiosztással, így a már máshol (pl. bash) megszerzett tudást itt kamatoztathatjuk. Az Emacs – hasonlóan a legtöbb editorhoz – nem modális, azaz az egyes funkciókat módosító billentyűkkel kiadott parancsokkal érhetjük el. Ezek jellemzően az Escape/Alt/Meta, Control és Shift. Az Emacs tehát nem modális, azonban mégis beszélhetünk az esetében mode-okról. A kiadható billentyűparancsok hatásáért ablakonként egy major-mode, és tetszőleges további kiegészítő funkcionalitást nyújtó minor-mode felelős. Ezek a mode-ok határozzák meg, hogy például milyen színkiemelést kapunk, vagy a TAB leütésére milyen funkció fut le a háttérben. Emacsban minden billentyűkombináció egy explicit is kiadható parancsot futtat le a háttérben. Ezeket a függvényeket a M-x-szel közvetlenül is kiadhatjuk a minibufferen keresztül. A C-h c és C-h k segítségével bármely billentyűkombinációról megtudhatjuk, hogy mit csinál.

Mozgás a pufferben

Mint említettem, a navigációt szolgáló billentyűparancsok egybeesnek a GNU-kiosztással. Ilyen például a soreleje és sorvége parancs (C-a, C-e), a következő sor vagy következő oldal (C-n, C-v). Az Emacs megkülönböztet ún. fizikai (sor, oszlop, téglalap stb.) és logikai szövegegységeket (paragrafus, függvénydefinició stb.). Előbbieket többnyire a C-<karakter>, utóbbiakat M-<karakter> billentyűparanccsal érjük el. Tetszőleges sorra a M-g M-g-vel ugorhatunk. Az aktuális sort a C-l-lel az ablak közepére igazíthatjuk.

Puffer pozició mentése

Pufferpoziciók mentésére a legkényelmesebb a regiszterek használata, amelyek az ábécé betűivel vagy számmal azonosítható tárolók. A regiszterek adott pufferhez kötődnek, kilépéskor tartalmuk elveszik. A könyvjelzők tárolhatók, és adott fájl ill. azon belüli poziciót jelölnek. Az előzőleg szerkesztett területekhez a C-u C-SPC-szel térhetünk vissza.

Inkrementális és regex-alapú keresés

Alapértelmezetten az inkrementális keresést ajánlja fel az Emacs. Lehetőségünk van reguláris kifejezésre, szintén inkrementális módon keresni. Az Emacs a grep eszközhöz hasonló, egyszerű regexp kifejezéseket támogatja. Az Emacs tartalmaz egy grep burkolót is, amely a parancssoros grepek (akár egrep) valamelyike fölé kínál felületet. Ha a keresőszót csupa kisbetűvel írjuk – és másként nem rendelkeztünk róla – az Emacs a kis- és nagybetűk közötti különbséget figyelmen kívül hagyja keresésnél. Ez regex-alapú keresésnél is igaz. A keresés-és-csere funkcióban is használhatunk reguláris kifejezéseket. A M-/ paranccsal indukálható szolgáltatást interaktív, azaz a rendszer rákérdez minden egyes csere előtt, így pontosan látjuk, miket fog lecserélni.

Menekülés

Az előzőleg kiadott billentyűparancs a C-g-vel semmissé tehető. Ha már olyan módba léptünk, amelyből így mégsem sikerül kilépnünk, az ESC ESC ESC lenyomásával alapállapotba kérhetjük az Emacsot. A minipufferben az Emacs jelzi a lenyomott billentyűket.

Egyidejű szerkesztés több fél között

A make-frame-on-display paranccsal egy távoli X-kiszolgálón is felhozható a futó Emacs-szerverhez kapcsolódó kliens. Ezzel a módszerrel mindenki külön kurzort kap, így egymás mellett párhuzamosan dolgozhatunk ugyanazon az állományon.

Verziókezelés

Az Emacs támogatja valamennyi elterjedt nyílt forrású verziókövető rendszert. Egységes felületet nyújt a háttérben használt VCS fölé, így ugyanazokkal a billentyűkombinációkkal és parancsokkal érhetők el a verziókezelők szolgáltatásai, függetlenül attól, hogy a háttérben éppen svn-t vagy gitet használunk. Ha több verziókövető alá is regisztrált állományon dolgozunk, a C-x b paranccsal választhatjuk ki az aktívat.

Undo–redo

Az előző módosítások a pufferben a C-_ billentyűparanccsal hívhatók elő (undo). Emacsban az undo annyiban sajátságos, hogy az undók is az undolistába kerülnek, a hagyományosan vett redo funkció itt nincs meg (telepíthető mode, amely erre szolgál). Az előzménylista mérete gyakorlatilag végtelen. Az előzmények vizuális megjelenítéséhez, lejátszásához az undo-browse kiegészítés javasolt.

Parancsok ismétlése, makrók

A C-u <szám> prefixummal számszor futtathatjuk le a kívánt parancsot. Makrók rögzítése F3-mal, befejezése az F4-gyel történik. A felvett makró lejátszásához újból az F4-et kell megnyomnunk. Ha többször is futtatni szeretnénk, a M-<szám> prefixum lesz a segítségünkre. A makrók névvel tárolhatók későbbi felhasználás végett. Lehetőség van a szerkesztésükre is.

Dolgozás kijelölt területen

Emacsban a legtöbb szövegeditálási funkció az adott pontban, kijelölésen vagy a puffer tartalmán dolgozik. Nem minden funkció veszi figyelembe a kijelölést (pl. keresés). Emacsban a narrowing szolgáltatással szűkíthetjük le a területet a kijelölés tartalmára. Ebben az esetben, amíg vissza nem állítjuk a területet, a szűkítés úgy fog viselkedni, mint ha ő lenne a teljes puffer.

Shell elérése

Tetszőleges shell parancs futtatására a shell-command függvény (M-/) szolgál. A shell-command-on-region-nel a kijelölt terület adható át pipe-ként a megjelölt parancsnak. Adott shellt a term utasítással indíthatunk. Ebben az esetben speciális billentyűparanccsal válthatunk a shell és az egyéb pufferek között annak érdekében, hogy a shellben megszokott billentyűkombinációkat ne kezelje le az Emacs. Az Eshell a megszokott shell parancsokon túl (ls, cp, find) natív Elisp kifejezések kiértékelését is lehetővé teszi.

Más felhasználó birtokolta file szerkesztése

Emacs alatt a tramp alrendszerén keresztül érhetünk el távoli fájlokat. Bizonyos tekintetben a más felhasználó által birtokolt fájlok is felfoghatók távoli állományokként. A tramp a meglévő find-file függvényre épül rá. A fájl útvonala elé /sudo: vagy /su: kiegészítést szúrva más user állományait nyithatjuk meg írásra.

Távoli file-ok elérése

A tramp támogatja a legtöbb elterjedt protokollt, a /<ssh:user@host:/ paranccsal távoli erőforráshoz csatlakozhatunk SSH-n keresztül. A kiszolgálóra bejelentkezést követően annak fájlai és könyvtárai között ugyanúgy tallózhatunk, mintha a helyi fájlrendszert érnénk el.

Bővíthetőség, scriptelhetőség

Az Emacs – mint említett – kiterjeszthető, testreszabható texteditor. Tetszőleges funkcionalitás megvalósítható Emacs Lispben. A gyári kiszerelésben érkező csomagokon túl hivatalos tároló nincsen egyéb csomagok begyűjtésére. Az EmacsWiki megfelelő kiindulási pont a fellelhető csomagok beszerzésére.

Fejlesztést támogató eszközök

Elmondható, hogy az Emacs gyakorlatilag tetszőleges másik fejlesztő környezet nyújtotta funkciót képes ellátni: színkiemelés, auto-indenting, kapcsolódás távoli debuggerhez, projektkezelés, forráskód helyességének automatikus ellenőrzése, snippetek támogatása, kódkiegészítés, élő-dokumentáció stb.

Átjárás

A Vimet használókat célozza meg a viper-mode, amely a vimes billentyűkiosztást és működést próbálja meg szimulálni bizonyos határokon belül, hogy könnyítse az áttérést. Hasonló felhasználási területet fed le a Vile, amely egy Emacs-alapú, teljesmértékben Vi-jellegű texteditor. NetBeans és Eclipse alatt választható emacsos kiosztás. A Conkeror egy Firefox-kiterjesztés, amely Emacs-szerű működést és küllemet kölcsönöz a böngészőnek. A Firemacs Emacs-kiosztást produkál Firefoxban.

Legnagyobb megnyitható fájl

Tetszőleges méretű állomány megnyitható. Bizonyos mode-ok bizonyos működése ezt lassíthatja.

Memóriafoglalás

A Fedora 9-es rendszeremen indítást követően 15M-ot foglalt a memóriából. Az én beállításaim mellett (nem csak texteditáláshoz szükséges funkciókkal együtt) 43M volt ez az érték. Az Emacsot javasolt szerver módban indítani, és a továbbiakban kliens ablakokat megnyitni.

Beépített segítség

Az elindulást segíti az Emacs beépített tutorialja (C-h t). Tartalmaz továbbá teljes értékű angol nyelvű dokumentációt és Elisp referenciát.

Kilépés

A C-x C-c billentyűparanccsal hagyhatjuk el az Emacsot. Ha szerver–kliens módban használjuk az alkalmazást, a kliensablakokat a C-5 0-val is bezárhatjuk be.

Mire használom?

Az Emacsot elsősorban JavaScript, PHP, Python és Emacs Lisp nyelvű fejlesztéshez, másodsorban minden másra használom.


* Előadásunkkal kapcsolatban javarészt egyedüli kifogásolható pontként annak információtartalmát jelölték meg páran. A 20 perces időtartamra vonatkozólag kellett a vonalat meghúznunk, mit mondhatunk el, s milyen mélységbe már nem mehetünk. Utólag visszatekintve lehet, hogy szerencsésebb lett volna egy demóval megspékelt előadás 45 perces időkeretben. Majd jövőre.