[Tillbaka till uppLYSningar som varit]

Under föredraget delades det ut två blad:

Båda dessa finns att hämta ifrån http://www.lysator.liu.se/upplysning/emacs/. .emacs är en textfil och lathunden finns som TeX-, dvi- och postscriptfil.

GNU Emacs

Emacs - Escape Meta Alt Control Shift
Emacs - Eight Megabytes And Constantly Swapping

Förslagen om vad Emacs egentligen står för är många. Vad emacs egentligen står för är Editing MACroS.

Vad föredraget gick ut på var att få oss att förstå hur Emacs fungerar och hur man gör för att använda Emacs.

Vad föredraget inte gick ut på var programmering, menyer och hur man fipplar med musen. "Jag kommer att förklara hur otroligt bra det är att lära sig alla knappkombinationer.", som David sade.

Historia

I datorernas begynnelse använde man radeditorer, som t.ex. ed. Sedan utvecklades fullskärmseditorer som vi (Tryck :q! för att avsluta!) och TECO. På MIT:s AI-lab gjorde Richard Stallman (även kallad RMS) ett macropaket i TECO. Detta var mycket bra men hade ett problem; om man skulle ha någon nytta av paketet så måste man även ha TECO, vilket var kommersiellt och kostade pengar. Då skrev RMS om macropaketet i något programspråk, kanske C och lät den distribueras fritt. Det är väldigt bra, för man får med källkod och allt till emacs. Emacs är en fullskärmseditor som från och med version 19 kan öppna egna fönster i fall man kör fönstersystem som t.ex. X-Windows.

Hur man startar emacs

Man kan starta emacs på olika sätt:

Hur emacs fungerar

Det finns olika typer av objekt i emacs:

Emacs automatsparar filer hela tiden. Filer som automatsparas får t.ex. namnet #foo# ifall filen heter foo. När man sparar sin fil i emacs tas filen #foo# bort eftersom den inte behövs längre. Om man fortsätter att editera igen skapas filen #foo# som backup igen. Ser man en sådan fil betyder det att emacsen har dött. Man kan då skriva M-x recover-file i emacs, och sedan skriva foo på fråga om vilken fil man vill rädda. Emacs sparar även gamla versioner av filen. De kan heta foo~ eller foo.~1~ eller foo.~2~ o.s.v. (se även variabeln version-control).

Här stötte vi på något nytt: M-x. Det betyder att man ska trycka ner Metaknappen och samtidigt som man håller den nere ska man trycka på x. Metaknappen kan se olika ut på olika tangentbord. Ibland har den en romb på sig, ibland är det altknappen som är metaknapp. Ifall det inte finns någon metaknapp på tangentbordet kan man alltid trycka ESC och sedan x istället för M-x. Observera att du i detta fall ska trycka på ESC, sedan släppa ESC och därefter trycka på x.

Redigering

Redigering i emacs är inte riktigt likadant som redigering i en ordbehandlare. En skillnad är t.ex. att emacs inte bryter rader. En emacsrad kan gå över flera skärmrader.

Flytta m.m.

För att flytta sig runt kan man använda sig av följande (C-f betyder håll Control nedtryckt och tryck f.):

C-f, C-b, C-n, C-p för att flytta sig framåt, bakåt, neråt respektive uppåt.såhär:

     M-v
     C-p
      |
C-b -- -- C-f
M-b   |   M-f
     C-n
     C-v

M-b och M-f flyttar ett helt ord bakåt respektive framåt. M-v och C-v flyttar ungefär en sida upp respektive ner. Det finns ett bibliotek för att flytta upp och ner mer exakt som heter scroll-in-place, men mer om det längre fram.

C-d, M-d tar bort ett tecken respektive ord efter markören.

C-o lägger in en radbrytning precis där man står.

C-t byter plats på tecknen som står före och efter markören. Det är bra för ifall man skriver snabbt så trycker man ibland på knapparna i fel ordning.

Prefix

C-u. Ifall man vill upprepa kommandon många gånger kan man trycka C-u innan kommandot. C-u betyder "gör 4 gånger så många". Trycker man C-u C-u innebär det att något ska utföras 16 gånger.

C-u 17 C-f. Man kan även med siffror ange hur många gånger något ska utföras. C-u 17 C-f stegar fram 17 bokstäver i bufferten.

C-u 70 - sätter in 70 minustecken. Det kan vara bra att ha ifall man vill göra något som avskiljer i en text.

Klipp och klistra

I emacs kan man även klippa och klistra. Följande kommandon använder man då:

C-k. Detta tar bort från markören till slutet på raden. Står man redan sist på raden så tas radslutet bort, d.v.s. nästa rad hoppar upp ett steg och börjar där markören står. Ytterligare en finess är att om man tar bort saker upprepade gånger genom att trycka C-k så läggs det borttagna till i en s.k. kill-ring. Om man alltså tryckt C-k 6 ggr och på så sätt tagit bort 3 rader så hamnar alla 3 raderna i kill-ringen och man kan sedan sätta in alla 3 raderna på en gång.

C-y. Klistra in texten som man tagot bort gör man med C-y, som betyder yank.

M-y. För att klistra in saker som man tagit bort tidigare kan man använda M-y, som står för yank-pop. Det fungerar som så att man trycker på C-y en gång för att sätta in det senast utklippta. Sedan trycker man direkt efteråt på M-y för att sätta in det näst senast utklippta. M-y ytterligare en gång sätter in det näst näst senast utklippta, eller "som helt automatiskt sätter in texten som vi ville ha", som David sade.

Hjälp

I emacs finns ett omfattande hjälpsystem.

C-h C-h C-h. Trycker man på C-h en gång skriver den "C-h (Type ? for further options)-" och väntar på att man ska skriva något. Då kan man trycka på C-h en gång till så får man se en lista på alla bosktäver man kan trycka, men man får inte veta vad de betyder. Trycker man då C-h en gång till får man se en "fin lista på all hjälp som finns".

C-h t. En tutorial, d.v.s. en snabbkurs på de vanligaste kommandona.

C-h m. Beskriv moden som man har påslagen för tillfället. Detta kommando är bra att komma ihåg.

C-h k. Beskriver kommandot för en viss knapp. Trycker man C-h k så väntar emacs på att man ska trycka på någon knapp. Sedan beskriver den kommandot som är bundet till den knappen. Prova t.ex. C-h k M-y för att få hjälp om yank-pop!

C-h i. C-h i står för info. Det är ett dokumentationsläsningssystem med all dokumentation för emacs. Vill man veta vilka knappar som man kan använda däri kan man trycka h för hjälp eller C-h m för att beskriva moden.

C-h a. Alla kommandon har namn. C-h a anropar command-apropos. Ifall man t.ex. letar efter yank-pop men bara kommer ihåg att det började med yank-någonting kan man använda C-h a.

C-h w. Ifall man sedan vill veta ifall något visst kommando sitter på någon knapp kan man trycka C-h w för att få reda på det.

Flera buffertar

Om laddar in en fil, foo, med C-x C-f foo och sedan laddar in en annan fil, bar, med C-x C-f bar så syn bara filen bar i fönstret. Ifall man vill byta så att man ser filen foo igen trycker man C-x b och skriver foo.

Här kommer en generell sak: Så gott som överallt där man ska skriva in ett namn kan man skriva en liten bit av namnet och sedan trycka på tab-knappen eller på mellanslag så försöker emacs fylla i så mycket den kan. Mellanslag och tab fyller i på ungefär samma sätt, men mellanslag stannar ibland vid punkter och streck.

Åter till fönstrena. För att dela upp i flera fönster, ta bort och hoppa mellan de olika fönstrena kan man trycka:

C-x 2 för att dela upp i två fönster, det ena ovanför det andra.

C-x o för att hoppa mellan fönstrena. C-x o betyder other-window.

C-x 1 tar bort alla andra fönster så att det man står i blir "the one and only".

C-x 0 tar bort det fönster man står i.

Sedan finns det kommandon som själva delar upp fönstret, t.ex. C-h m (hjälp för moden). Om då texten i hjälpfönstret är för lång så att man inte ser hela kan man scrolla den på olika sätt:

C-x o sedan C-v, men det finns ett snabbare sätt: M-C-v. "Man ska inte trycka för många knappar". Nåja, musen kan vara bra ibland, t.ex. ifall man ska välja i en buffertlista med många långa och likartade namn.

Regioner

En region motsvarar ungefär en markering i en ordbehandlare, fast i emacs så är den osynlig. (Det går att ändra på genom att ladda biblioteket transient-mark-mode.) I emacs är en markering det som finns mellan märket och insättningspunkten (markören). Märket sätter man genom att trycka C-rymdkrog (C-mellanslag). Det spelar ingen roll i vilken ordning man har märket och insättningspunkten. Regionen är mellan dem. Olika knappar för regioner:

C-w tar bort regionen. Regionen går till kill-ringen och kan klistras in igen med C-y. Att ta bort genom att göra en region och tryck C-w istället för att ta bort rader med C-k kan vara fördelaktigt om man inte vill ta bort ända till slutet på raden.

M-w kopierar regionen till kill-ringen. Till skillnad från C-y så tas inte regionen bort. Även här så kan man klistra in det kopierade med C-y.

C-x C-x byter plats på insättningspunkten och märket. Det kan vara användbart ifall man t.ex. vill spana lite längre ner i filen ett kort tag. Då kan man sätta märket, spana där nere och hoppa tillbaka med C-x C-x. Det kan också vara användbart om man vill att regionen ska börja tidigare än märket. Man trycker då C-x C-x, backar ett steg och trycker C-x C-x igen så har man utökat regionen ett steg i början.

C-u C-mellanslag hoppar till ställen där man satt märket senast, näst senast o.s.v.

Spara på fil

C-x C-s sparar bufferten.

C-x C-w sparar bufferten och man får ange filnamnet.

C-x s sparar alla buffertar. Man får för varje osparad buffert svara på en fråga huruvida man vill spara.

Sök och ersätt

C-s Sökning framåt. När man tryckt C-s så står emacs och väntar på att man ska skriva vad man vill söka efter. Trycker man då på en knapp, t.ex. f, så letar emacs upp första ställe som det står ett f på. Trycker man då på t.ex. o så letar emacs upp det första ställe som det står fo på. Trycker man då o igen letar emacs upp foo, o.s.v. När man sökt färdigt kan man trycka return. Läs gärna mer om sökning genom att trycka C-h k C-s (hjälp om kommandot på C-s).

C-r gör samma sak som C-s fast bakåt. Man kan mitt under sökningen byta riktning genom att trycka C-r eller C-s.

M-% Ersätter. Man får ange en sträng som ska bytas ut och en sträng som ska sättas in. För varje förekomst får man frågor om ifall man vill byta ut eller inte. Man kan då trycka bl.a. y, n eller ! för ja, nej respektive byt ut alla och fråga inte mer.

M-x replace-string byter ut utan att fråga.

M-x query-replace-regexp byter ut reguljära uttryck (regexp:ar). Vet du inte vad ett reguljärt uttryck är så behöver du inte bry dig om funktionen. Man kan t.ex. byta ut foo\(...\) mot fie\1. Tre punkter betyder tre bokstäver, vilka som helst och \1 betyder det som står inom första parantesparet. Vad reguljära uttryck är dock bortom denna föreläsningen.

Avbryt

C-g En knapp som är mycket bra att ha är C-g. Den säger till emacs att den ska avbryta det som den höll på med. Om man t.ex. tryckt C-x C-f för att ladda in en fil men sedan kommer på att man inte alls ska ladda in en fil så kan man trycka C-g för att avbryta. Den fungerar i alla situationer utom när man ska svara på ja- eller nejfrågor.

Diverse

Menyraderna

I sitt fortsatta korståg mot menyraderna (läs med en smula humor!) berättade David att man kan ta bort menyraden högst upp genom att skriva M-x menu-bar-mode.

Programmeringsmoder

Man kan i emacs ställa in olika sätt som emacs ska behandla texten på. Det finns t.ex. en pascal-mode för pascal. I vanliga editorer får man indentera (skjuta texten åt höger) själv genom att sätta mellanslag eller tabbar. I emacs går detta automatiskt. Ifall man har följande program i emacs och har slagit på pascal-mode (M-x pascal-mode)...

begin
x := y;
while x = y do
write('x');
end

...så kan man gå till andra raden och trycka tab så skjuter emacs in raden till sin rätta position:

begin
   x := y;
while x = y do
write('x');
end

Nu kan moden göra fel ibland, särskilt pascal-moden, men inte c-moden eller lisp-moden.

Förut fanns det på tangentborden på IDA två return-knappar och på den ena stod det LFD som i linefeed. LFD-knappen gjorde vagnretur följt av indentering och var således mycket praktisk att ha vid programmering. Man kan trycka på C-j. Den gör samma sak som LFD. Man kan också binda om knapparna så att return-tangenten gör samma jobb som LFD-knappen. Ett exempel på hur det kan se ut finns någonstans mitt på sidan 2 i filen .emacs som delades ut vid föreläsningen. Den går också att hämta via http://www.lysator.liu.se/upplysning/emacs/dot.emacs.

Knappar som kan vara användbara i programmeringsmoder är:

M-C-f och M-C-b: uttryck framåt och bakåt.

M-C-u och M-C-d hoppa "utåt" respektive "inåt" ett uttryck.

M-C-a och M-C-e hoppa till början respektive slutet av funktionen.

M-C-q och M-C-\ indenterar en funktion respektive en region.

Det finns även ett par olika paket för att hoppa mellan funktioner. Ett är imenu, men det har David inte använt så mycket, så det vet han lite om.

Ett annat är tags. Det fungerar så att man skriver

etags *.c

vid unix-prompten (inte i emacs). I emacs trycker man sedan M-. och anger ett funktionsnamn som man vill hoppa till.

Andra moder

I emacs finns major modes och minor modes. En major mode ändrar beteendet i stora drag. Pascalmoden är en sådan. En minor mode ändrar beteendet generellt och kan gälla för flera major modes.

Ett exempel på en minor mode är auto-fill-mode som kan slås av och på med M-x auto-fill-mode. Auto-fill-mode bryter av rader automatiskt ifall de blir längre än 70 tecken. På så sätt kan man slippa att en emacsrad går över flera skärmrader. Om man klipper och klistrar kan man dock råka ut för att en rad blir längre än skärmraden. Då kan man bryta om ett stycke med C-q. Ett stycke avgränsas av en tom rad ovanför och under.

Att använda bibliotek

Vi tar som exempel att vi vill använda biblioteket scroll-in-place. När man väl har hittat filen kan man lägga den i ett elisp-katalog på sin hemmakatalog. Den kan då finnas i t.ex.
~/elisp/scroll-in-place.el

Läs gärna instruktionerna om biblioteket. De är ofta utförliga och finns i kommentarer först i filen.

Det inte så bra att ladda in alla filer med hela sökvägen. Det är bättre att tala om för emacs var den ska leta. Det kan man göra med följande (som är saxat ur http://www.lysator.liu.se/upplysning/emacs/dot.emacs som delades ut på föredraget."

(setq load-path
      (append
       (list (expand-file-name "~/elisp")
             ;; Fler dir här
             )
       load-path))

När vi sedan ska ladda filen skriver vi

(load "scroll-in-place")

Notera här att vi inte skriver .el sist. Det är för att det kan finnas filer som slutar på .elc. De är bytekompilerade och går fortare att köra.

Det går fortare att starta emacs om man inte behöver ladda in en väldig massa bibliotek från början. Man kan utnyttja en finess som gör att biblioteken inte laddas förrän de behövs. Vi kan ha ett bibliotek som heter t.ex. html-helper-mode som gör det lättare för oss att editera html-filer (sådana som WWW-sidor är gjorda av). Det behövs inte alltid och då kan vi skriva:

(autoload 'html-helper-mode "html-helper-mode" t)

där "html-helper-mode" är filen som ska laddas in när funktionen 'html-helper-mode anropas.

Ett annat exempel på sådana arrangemang är biblioteket dired som kan användas bl.a. för att kopiera, flytta, ta bort, namna om filer. När man startar dired (med C-x d) så skriver emacs att biblioteket dired laddas in.

Förströelse

Om man vill roa sig lite kan man skriva

M-x dunnet

eller

M-x gomoku

eller (på Lysator, för att styra Lysators jukebok):

M-x jukebox

Frågor och svar

Q: Hur får jag åäö att bli åäö?
A: Skriv M-x standard-display-european.

Q: Hur styrs det vilken mod som filer ska öppnas i?
A: Variabeln auto-mode-alist är en lista som anger en mod beroende på hur filnamnet ser ut. Man kan även i filen skriva -*-Emacs-lisp-*- för att emacs ska byta mode till emacs-lisp. Ett annat exempel är att skriva -*-makefile-mode-*- för att få makefiler att laddas i makefilemode. Normalt laddas de annars i textmode.

Q: Hur får man vackra färger?
A: M-x font-lock-mode. På IDA blir det fetstil, kursivt och understruket eftersom de inte installerat senaste versionen. På Lysator och på burken hemma blir det färger. i .emacs-filen har David satt knappen C-c F till att slå på och av font-lock-mode (se sidan 3). Ett relevant paket är lazy-lock som gör att endast den del av filen som syns färgläggs. Med font-lock-mode färgläggs hela filen när den laddas in i emacs och sedan också vartefter man skriver. Det gör att det kan ta lång tid att färglägga en stor fil.

Q: Görs evaluering av ett uttryck i bufferten (C-x C-e eller M-C-x) genom att uttrycket klipps ut och evalueras i minibufferten?
A: Nej.

Q: För att ladda bibliotek: när ska man använda require och när ska man använda load?
A: Om man t.ex. skriver ett eget bibliotek som behöver något annat så kan man skriva require för då laddas biblioteket in bara en gång även om det är många som behöver det. Om man skriver load så laddas det in så många gånger som man skrivit load. Dock så måste man skriva provide i sitt paket och det har somliga glömt, så då måste man använda load för att ladda in dem iallafall.

Q: Ger det någon skillnad minnesmässigt?
A: Nej, bara tidsmässigt, för det mesta iallafall.

Q: Varför fungerar inte dired?
A: På Solaris 2 kan man köra på svenska. Då blir dired förvirrad (månadsnamn heter olika, etc.). Skriv unsetenv LANG innan du startar emacs så glömmer den bort att den kan svenska.


Nedtecknat av Tomas Abrahamsson <tab@lysator.liu.se>.