5.5. Emacs

I en klasse for sig selv er Emacs (emacs) og søsterprogrammet XEmacs (xemacs), som begge kan utroligt mange ting, men kræver meget hukommelse (den kørbare fil i X-udgave er på ca. 2,3 Mb). XEmacs er relativt enkel at bruge, idet der er både menuer og kommandoer – Emacs har ikke helt så smarte knapper, men kun tekstmenuer. Desværre følger kun Emacs og ikke XEmacs med de fleste udgaver af Red Hat, men XEmacs findes som Red Hat-pakker, og det er let at installere den.

Emacs og XEmacs har syntaksfremhævning til næsten alle programmeringssprog (også Matlab og LaTeX), hvilket gør dem meget lækre at arbejde med. Syntaksen i koden forstås, så indrykning af f.eks. C-kode sker automatisk, og koder vises med enten forskellige skrifttyper og/eller farver.

XEmacs og Emacs kan sættes op gennem et meget slagkraftigt makrosystem, så programmering eller tekstbehandling kan tilpasses ud fra næsten alle ønsker. Hvis det måtte ønskes, kan Emacs styre næsten alt. Du kan fra Emacs oversætte C-programmer, du har redigeret, og køre en debugger direkte fra Emacs. Du kan sende og modtage elektronisk post gennem Emacs. Der er endvidere mulighed for at starte en kommandofortolker op i Emacs, hvorfra programmer kan udføres. Alt dette kan køres samtidig med redigering af et vilkårligt antal filer. Mange siger tit "Emacs kan bl.a. alt", og pånær at lave kaffe er det ikke modsagt. Til teksteditering og programmering er Emacs en Rolls Royce.

Figur 5-3. Emacs med to filer åbne

Filer redigeres ikke direkte på harddisken, men arbejdes på i såkaldte buffere, altså kopieres filens indhold til hukommelsen, hvor Emacs så behandler den. Således forhindrer man de mest alvorlige fejl, der skyldes at to programmer vil bruge samme fil samtidigt. Det er dog i daglig brug ikke til at skelne fra anden redigering af tekstfiler, så man taler normalt om buffere og åbne filer i flæng. Der er én buffer som er helt speciel, nemlig minibufferen, der altid er åben. Den er altid den nederste linje, og den bruges af Emacs til at vise dig forskellige beskeder i, og det er den, man skriver kommandoer mv. i.

Start Emacs op ved at skrive emacs, hvad enten du er i en tekst-tilstand eller i en grafisk brugergrænseflade. Emacs har menuer, hvorfra mange af funktionerne kan styres. Ud for hver funktion står også en tastaturkode. Derfor lærer du hurtigt at styre Emacs, også hvis du foretrækker tastaturkoder. Her gives en kort oversigt over de mest anvendte tastaturkoder. Ctrl står for kontroltasten, og Meta står for Meta-tasten, der i Linux er lig med Alt-tasten (eller Escape).

Tabel 5-2. Oversigt over de mest anvendte Emacs-kommandoer.

Kommando Forklaring
Ctrl-h ? Hjælp om hjælpesystemet. Den indbyggede hjælp er enormt god, når man lige lærer at bruge den.
Ctrl-x Ctrl-f Find fil (til indlæsning). Indtast navnet på den ønskede fil, eller anvend tabulator til at få fil-liste, og brug musen (midterste knap) til at vælge. Hvis filen ikke findes i forvejen, vil den blive oprettet. Bemærk, at Ctrl-x f er noget helt andet!
Ctrl-x k Dræb buffer. Anvendes til at fjerne den indlæste fil.
Ctrl-x Ctrl-s Gem fil med samme filnavn.
Ctrl-x Ctrl-w Gem fil med nyt filnavn.
Ctrl-s Søg efter det, du angiver. Der skal ikke trykkes return til sidst. Tryk Ctrl-s for at søge til næste fremkomst af det valgte mønster.
Meta-% Søg og erstat (tryk Alt-Shift-5). Til de enkelte steder, hvor der kan erstattes, kan der tastes y for erstat, n for spring videre og endelig kan tastes ! (udråbstegn) for at erstatte alle kommende forekomster.
Markering af tekst Dette kan ske ved at trykke venstre museknap ned og trække ned over teksten. Teksten er nu i en redigerings-buffer.
Ctrl-_ Undo.
Ctrl-x 1 Vis kun én ramme i vindue.
Ctrl-x 2 Del aktuelle vindue i to rammer, som kan bruges til at redigere forskellige filer.
Ctrl-q TEGN Quote – bruges til at indtaste f.eks. linjeskift Ctrl-M (Skriv Ctrl-q Ctrl-M).
Ctrl-w Klipper markeret tekst til redigeringsbuffer. Sker hurtigere med et dobbeltklik på højre museknap.
Ctrl-y Yank text, dvs. indsæt tekst. Bemærk, at dette kan ske hurtigere med midterste museknap.
Meta-q Formatér tekst til at fylde linjerne ud. Meget anvendelig til almindelig tekst, hvis linjerne er delt meget skævt. Emacs kan også genkende formler, som ikke vil blive ombrudt.
Meta-x Kør en kommando. Man skriver kommandoens navn i minibufferen og trykker enter.

Det kan også nævnes, at Ctrl-venstre museknap giver en oversigt over filer, der er indlæst. På den måde kan du hoppe mellem filerne, du har indlæst. Med Ctrl-højre museknap kan skærmens skrift ændres. Bemærk, at Emacs kan og bør sættes op til brugeren. Det gøres i en .emacs-fil, der gemmes i hjemmekataloget. Her er et eksempel på indholdet af en .emacs-fil. Du kan nøjes med de første fire linjer til at begynde med. Senere kan du bygge videre på standardindstillingerne – alt efter dine ønsker.

;;De første fire linjer vil gøre, at de danske bogstaver virker rigtigt.
(set-language-environment "Latin-1")
(set-input-mode (car (current-input-mode))
  (nth 1 (current-input-mode))
  0)


;;Bind nogle gode funktioner til Ctrl- og musetasterne
;;Ctrl-venstre mus giver menu over åbne filer
;;Ctrl-midterste mus viser afsnit i filen som der kan hoppes til
;;    For C-filer er det alle funktioner (cool).
;;Ctrl-højre mus for at vælge skrifttype
(global-set-key [\C-down-mouse-1] 'mouse-buffer-menu)
(global-set-key [\C-down-mouse-2] 'imenu)
(global-set-key [\C-down-mouse-3] 'mouse-set-font)

;; Praktiske genveje for home, end, Ctrl-left/right og delete tasterne
(define-key global-map [home]    'beginning-of-line)
(define-key global-map [end]     'end-of-line)
(define-key global-map [C-left]  'backward-sexp)
(define-key global-map [C-right] 'forward-sexp)
(define-key global-map [delete] 'delete-char)

;;Følgende kommando gør at emacs virker (dvs. backspace virker), i teksttilstand
;;(hvilket man i X kan opnå ved at skrive "emacs -nw").

(keyboard-translate ?\C-h ?\C-?)
(define-key global-map "\C-x?" 'help)

;;Meta-g for goto linje nummer
(global-set-key "\M-g" 'goto-line)

;;Vis linje og kolonne numre
(setq line-number-mode t)
(setq column-number-mode t)

;;For C og HTML filer skal filerne vises med smart farvning
(setq c-mode-hook 'font-lock-mode)
(setq html-mode-hook 'font-lock-mode)

;; Udkommenter følgende linjer hvis du ikke vil
;; have menu-linjer med
;(menu-bar-mode 'nil)
;(tool-bar-mode 'nil)


;;Filer der ender på .c og .h er C-filer og .html er HTML-filer
(setq auto-mode-alist
  (append '(("\\.c$"  . c-mode)
            ("\\.h$"  . c-mode)
            ("\\.html$" . html-mode)
            ) auto-mode-alist))

Emacs kan som sagt alt på nær at lave kaffe (hvilket er forkert, da adskillige i tidens løb har fået Emacs til netop dette). Det betyder dog ikke at Emacs kan alt samtidigt på samme buffer; hver buffer tilpasser sig filtypen, således at hvis man redigerer en C-fil, optimerer Emacs sig til sådan brug, og hvis man skriver et LaTeX-dokument, tilpasser Emacs sig dette. Ved at Emacs tilpasser sig forstås, at menuerne, syntaksfremhævning, tastaturbindinger/genvejstaster, tilgængelige kommandoer osv. ændres således, at det, man skal bruge, altid er let tilgængeligt. Dette er såkaldte major modes, altså tilstande der i væsentlig grad ændrer den måde, hvorpå Emacs virker. Lige nu har jeg ca. 12 aktive buffere i Emacs, hvor den, jeg netop nu skriver i bruger SGML major mode, en anden dired major mode, nogle stykker fundamental mode (den allermest grundlæggende, der ingen specielle muligheder har) osv. I denne buffers nuværende tilstand, kunne jeg trykke Ctrl-c Ctrl-c, og Emacs ville kalde et program, der validerer den nuværende buffer, men hvis det havde været et LaTeX-dokument, jeg havde skrevet på, ville Ctrl-c Ctrl-c have kaldt latex på bufferen. Prøv at trykke Ctrl-h m i Emacs; det vil få en beskrivelse af den aktuelle major mode frem.

Man skal normalt ikke bekymre sig om, hvordan man får fremkaldt en ønsket major mode, da Emacs selv holder styr på filtyper ved hjælp af "efternavne" eller specielt indhold (eksempelvis kan Emacs se, at filer, der begynder med #!/bin/sh altid er shell-scripts). Er man dog ikke tilfreds med den major mode, man befinder sig i, kan man sagtens ændre den. Det gøres med Meta-x [tilstandsnavn]-mode (f.eks. Meta-x sgml-mode).

Hvor major modes tilbyder funktionalitet, der er specielt rettet mod visse filtyper, er der også minor modes, der er mere generelt anvendelige, og virker på tværs af major modes. Altså kan en minor mode som f.eks. flyspell-mode, der foretager løbende stavekontrol, bruges i sgml-mode, LaTeX-mode og så fremdeles. Når der foretages automatisk linjebrydning og syntaksfremhævning, er det faktisk en minor mode, der laver arbejdet, om end mange minor modes virker lidt forskelligt fra major mode til major mode. Syntaksfremhævningen skal f.eks. ikke farve de samme elementer i et LaTeX-dokument som i C-kode. Minor modes kaldes på samme måde som major modes.

Nu et lille sidespring. Historien går, at der i 1980'erne var mange Unix-folk, som var stærke vi-fanatikere, og der var måske lige så mange emacs-fans. For at få afklaret én gang for alle, hvilken editor der var bedst, blev der afholdt en dyst i paintball, hvor vi-holdet fik en kneben sejr. Dette bør naturligvis efterprøves en dag, da emacs har udviklet sig meget siden da.

Vi kan endvidere anbefale at købe en bog om Emacs, f.eks. SAMS Teach yourself Emacs in 24 hours af Jesper Pedersen, fra forlaget SAMS.

I øvrigt kan det nævnes, at det ikke bare er i Emacs at de fleste viste tastaturgenveje kan anvendes, men også i bash, tcsh, tekstindtastningsfelter i Netscape mv.

Er du ude på at finde bedre tricks til .emacs dvs. opsætningen af Emacs, så er et godt sted at starte på http://www.dotemacs.de/. Et eksempel er http://www.dotemacs.de/dotfiles/BenjaminRutt.emacs.html.

Tip: Skal man søge efter en tekst i Emacs og gerne vil have et overblik over de linjer hvor teksten optræder, så kan Alt-x occur anvendes. Man indtaster derefter søgestrengen og alle linjer med søgestrengen vises.

Tip: I bogen "Linux – Friheden til at programme" står der under CVS et afsnit om hvordan man smart kan sammenligne filer med hinanden med Emacs.

5.5.1. Mus med hjul og Emacs

For at benytte hjulet til at rulle op og ned i Emacs laves en Emacs Lisp-fil (en el-fil). Som root kan den placeres sammen med de andre el-filer i /usr/share/emacs/20.2/lisp. Dette muliggør lettere adgang, idet Emacs' "library-path" umiddelbart finder filen, når den skal indlæses. Man kan f.eks. kalde filen mwheel.el, og den kan se ud som følger:

;;; No copyright

;; Maintainer: Jan Eggert Kofoed  mailto:jan.kofoed@person.dk
;; Keywords: intellimouse

;; This file can be used with GNU Emacs.

;; The code was taken from
;;   www.inria.fr/koala/colas/mouse-wheel-scroll
;; which is maintained by Colas Nahaboo, but the code is put there
;; with courtesy of
;;    Sylvia Knight, Sylvia.Knight@cl.cam.ac.uk

;;; Code:

(defun up-slightly () (interactive) (scroll-up 5))
(defun down-slightly () (interactive) (scroll-down 5))
(global-set-key [mouse-4] 'down-slightly)
(global-set-key [mouse-5] 'up-slightly)
(defun up-one () (interactive) (scroll-up 1))
(defun down-one () (interactive) (scroll-down 1))
(global-set-key [S-mouse-4] 'down-one)
(global-set-key [S-mouse-5] 'up-one)

(defun up-a-lot () (interactive) (scroll-up))
(defun down-a-lot () (interactive) (scroll-down))
(global-set-key [C-mouse-4] 'down-a-lot)
(global-set-key [C-mouse-5] 'up-a-lot)

Filen kan også byte-oversættes med Emacs. Emacs kan så læse filen, når du skriver følgende linje ind i ~/.emacs:

(load-library "mwheel")