A kiterjeszthető szövegeditor felépítéséről

Az Emacs erőssége abban rejlik, hogy programozható editor. Persze bármelyik editor programozható, akár a Gedithez (neked Vim) is írhatsz Pythonban bővítményeket, és még meg sem kell tanulnod egy új nyelvet, pláne nem egy Lispet (sic!). Az Emacs erőssége és bonyolultsága viszont tényleg abban rejlik, hogy magát az editort programozhatod. Másképp fogalmazva – fejlesztői szempontból – az Emacs egy hatalmas kódtár; ha úgy tessék, egy Elisp API. Ez persze nem teljesen igaz. Nem igaz abban a formában, hogy az API az alkalmazás fölé emelt, jól definiált réteg, amin keresztül külső bővítmények (pluginok) az API alatt meghúzódó alkalmazással kommunikálhatnak, annak szolgáltatásait használhatják, és azokra épülve egészíthetik ki annak tudását. (Az ábrák Benjamin Ferrari: Emacs is different értekezése nyomán.)

Ábra: átlagos szövegeditorok felépítése Plugin API-val

Az Emacsban az API maga az Emacs. Emacsban – amikor API-ról beszélek – magát az Emacsot értem, nem egy mezsgyéjét a kódoknak, hanem az editor teljes forráskódját, amelynek bármelyik része elérhető, módosítható, kiterjeszthető. A te kódod (bővítményed) ugyanabban a szegmensben lesz, mint a mag fejlesztőinek kódja, nincs egy éles határ (ld. API) húzva a kettő közé.

Ábra: az Emacs szövegeditor felépítése Plugin API nélkül

Tényleg nyílt forrású, és abban az értelemben is, hogy nem csak tanulmányozhatod a kódot, hanem tetszés szerint, futás időben is változtathatod annak működését. (Nem forkolod az alkalmazást, hanem testreszabod.) Gedithez is írható Last.fm plugin, sőt, meg merem kockáztatni, hogy talán még triviálisabb is: import LastFm. Az Emacs előnye akkor jelentkezik, amikor olyan funkcionalitást vagy úgy szeretnél, amire nem vagy nem úgy kínál megoldást a (plugin) API, és ez a gondolat elvezethető egészen olyan szélsőséges esetekig, mint amikor a CVS Emacsban megjelent bugot átmenetileg egy advise-zal (neked decorator) orvoslod.

Éppen ezért emacsos kiegészítő (terminussal élve: mode) fejlesztésekor külön azzal foglalkozni nem szükséges, hogy rögzítsük az alkalmazás program-interfészét. A lispes alulról felfele építkezés és az a tény, hogy bármelyik függvényünk vagy változónk mások fejlesztése során felhasználásra kerülhet, kikényszeríti, hogy a teljes kiegészítő rugalmas és biztonságos legyen, és szükség szerint API-ként funkcionáljon egyéb komponensek felé.