Introduktion til Emacs

Tags:    linux
Skrevet af Bruger #5688 @ 18.11.2004
Indledende notits:
Denne guide vil primært være rettet mod GNU Emacs, da det er den Emacs jeg selv bruger. Af andre emacsen kan nævnes XEmacs og QEmacs. Der er ikke den store funktionelle forskel på XEmacs og GNU Emacs, så der burde ikke være noget i denne guide der ikke kan benyttes til XEmacs. Selvom denne artikel er at finde i Unix-sektionen, og selvom Emacs primært er at finde på Unix-systemer, virker det også fremragende under Windows. GNU Emacs til Windows kan hentes her: http://ftp.gnu.org/gnu/windows/emacs/emacs-21.3-fullbin-i386.tar.gz

Hvad er Emacs?



Emacs er basalt set et koncept. Ethvert program der kan lave et (GNU) Emacs-lignende miljø kan kalde sig for "en emacs." En emacs behøver ikke være programmeret i Emacs Lisp, en afart af Lisp (hvilket GNU Emacs er), den skal bare kunne opføre sig som GNU Emacs. En 'vi' der er programmerbar i Emacs Lisp er heller ikke en emacs med mindre den kan få et GNU Emacs-lignende miljø. Emacs var oprindeligt (ca. 1975) en samling af makroer til TECO, en meget gammel og kryptisk linjebaseret editor. Makroerne blev samlet og distribueret af Richard Stallman som EMACS (Editor MACroS -- uppercase). GNU Emacs blev skrevet i C og Emacs Lisp af Stallman i 1985, var et af de første programmer der blev udviklet af det nystartede GNU-projekt (http://www.gnu.org) -- det var så at sige GNU's tidlige "killer application." XEmacs blev forked fra en tidlig udgave af Emacs 19, grundet tekniske og filosofiske forskelle imellem Jamie Zawinski og Richard Stallman. Når jeg bruger uppercase "Emacs" menes der GNU Emacs, når jeg bruger lowercase "emacs" menes der et hvilken som helst program af emacs-typen.

Nu hvor denne tørre definition er sat på plads, kan jeg specificere præcist hvad det at være en Emacs indebærer. Emacs er basalt set bare en teksteditor Men ikke bare en hvilken som helst teksteditor -- Emacs kan praktisk taget alt det man har brug for når man arbejder ved en computer. Den kan være filmanager, browser, nyhedslæser, e-mail klient, shell, spillemaskine og meget mere. Emacs har også syntakshighlighting, makefilegenerering, alt hvad en programmør har brug for. I praksis kan man bruge Emacs til alt. Dette lader sig gøre takket være Emacs Lisp -- det programmeringssprog alt andet end de mest centrale dele af Emacs er programmeret i. Denne guide vil dog primært gennemgå Emacs som teksteditor

Koncepter



Først vil jeg gennemgå syntaksen for kommandoer i Emacs. En Emacs-kommando kan fx. være C-x, eller M-x, hvilket betyder hhv. at holde CTRL og 'x' inde samtidigt, og holde "meta"-tasten (oftest ALT) og 'x' inde. Meta kan også være ESCAPE -- faktisk svarer et enkelt tryk på ESCAPE til at holde meta-tasten inde. En kommando som C-x b betyder at trykke CTRL og 'x' samtidigt, og derefter trykke 'b' (kommandoen skifter forresten mellem buffers, mere om det senere).
Emacs opererer med et system kaldet "buffers." Emacs kan have et hvilket som helst antal buffers indlæst, og de behøver ikke nødvendigvis indeholde en fil man kan redigere i. Andre former for buffere, kan fx. være en kommandoprompt eller en browser. Den mest tydelige fordel buffers giver, er muligheden for at have flere filer åbne på samme tid (man kan endda have flere åbne på skærmen, ved at dele den op i rammer).
En buffer kan være i en "mode", altså en tilstandsform, der giver adgang til funktioner der er relevante for den type fil moden er beregnet til. Fx. skriver jeg dette i Text-mode, hvilket giver mig diverse genvejstaster til nyttige funktioner relateret til at skrive ren tekst. En anden mode er C++-mode, der indeholder regler for syntakshighlight, og desuden forstår hvordan C++ er opbygget, således at tastesekvenserne der springer et ord frem måske vil springe et statement fremad i stedet for (eller bare tillade andre ting i "ord").
Der findes også langt mere komplekse modes, der på ingen måde handler om tekstredigering, f.eks. modes til at læse e-mail, hvor man får præsenteret en menu over mailbokse, og hvor tastetryk har en radikalt anden betydning ind i en skrive-orienteret mode.
Emacs har også et udemærket Help-system (det er en "selvdokumenterende editor"), som man kan opnå adgang til gennem tastesekvenser der starter med C-h. C-h t vil starte den udemærkede Emacs tutorial. Nederst i Emacs-vinduet er der en særlig buffer på 1 linje; det er minibufferen, og den indeholder kommandoer, og output fra kommandoer som du giver Emacs. Det er også her Emacs-kommandoer kan spørge om input.

Tekstredigering

Når Emacs er startet op kan man indlæse en buffer med en fil med tastesekvensen C-x C-f (helt præcist vil denne kommando oprette en buffer med samme navn som det filnavn der angives, for derefter at kopiere indholdet af filen ind i bufferen). Hvis du derefter indtaster navnet på en eksisterede fil, vil der blive oprettet en buffer med den fil indlæst, og hvis du indtaster navnet på en ikke-eksisterende fil, vil der blive oprettet en tom buffer, og filen vil blive skrevet til disken når du gemmer. Du kan gemme filer med kommandoen C-x C-s, eller gemme den under et nyt navn med C-x C-w. Når en fil er oprettet (eller indlæst) kan den redigeres som i et hvilket som helst andet tekstredigeringsprogram. Du kan afslutte Emacs med kommandoen C-x C-c. Emacs har en masse smarte genveje til at flytte rundt i teksten:

Fold kodeboks ind/udKode 


Nogle af disse virker måske absurde, eftersom de gør det samme som piletasterne, men det kan faktisk være meget rart at lære dem at kende, for så behøver man ikke flytte hænderne hver gang man vil navigere rundt i bufferen.

Emacs har også en feature der i de rette hænder kan være meget kraftfuld -- regionen. Du definerer regionen ved at sætte et mark (C-Mellemrum), hvor regionen så vil være området mellem markørpositionen, og mærket. Mange kommandoer opererer på regionen, bl.a. C-w, der klipper tekst ud (den udklippede tekst bliver placeret i en killring, og kan genindsættes med C-y). Hvis du bare vil kopiere tekst bruges M-w i stedet. En anden nyttig kommando når man opererer med marks er C-x C-x, der bytter om på markørens nuværende position og mærket.

En anden til tider meget praktisk kommando er C-t, der vil flytte det bogstav markøren står over, en gang til venstre (essentielt ombytte bogstavet med det der står til venstre for det). Kommandoen C-k er også god at huske, den sletter al tekst til højre for markøren til afslutningen af linjen.

Flere kommandoer

En af Emacs' mest nyttige features er muligheden for at have flere filer (eller andre ting) åbne på samme tid. Dette kan lade sig gøre via buffers. Når du åbner en fil med kommandoen C-x f bliver den indlæst i en ny buffer der for navn efter det filnavn du har åbnet. Ved at trykke C-x k kan du lukke en buffer. Ved at trykke C-x b kommer der en prompt frem hvor du ved at indtaste navnet på en buffer kan skifte til den, og med C-x C-b får du en liste over alle buffers. Denne liste vil åbne i et nyt vindue i Emacs, et vindue du kan gøre "aktivt" ved at trykke C-x o.
Hvis du vil have fjernet alle ekstra vinduer på skærmen så kun den aktive buffer kan ses, kan du trykke C-x 1. Ved at trykke C-x 3 bliver den aktive buffer delt lodret (og i den ene af dem kan du så indlæse andre ting, fx. filer eller en shell. C-x 2 deler den aktive buffer horisontalt, og C-x 0 fjerner den aktive buffer.
Du kan, som sagt, skifte mellem bufferne med C-x o. En feature der er nyttig i ethvert program er undo/fortryd funktionen, der vil annullere sidste handling. I Emacs kan du fortryde sidste kommando/handling via tastesekvensen C-x u. En anden, og lettere, måde at fortryde på er at bruge kommandoen C-_ (underscore).

Emacs er internt opbygget af Lisp-funktioner. Praktisk taget enhver tastesekvens eksekverer en Lisp-kommando. Man kan se hvilken kommando der er bundet til en given tast ved at trykke C-h k [tast], og hvis man kender navnet på en Lisp-funktion kan man finde ud af hvilken tast den er bundet til, ved at trykke C-h w [kommando]. Enhver "interaktiv" Lisp-kommando kan kaldes ved at trykke M-x [kommando]. Ikke-interaktive Lisp-kommandoer kan kun kaldes ved at skrive Lisp-programmer der benytter sig af dem. Om en funktion er interaktiv eller ej, defineres når funktionen oprettes.

Søgning

Som enhver god teksteditor indeholder GNU Emacs naturligvis en række søgefaciliteter; alt lige fra simpel ordsøgning til regular expression søgning.

Den letteste, og, i mange tilfælde, den mest effektive søgningsmetode er inkrementalsøgning, og den er derfor også som standard sat til den mest logiske genvejstast -- C-s. Når du starter inkrementalsøgning vil der stå I-search: i Emacs' minibuffer. Her kan du bare skrive som du plejer, hvorved dit input vil blive skrevet ind i minibufferen, og efterhånden som du skriver, finde det ord du søger efter. Hvis du fx. skriver "me" vil Emacs hoppe frem til den første instans af den kombination af bogstaver du taster ind; i dette tilfælde kunne det være alt fra med, meddeler og mere til kommer -- Inkrementalsøgning søger altså ikke efter hele ord eller sætninger (men kan godt bruges til det). Hvis søgningen finder et ord der ganske vist stemmer overens med søgetermet, men som ikke er det du leder efter, kan du trykke C-s for at gå til næste resultat. Når du er færdig med at søge kan du trykke ENTER for at afslutte søgningen og flytte markøren til det punkt i bufferen som søgningen fandt, eller C-g hvilket vil afslutte søgningen og placere markøren der hvor den var da søgningen startede. Husk at C-s søger fremad i bufferen fra markørens position, hvis du vil søge bagud skal du bruge C-r, der ellers fungerer nogenlunde ens.

Der er tider hvor det ikke er praktisk eller hensigtsmæssigt at bruge inkrementalsøgning, fx. hvis der er et linjeskift i den tekst du søger efter. I sådanne tilfælde er det praktisk at bruge ordsøgning, der ignorerer formatering (fx. linjeskift) men til gengæld kun søger efter hele ord. Du starter en fremadrettet ordsøgning med tastesekvensen C-s ENTER C-w. Ordsøgning kan være meget praktisk, især hvis man arbejder med større dokumenter.

Slutteligt vil jeg fortælle om regular expression søgning. Regular expressions er en speciel måde at opstille parametre for datasøgning, der er meget brugt i UNIX-verdenen, men da det er et alt for komplekst emne at behandle her, vil jeg ikke fortælle hvordan de skrives og fungerer, blot pointere ud at man kan udføre en fremadrettet regular expression søgning med tastesekvensen M C-s, og en bagudrettet med M C-r.

Emacssøgninger er som standard ikke case sensitive, dvs. at de ignorer om et givent ord er med store eller små bogstaver når den sammenligner med søgetermet. Du kan søge efter et ord med definerede store/små bogstaver ved at skrive søgetermet med dem. Fx:

Fold kodeboks ind/udKode 


Denne søgning vil finde alle instanser af "mormor", inkluderende "MorMor", "morMor", "mormor", "MoRmOr" og enhver anden kombination. Hvis man vil finde en specifik instans kan man skrive:

Fold kodeboks ind/udKode 


Denne søgning vil finde "Mormor", og intet andet.

Customization



Emacs' standardkonfiguration er yderst fremragende, men der er en lang tradition for at ændre på standardopsætningen så Emacs bliver ens personlige editor. Dette kan være alt fra at ændre indenteringsstilen i C-mode, over nye keybindings, til implementation af en webbrowser. Emacs kan således skræddersys ved at ændre i .emacs filen (der ligger i din hjemmemappe, ~/.emacs), der er en fil der indeholder Emacs Lisp kode der køres når Emacs startes.

Nogle praktiske customizations kunne være følgende:

Fold kodeboks ind/udKode 


Den første linje gør at vinduets titel vil reflektere navnet på den aktive buffer. Dette har kun betydning hvis man kører Emacs i et grafisk miljø.
Den anden linje får Emacs til at vise datoen i modelinjen i bunden af alle buffers.
Den tredje linje sætter den almindelige mode til at være text-mode - den kan lidt mere end fundamental-mode, der ellers bruges hvis ingen anden er specificeret.
Den fjerde og femte linje retter nogle ting ang. dansk tegnsæt, hvis man kører Emacs i et ikke-grafisk miljø.
Den sjette linje sætter ispell-ordbogen til dansk. Derved vil ispell bruge den danske ordbog hvis man kører stavekontrol med M-x ispell.
Den sidste linje vil slå global syntakshighlight til. Dette er normalt slået fra, idet syntakshighlight er en forholdsvist resourceintensiv handling, og Emacs er designet til at kunne køre på selv meget gamle maskiner.

Den ovenstående kode er (meget simpel) Emacs Lisp - en afart af Lisp. Jeg vil muligvis senere skrive en artikel om programmering i dette sprog. Alle større customizations af Emacs foregår i dette sprog, så derfor er det meget nyttigt at lære, hvis man har tænkt sig at bruge meget tid i Emacs.

Man kan også benytte sig af Emacs' indbyggede menubaserede customization-options: M-x customize. Customization-programmet vil tilføre de nødvendige linjer kode til din .emacs (omend det ikke vil være særligt pænt), og næsten alt i standard-Emacs kan ændres på denne facon.

Yderligere information



Emacs er et komplekst emne, umuligt at dække i et så lille dokument som dette, men heldigvis er der masser af kilder online:

* www.emacswiki.org
* www.xemacs.org
* www.gnu.org/software/emacs/emacs.html
* http://bioinformatics.weizmann.ac.il/~lvssso/emacs/guide.html
* http://www.delorie.com/gnu/docs/emacs/emacs_toc.html
* Sidst, men ikke mindst, Emacs fremragende indbyggede dokumentation: C-h i m emacs.


Hvad synes du om denne artikel? Giv din mening til kende ved at stemme via pilene til venstre og/eller lægge en kommentar herunder.

Del også gerne artiklen med dine Facebook venner:  

Kommentarer (2)

User
Bruger #2855 @ 20.11.04 08:38
Wow! sådan en artikel kunne jeg godt have brugt da jeg startede på linux for et par år siden!!! men dejligt, lige at få frisket sin viden op!
User
Bruger #173 @ 20.01.05 19:29
En rigtig god introduktion til Emacs, som hverken er for langsom og kedsommelig eller springer hurtigt over emnet. Du er meget præcis (du beskriver f.eks. hvordan en fils indhold bliver loadet ind i bufferen), og du beskriver de allervæsentligste ting, som en nybegynder kunne få brug for. Da jeg begyndte at bruge Emacs, så var det netop disse ting, jeg havde brug for, hvilket jeg brugte GNU Emacs' indbyggede tutorial og info-manualen til at finde frem til.

For potentielle Emacs-brugere kan jeg kun anbefale, at man prøver at sætte sig ind i at bruge editoren en ekstra gang, før man kasserer den. Så mange Linux-brugere (og Richard Stallman) kan ikke tage fejl.

Noget af det mest anvendelige ved Emacs er dens brug af ti-finger-systems-baserede genvejstaster. Så bruger du ti-finger-systemet, vil funktionerne i Emacs kun føles som en udvidelse af den tekst du skriver, og der er altså kort vej fra indhold til funktionalitet, kunne man sige.

Emacs kræver ligesom livets andre goder tilpasning. Men har du først vænnet dig til at bruge editoren og lærer lidt mere hen ad vejen engang imellem -- ved for eksempel at læse i info-manuelen eller ved at installere Emacs-Lisp-filer -- så kan du vinde tid og slippe for mange problemer.

Okay, det var vist det.
Du skal være logget ind for at skrive en kommentar.
t