Web
Analytics
 

Editors on IOOPM

Table of Contents

As long as this note remains on this page, any information is subject to change and broken links, etc. are to be expected. Please be restrictive in reporting any errors for now.

Most of this text is being written from scratch in 2018. For now, refer to the bootstrap sections on the C bootstap labs.

1 Introduktion till Emacs

Skrevs av Elias Castegren, huvudassistent på IOOPM 2011–2017. Vissa tillägg av Tobias (speciella kortkommandon för IOOPM).

Här finns en YouTube-kanal med 20+ Emacs-videos i tutorial-format, för dig som gillar video-orienterad kommunikation.

det här är en kort genomgång av några väldigt grundläggande kommandon i Emacs. Dokumentet är inte utförligt eller ens särskilt pedagogiskt, utan jag har försökt sammanfatta de kommandon som jag själv har haft mest nytta av (och använder i princip dagligen). Det är inte en introduktion, utan snarare en resurs för den som har använt Emacs lite grand och vill lära sig att bli mer effektiv. Du kan också använda filen init.el (se ovan) som utgångspunkt om du vill konfigurera ditt eget Emacs. Emacs letar efter inställningar (bland annat) genom sökvägen ~/.emacs.d/init.el.

Nästan alla kortkommandon i Emacs innehåller tangenterna Control och Meta (symbolen som ser ut som en diamant på tangentborden i datorsalarna). När man skriver ut kortkommandona skriver man C för Control och M för Meta. För att till exempel spara en fil trycker man C-x C-s, alltså först “Control x” (håll in Control och tryck “x”), och sen “Control s” (håll in Ctrl och tryck “s”). Det är ofta så att “Control bokstav” och “Meta bokstav” gör liknande saker. C-f flyttar till exempel fram markören ett tecken, medan M-f flyttar fram den ett helt ord. På datorer som inte har en Meta-tangent brukar man kunna använda ESC (i terminalen eller grafiskt) eller Alt (grafiskt) istället. På Mac-datorer funkar Cmd eller Alt (beroende på vilken version av Emacs man kör). I det här dokumentet skrivs specialtangenter som space, delete och return ut med vinkelhakar: <space>, <del> och <ret>.

Det bästa sättet att lära sig är att helt enkelt försöka använda alla kommandon så ofta som möjligt. Varje gång man gör något, om det så är kopiera text eller bara flytta markören, så ska man fundera på hur man kan göra det med så få knapptryckningar som möjligt. I början kommer det kännas omständligt att leta upp kortkommandon för allt man ska göra, men efter ett tag sätter det sig i fingrarna och då kommer man att bli mer effektiv i sitt arbete. Sist i dokumentet finns en sida som sammanfattar några användbara kommandon. Den kan man med fördel skriva ut och låta ligga bredvid datorn när man arbetar. Här följer en kort beskrivning av dessa kommandon.

1.1 Öppna filer och hantera buffrar

När man startar Emacs är det första man vill göra att välja vilken fil man vill jobba med. För att öppna en fil är kommandot C-x C-f (f som i find file). Om filen inte finns kommer den att skapas. Sparar gör man med C-x C-s (save file), eller C-x C-w (write file) om man vill ange ett nytt namn på filen. Rent tekniskt skapas en ny fil när man sparar för första gången.

När man öppnar en fil i Emacs läses den in till en buffer. Man kan ha flera buffrar inlästa samtidigt, och man byter buffer genom att trycka C-x b och ange namnet på buffern man vill byta till. C-x C-b visar en lista på alla inlästa buffrar, och C-x k (kill buffer) stänger den aktiva buffern.

Om man vill kunna se flera buffrar samtidigt kan man dela Emacs-fönstret horisontellt (C-x 2) eller vertikalt (C-x 3). Man byter mellan öppna fönster med C-x o (other window) eller genom att klicka i ett fönster. C-x 0 stänger det aktiva fönstret, och C-x 1 stänger alla fönster förutom det aktiva.

Om du använder inställningsfilen från IOOPM har du följande kortkommandon också:

  • C-x | – delar fönstret vertikalt
  • C-x - – delar fönstret horisontellt
  • M-n n– öppna en tom buffert (som knyts till en fil först vid spara)

(De två första kortkommandona är inspirerade av tmux.)

1.2 Navigering

Du kan scrolla nedåt i ett fönster med C-v (view next screen) och upp med M-v. C-l (center line) centrerar fönstret vid markören. Trycker man C-l flera gånger så scrollas fönstret så att markören hamnar överst eller underst i fönstret. Utöver dessa kommandon fungerar PgUp och PgDn som vanligt, även om moderna laptops inte brukar ha särskilda tangenter för dessa kommandon längre.

Kortkommandona för att flytta markören är C-f (forward), C-b (backward), C-n (next line) och C-p (previous line). Håller man in meta-tangenten istället för control (alltså M-f och M-b) flyttar man markören hela ord istället. Det finns också kortkommandon för att (bland annat) flytta markören till början eller slutet av den nuvarande raden, meningen, funktionen eller buffern.

Man kan flytta markören med piltangenterna (även i kombination med control- och meta-tangenterna) eller genom att klicka med musen också, men med kortkommandona går det betydligt snabbare och man slipper flytta händerna.

Varje gång man gör något “särskilt” i Emacs (markerar text, klipper ut eller kopierar något, söker, och så vidare) så sparas markörens nuvarande position högst upp i den så kallade mark-stacken. För att hoppa till den position som är överst i mark-stacken använder man C-u C-<space>. Det tar också bort den positionen från mark-stacken. Ett bra sätt att snabbt komma tillbaka till “där man nyss var” är att trycka C-u C-<space> några gånger.

Om du använder inställningsfilen från IOOPM har du följande kortkommandon också:

  • C-x högerpil – flytta markören till fönstret till höger (fungerar också med vänster, upp och ned)
  • C-' X – låter dig snabbt hoppa till alla förekomster av tecknet X som finns på skärmen (du kan förstås byta ut X mot valfritt annat tecken)
  • M-g c X – modernare variant av ovanstående funktion
  • M-i – låter dig hoppa till t.ex. en funktion, etc. i koden
  • M-å – färglägger ordet som markören står på i hela filen
  • M-ä – hoppar till nästa förekomst av ordet som markören står på
  • M-ö – hoppar till föregående förekomst av ordet som markören står på
  • M-p – ersätt alla (efterföljande) förekomster av ordet som markören står på mot något annat
  • M-g m – pusha en markering på mark-stacken
  • M-g <space> – poppa en markering på mark-stacken och hoppa dit

1.3 Redigera text

Om man vill ta bort text i Emacs kan man ta bort enskilda tecken bakåt med <del> (backspace) och framåt med C-d (delete). När man tar bort mer text åt gången så klipper man egentligen ut den (så att man kan klistra in den igen). Man kan ta bort hela ord bakåt och framåt med M-<del> och M-d. Med C-k (kill line) tar man bort resten av raden från och med markören. C-0 k tar bort raden fram till markören

Trycker man C-<space> så börjar man markera text från markörens nuvarande position tills man gör något med markeringen (eller avbryter med C-g). Om man vill utvidga markeringen åt andra hållet kan man trycka C-x C-x (exchange point and mark) för att flytta markören till där man började markeringen (utan att förlora det man redan har markerat). Man kan också (bland annat) markera ett helt stycke, en hel funktion eller hela buffern.

När man har markerat text klipper man ut den med C-w (wipe) eller kopierar med M-w. Klistra in gör man sen med C-y (klistra in kallas yank i Emacs). För att komma åt gamla saker man har klippt ut kan man trycka M-y efter att man tryckt C-y. Då bläddrar man igenom allt man har klippt ut hittills.

Om du använder inställningsfilen från IOOPM har du följande kortkommandon också:

  • M-Ä – starta multiple cursors mode (lägg till en till cursor på raden under)
  • M-Å – starta multiple cursors mode (lägg till en till cursor på raden över)
  • C-c n – rensar och indenterar bufferten (använd den på din källkod hela tiden!)
  • M-g b – gå till första raden i filen
  • M-g e – gå till sista raden i filen
  • M-j – slå ihop aktuell rad med nedanstående rad
  • M-S-uppåtpil – flytta markerade rader (eller aktuell rad om ingen är markerad) uppåt i filen
  • M-S-nedåtpil – flytta markerade rader (eller aktuell rad om ingen är markerad) nedåt i filen

1.4 Söka och ersätta

Ett annat snabbt sätt att navigera i en fil är att söka efter textsträngar. Trycker man C-s (search) eller C-r (reverse search) kommer Emacs börja leta efter inmatad text framåt eller bakåt i filen. Trycker man C-s eller C-r igen så letar den efter nästa förekomst i filen. Om du står på ordet du vill söka efter kan du trycka C-s följt av C-w för att använda ordet som sökord. Du kan trycka C-w för att använda ytterligare ord som sökord.

Om man vill ersätta alla eller vissa förekomster av en textsträng kan man använda kommandot M-% (M-Shift-5 på vanliga svenska tangentbord). Man får då mata in texten man söker efter och vad man vill ersätta den med. För varje förekomst av söksträngen får man sen ange med y (yes) och n (no) om man vill att den ska bytas ut eller inte (trycker man ? får man se fler möjliga svarsalternativ). För att byta ut alla förekomster kan man använda kommandot M-x replace-string istället.

1.5 Terminal i Emacs

Man kan köra enskilda terminalkommandon från Emacs genom att trycka M-! (M-Shift-1) och ange ett kommando. Anger man till exempel ls får man se alla filer som finns i samma katalog som den aktiva filen. Det går också att öppna en terminal i ett Emacs-fönster med kommandot M-x shell. Den fungerar precis som ett vanligt terminalfönster, med skillnaden att man måste hålla in control för att bläddra mellan tidigare inmatningar med hjälp av piltangenterna.

Observera att för kommandon som M-Ö måste du använda Esc som meta i terminalen!

1.6 Ångra och avbryt

Om man vill ångra tidigare ändringar använder man antingen C-x u (undo) eller C-_. Om man råkar påbörja ett oönskat kommando kan man avbryta det med C-g. Slutligen kan man spara alla inlästa buffrar och avsluta Emacs med C-x C-c.

1.7 Och sen då?

När man har lärt sig vad som står i det här dokumentet kan man börja leta vidare efter mer utförliga källor. Ett ställe att börja kan till exempel vara lektionen man får om man trycker C-h t i Emacs. Referensbladet är baserat på ett större referensblad men medvetet förkortat och förenklat för att vara överskådligt. När man känner sig säker på det grundläggande så kan ett bra nästa steg vara att skaffa ett större referensblad, till exempel något av de många man hittar när man googlar “emacs cheat sheet”. Man kan förstås också installera Emacs på sin hemdator.

En favoritfunktionalitet som det här dokumentet inte har tagit upp är inspelning och uppspelning av macron. Trycker man C-x ( så börjar man spela in alla tangenttryckningar man gör, tills man avslutar med C-x ). Man kan sen spela upp sin senaste inspelning med C-x e, som står för execute macro. Det är användbart om man vill upprepa någonting flera gånger. Som ett enkelt exempel kommer här ett macro som skriver en printf-sats med radbrytning och flyttar markören till argumentsträngens början:

C-x ( printf("\n"); M-b C-b C-x )

Efter att ha spelat in ovanstående macro kan man alltså trycka C-x e för att få en printf-sats med markören på rätt ställe. Det går också att upprepa vilket kommando som helst ett visst antal gånger genom att trycka C-u 5 (för något värde på 5) och sen vilket kommando man vill upprepa. Vill man ta bort fyra på varandra följande rader kan man alltså trycka C-u 4 C-k. Prova också att skriva

C-x ( Emacs är bäst <ret> C-x ) C-u 100 C-x e

På frågan “Kan man göra det här i Emacs” är svaret nästan alltid “Ja”, framförallt om det handlar om effektiv textredigering. Det går också att använda Emacs till exempel som webbläsare, e-postklient, chattklient, PDF-läsare, filhanterare, kalkylator, kalender och att-göra-lista. Hur insnöad man vill bli är upp till var och en (jag tycker till exempel inte att det är något fel på Chrome eller Firefox som webbläsare).

Lycka till i ditt framtida liv som Emacs-fantast!

dr-castegren.jpg

Figure 1: Dr. Elias Castegren, känd som Emacs-Jesus under IOOPM 2017

2 Yas-snippets

Yasnippets finns installerade i IOOPM-inställningarna. Yasnippets har stöd för templates som expaneras direkt i editorn. Varje gång text “magiskt” dyker upp i editorn är det för att jag trycker tab för att expandera texten. Pröva t.ex. main tab, eller for tab, etc. Navigation mellan de olika “delarna” i en snippet sker också med tab.

Observera att yasnippets optimerar editeringshastighet, men att det knappast är det viktigaste när det gäller programmering, eller ens att vara produktiv när det kommer till programmering!

3 Programmera Java i Emacs med meghanada

Här är steg-för-steg-beskrivningar för hur du kan installera meghanada i Emacs1, som alltså ger IDE-liknande funktionalitet, men inte “för mycket” (i min subjektiva bedömning alltså).

Observera att om du kör med en inställningsfil från IOOPM så behöver du endast utföra steg 1 och steg 7.

3.1 Steg 1: Starta Emacs

Starta Emacs. (Om Emacs redan är igång2 kan du hoppa över detta steg!)

3.2 Steg 2: Lägg till melpa

Klistra in följande rad i en tom3 buffer:

(setq package-archives '(("melpa" . "http://melpa.milkbox.net/packages/")))

3.3 Steg 3: eval-region (kör kod!)

Markera hela ovanstående rad och kör M-x eval-region4. Om du får ett felmeddelande om parsing beror det på att du antingen inte har markerat hela raden eller att en parentes i början eller slutet saknas – kanske för att du “skrev av” raden fel.

3.4 Steg 4: Starta Emacs pakethanterare

Kör M-x package-list-packages. Nu öppnas en sida som visar hundratals paket som kan installeras i Emacs. Du kan markera ett paket för installation genom att ställa markören på paketet och trycka i5.

  Package            Version       Status [v] Description
  ace-window         0.9.0         available  Quickly switch windows.
  ack                1.5           available  interface to ack-like tools
  ada-mode           5.3.1         available  major-mode for editing Ada sources
  ada-ref-man        2012.3        available  Ada Reference Manual 2012
  adaptive-wrap      0.5.1         available  Smart line-wrapping with wrap-prefix
  adjust-parens      3.0           available  Indent and dedent Lisp code, automatically adjust cl$
  aggressive-indent  1.8.3         available  Minor mode to aggressively keep your code always ind$
  ahungry-theme      1.8.0         available  Ahungry color theme for Emacs.  Make sure to (load-t$
  all                1.0           available  Edit all lines matching a given regexp
  ampc               0.2           available  Asynchronous Music Player Controller
  arbitools          0.71          available  Package for chess tournaments administration
  ascii-art-to-un... 1.11          available  a small artist adjunct
  async              1.9.2         available  Asynchronous processing in Emacs
I auctex             11.91.0       available  Integrated environment for *TeX*
  aumix-mode         7             available  run the aumix program in a buffer
  auto-correct       1.1.3         available  Remembers and automatically fixes past corrections
  auto-overlays      0.10.9        available  Automatic regexp-delimited overlays

Exemplet ovan visar en del av en paketlistning där paketet auctex är markerat för installation, vilket visas av I i första kolumnen. Blir du nyfiken på ett paket och vill veta mer kan du trycka ? eller ENTER för att få mer information.

3.5 Steg 5: Markera paket för installation

Markera följande paket för installation6:

  • meghanada7
  • flycheck8
  • company9
  • use-package10
  • diminish11

Observera att vissa av dessa namn förekommer i beskrivningen av andra paket! Du måste alltså titta efter vad du gör! Om det finns flera versioner av samma paket, välj det som kommer från melpa.

3.6 Steg 6: Installera Emacspaket

Installera paketen genom att trycka x och sedan svara yes på frågan om du vill installera 5 paket. Det ser ut så här ungefär:

Install these 5 packages (company, use-package, meghanada, flycheck, diminish)? (yes or no)

Nu försöker Emacs kontakta melpa och ladda ned paketen. Du kan följa statusen längst ned i minibuffern.

Problem? Ibland är melpa överbelastat och svarar inte. I så fall kan du avbryta med C-g och pröva att trycka x igen. Om du inte ser att en massa filer laddas ned och installeras efter några sekunder brukar det betyda att melpa inte svarar och att du måste avbryta.

3.7 Steg 7: Installera servern

Kör M-x meghanada-install-server.

Nu laddas ett Java-program ned som är det som kör själva Java-logiken under huven och analyserar din källkod etc.

3.8 Steg 8: Lägg till meghanada-mode i init.el

Öppna ~/.emacs.d/init.el och leta upp raden (package-initialize)

Lägg sedan till följande:

(use-package meghanada
  :diminish meghanada-mode "Mm"
  :config
  (add-hook 'java-mode-hook
            (lambda ()
              (meghanada-mode t)
              (flycheck-mode t)
              (company-mode t)
              (add-hook 'before-save-hook 'delete-trailing-whitespace))))

Hittar du inte (package-initialize), skriv då det längst ned i filen och sedan use-package, etc.

3.9 Steg 9: Starta om Emacs.

Starta om Emacs. Klart!

(Ett alternativ till att starta om Emacs är att markera alla rader ovan förutom (package-initialize) och köra M-x eval-region.)

Meghanada kräver konfiguration för varje projekt!

Meghanada-mode vill helst att du kör maven eller gradle som är två Make-liknande verktyg som vi inte använder på kursen. Om du inte vill lära dig maven eller gradle just nu (mycket rimligt!) kan du istället lägga en konfigurationsfil i de kataloger där din Java-källkod finns.

Denna fil skall heta .meghanada.conf12 och kan lämpligen innehålla följande:

sources = ["."]
output = "classes"
test-output = "debug"

Detta betyder: Leta efter källkod i den aktuella katalogen. Vi kompilering, lägg allt kompilerat i underkatalogen “classes” och alla test-filer i underkatalogen “debug”.

3.10 Steg 10: Programmera Java!

Ös!

4 Emacs på macOS

Om du installerar Emacs på macOS så är Alt din Meta-tangent. Det är inget fel med det, men avsaknaden av AltGr (en Mac har två Alt istället) gör att vissa tecken som är vanligt förekommande i programmering inte går att skriva:

  • [ tolkas som kortkommandot M-8 och ] som kortkommandot M-9.
  • { tolkas som kortkommandot M-7 och } som kortkommandot M-0.
  • $ tolkas som kortkommandot M-4.

Lösningen på detta är att lägga till följande i filen init.el som finns i katalogen .emacs.d i din hemkatalog. Kopiera och klistra in (och starta sedan om Emacs)!

;; Teach Emacs Swedish keyboard layout
(define-key key-translation-map (kbd "M-8") (kbd "["))
(define-key key-translation-map (kbd "M-9") (kbd "]"))

(define-key key-translation-map (kbd "M-(") (kbd "{"))
(define-key key-translation-map (kbd "M-)") (kbd "}"))

(define-key key-translation-map (kbd "M-7") (kbd "|"))
(define-key key-translation-map (kbd "M-/") (kbd "\\"))

(define-key key-translation-map (kbd "M-2") (kbd "@"))
(define-key key-translation-map (kbd "M-4") (kbd "$"))

Tips: klistra in i Emacs är C-y. För att slippa starta om Emacs för att inställningarna skall gälla kan du markera den inklippta texten och köra M-x eval-region.


Questions about stuff on these pages? Use our Piazza forum.

Want to report a bug? Please place an issue here. Pull requests are graciously accepted (hint, hint).

Nerd fact: These pages are generated using org-mode in Emacs, a modified ReadTheOrg template, and a bunch of scripts.

Ended up here randomly? These are the pages for a one-semester course at 67% speed on imperative and object-oriented programming at the department of Information Technology at Uppsala University, ran by Tobias Wrigstad.

Footnotes:

1
Notera att meghanada är två komponenter – en server som är oberoende av editor, och en klient som är olika för olika texteditorer. Här Emacs.
2
Visste du förresten att du kan köra M-x emacs-uptime för att se hur länge ditt Emacs varit igång?
3
Du kan egentligen använda vilken buffer som helst.
4
Släpp musen! C-a för att gå till starten av raden, C-n eller C-p för pil ned/upp, C-<space> för att börja markera, C-e för gå till slutet av raden.
5
Om du råkar markera fel kan du avmarkera med u.
6
Minns att du är i Emacs – du kan söka med t.ex. C-s (I-search).
7
Ger Emacs möjligheten att förstå Java.
8
Visar kompileringsfel och varningar direkt i Emacs-buffern.
9
Stöd för ’autocomplete’, dvs. att Emacs föreslår vilka fält eller metoder du vill använda när du avrefererar en variabel.
10
Ett paket som gör konfiguration av Emacs-paket enklade och smidigare. Vi kommer att använda detta i Steg 8.
11
Ett paket som låter oss förkorta namnet på ett mode, i detta fall meghanada. Används i Steg 8.
12
Observera att namnet startar med en punkt!

Author: Tobias Wrigstad

Created: 2018-09-18 tis 09:50

Validate