If you use Cloud 9 exclusively on the course, all the programming will happen in an editor in your browser, and there is no need for you to install anything locally. When interacting with teachers – to get help and to demonstrate achievements – you will need to use Cloud 9. However, if you want to install things locally on your machine and use your own favourite editor, feel free to.
We have not yet had the time to produce any local documentation for Cloud 9. Instead we refer you to the official documentation. You do not need to concern yourself with installation, setting up the enviroment and so forth.
Beware of old tutorial videos that miss lots of the more recent features or simply looks different.
For those who want to install a local environment, we recommend learning the Emacs editor. There are plenty testament from past students in the course that this has been extremely well-invested time. (Not counting the student who stated that Emacs was the best thing that had happened to him since meeting his wife.)
Emacs är en utökningsbar editor som är skriven i C och programspråket Emacs-lisp. Man utökar och raffinerar sin egen Emacs genom ytterligare paket skrivna i Emacs-lisp. Man kan skriva dessa paket själv, eller ladda ned dem och installera dem själv eller via Emacs inbyggda pakethanterare.
Emacs-resurser på kurswebben:
Nu följer två olika uppsättningar instruktioner beroende på om du kör Linux eller OS X/macOS. För dig som kör Windows har vi tyvärr ingen handledning, men vi råder dig att installera Linux under kursens gång då det är en bättre programmeringsmiljö för den C-programmering som vi skall göra.
Kör emacs --version
i terminalen. Om du har en yngre Emacs än
version 24 skall måste du uppgradera den för att nedanstående
skall fungera.
$ cd ~ $ mv .emacs .emacs.old # Not 1 nedan $ mkdir .emacs.d $ cd .emacs.d $ curl http://wrigstad.com/ioopm18/misc/emacs.zip -o e.zip # Not 2 nedan $ unzip e.zip $ rm -f e.zip
Not 1: Om filen .emacs
inte finns får du fel i steg 2, men det
gör ingenting eftersom steg 2 handlar om att “bli av med den
filen”.
Not 2: Om du skriver fel i den långa URL:en ovan kommer du
fortfarande att få en fil e.zip
men som inte går att packa upp.
Om unzip
-steget inte fungerar – kontrollera din stavning i
curl
-steget!
Kör emacs --version
i terminalen. Om du har en Emacs som är
yngre än version 24 skall måste du uppgradera den för att
nedanstående skall fungera. Vid behov kan du ladda hem och
installera en okonfigurerad version från
https://emacsformacosx.com som är tillräckligt ny. Om du vill att
din nya version ska öppnas när du skriver emacs
i terminalen kan
du skapa ett alias. Skriv följande i en terminal:
$ cd ~ # Gå till hemkatalogen $ emacs .bash_profile # Öppna din profil
I den öppnade filen, lägg till följande rad:
alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs
Spara och avsluta (C-x C-s
C-x C-c
) och kör ytterligare ett
kommando i terminalen:
$ source ~/.bash_profile
Nu kommer du att öppna Emacs i ett eget fönster när du skriver
emacs
. Om du vill köra Emacs i terminalen kan du använda
kommandot emacs -nw
.
För att skaffa kursens Emacs-konfiguration, kör nedanstående i en terminal.
$ cd ~ $ mkdir .emacs.d $ cd .emacs.d $ curl http://wrigstad.com/ioopm18/misc/emacs.zip -o e.zip $ unzip e.zip $ rm -f e.zip
Notera att om du skriver fel i den långa URL:en ovan kommer du
fortfarande att få en fil e.zip
men som förstås inte går att
packa upp. Om unzip
-steget inte fungerar – kontrollera din
stavning i curl
-steget!
Tips: klistra in i Emacs är key: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 key:M-x eval-region
.
Att arbeta med fler än en fil i Emacs är lämpligt att göra genom att öppna flera windows i samma Emacs-fönster (eller frame med Emacs-termer). Nedan använder jag ordet frame för det som du normalt kallar för fönster, och ordet window för en del av en frame som visar en buffer med text.
file:../misc/emacs-frames-windows-buffers.png
För att återskapa ovanstående split i tre windows. Gör så här efter att du startat Emacs:
- key:C-x key:− för att dela (det aktuella) window:et horizontellt
- key:C-x key:∣ för att dela (det aktuella) window:et vertikalt
Navigera mellan de olika Emacs-window:arna så här: key:C-x key:←, key:C-x key:→, key:C-x key:↑ och key:C-x key:↓.
Positionera dig längst ned (med kommandona ovan) och öppa utils.c
med key:C-x key:C-f utils.c
key:↵.
Positionera dig i övre vänstre window:et ned (med kommandona ovan) och öppa tmp.c
med key:C-x key:C-f tmp.c
key:↵.
Positionera dig i övre högra window:et och växla så att den visar samma buffert
som någon av de andra window:arna med key:C-x key:b. Skriv sedan namnet på buffern (du kan använda tab för autocomplete)
och tryck key:↵.
Om du gillar att ha många filer öppna i Emacs samtidigt kan du pröva att trycka till exempel key:C-x key:C-b för att lista alla öppna buffrar. Nu kan du navigera till den buffer du vill öppna med piltangenterna och trycka enter.
Om du vill stänga window:et som du står i: key:C-x key:0. Om du vill stänga alla andra windows utom det du står i: key:C-x key:1.
Två anledningar till att det inte är bra att köra emacs fil.c
&
flera gånger i terminalen är att det startar flera instanser av
Emacs och:
- det åtgår en massa mer minne –
$N$ gånger för$N$ instanser - de olika instanserna är inte medvetna om varandra – och en fil som är öppen i flera instanser kan hamna i osynk
Ovanstående gäller inte bara Emacs utan generellt. På macOS med
ett grafiskt Emacs kommer emacs fil.c &
att öppna ett redan
körande Emacs om ett sådant finns.
Om du föredrar att ha flera separata fönster öppet på skärmen kan
du använda kommandot key:M-x make-frame
key:↵ för att öppna
ett nytt fönster och sedan key:C-x key:C-f som vanligt för att öppna
en fil i det fönstret.
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 key:C
för Control och key:M för Meta. För att till exempel spara en fil
trycker man key:C-x key:C-s, alltså först “Control x” (håll in
Control och tryck “x”), och sen “Control s” (håll in key:Ctrl och
tryck “s”). Det är ofta så att “Control bokstav” och “Meta
bokstav” gör liknande saker. key:C-f flyttar till exempel fram
markören ett tecken, medan key:M-f flyttar fram den ett helt ord.
På datorer som inte har en Meta-tangent brukar man kunna använda
key:ESC (i terminalen eller grafiskt) eller key:Alt (grafiskt)
istället. På Mac-datorer funkar key:Cmd eller key: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:
<a href=”key:“>key:<space>, <a href=”key:“>key:<del> och <a href=”key:“>key:<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.
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 key:C-x key:C-f (f som i find file). Om filen inte finns kommer den att skapas. Sparar gör man med key:C-x key:C-s (save file), eller key:C-x key: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 key:C-x key:b och ange namnet på buffern man vill byta till. key:C-x key:C-b visar en lista på alla inlästa buffrar, och key:C-x key:k (kill buffer) stänger den aktiva buffern.
Om man vill kunna se flera buffrar samtidigt kan man dela Emacs-fönstret horisontellt (key:C-x key:2) eller vertikalt (key:C-x key:3). Man byter mellan öppna fönster med key:C-x key:o (other window) eller genom att klicka i ett fönster. key:C-x key:0 stänger det aktiva fönstret, och key:C-x key:1 stänger alla fönster förutom det aktiva.
Du kan scrolla nedåt i ett fönster med key:C-v (view next screen) och upp med key:M-v. key:C-l (center line) centrerar fönstret vid markören. Trycker man key: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 key:PgUp och key: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 key:C-f (forward), key:C-b (backward), key:C-n (next line) och key:C-p (previous line). Håller man in meta-tangenten istället för control (alltså key:M-f och key: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 key:C-u <a href=”key:C-“>key: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 key:C-u <a href=”key:C-“>key:C-<space> några gånger.
Om man vill ta bort text i Emacs kan man ta bort enskilda tecken
bakåt med <a href=”key:“>key:<del> (backspace) och framåt med key: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 <a href=”key:M-“>key:M-<del> och key:M-d.
Med key:C-k (kill line) tar man bort resten av raden från och
med markören. key:C-0 key:k tar bort raden fram till
markören
Trycker man <a href=”key:C-“>key: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 key:C-g). Om man vill utvidga markeringen åt andra hållet kan man trycka key:C-x key: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 key:C-w (wipe) eller kopierar med key:M-w. Klistra in gör man sen med key:C-y (klistra in kallas yank i Emacs). För att komma åt gamla saker man har klippt ut kan man trycka key:M-y efter att man tryckt key:C-y. Då bläddrar man igenom allt man har klippt ut hittills.
Ett annat snabbt sätt att navigera i en fil är att söka efter textsträngar. Trycker man key:C-s (search) eller key:C-r (reverse search) kommer Emacs börja leta efter inmatad text framåt eller bakåt i filen. Trycker man key:C-s eller key: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 key:C-s följt av key:C-w för att använda ordet som sökord. Du kan trycka key: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 key:M-% (key: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 key:y (yes) och key:n (no) om man vill att den
ska bytas ut eller inte (trycker man key:? får man se fler möjliga
svarsalternativ). För att byta ut alla förekomster kan man använda
kommandot key:M-x replace-string
istället.
Man kan köra enskilda terminalkommandon från Emacs genom att
trycka key:M-! (key: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 key:M-Ö måste du använda key:Esc som meta i terminalen!
Om man vill ångra tidigare ändringar använder man antingen key:C-x key:u (undo) eller key:C-_. Om man råkar påbörja ett oönskat kommando kan man avbryta det med key:C-g. Slutligen kan man spara alla inlästa buffrar och avsluta Emacs med key:C-x key:C-c.
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 key: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 key:C-x ( så
börjar man spela in alla tangenttryckningar man gör, tills man
avslutar med key:C-x ). Man kan sen spela upp sin senaste inspelning
med key: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:
key:C-x key:( printf("\n");
key:M-b key:C-b key:C-x key:)
Efter att ha spelat in ovanstående macro kan man alltså trycka
key: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 key: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 key:C-u key:4 key:C-k. Prova
också att skriva
key:C-x key:( Emacs är bäst
<a href=”key:“>key:<ret> key:C-x key:) key:C-u 100
key:C-x key: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!
file:http://wrigstad.com/images/dr-castegren.jpg
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
key:tab för att expandera texten. Pröva t.ex. main
key:tab,
eller for
key: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!
Här är steg-för-steg-beskrivningar för hur du kan installera meghanada i Emacs[fn::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.], som alltså ger IDE-liknande funktionalitet, men inte “för mycket” (i min subjektiva bedömning alltså).
Starta Emacs. (Om Emacs redan är igång[fn::Visste du förresten att
du kan köra key:M-x emacs-uptime
för att se hur länge ditt Emacs
varit igång?] kan du hoppa över detta steg!)
Klistra in följande rad i en tom[fn::Du kan egentligen använda vilken buffer som helst.] buffer:
(setq package-archives '(("melpa" . "http://melpa.milkbox.net/packages/")))
Markera hela ovanstående rad och kör key:M-x =eval-region=[fn::Släpp musen! key:C-a för att gå till starten av raden, key:C-n eller key:C-p för pil ned/upp, <a href=”key:C-“>key:C-<space> för att börja markera, key:C-e för gå till slutet av raden.]. 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.
Kör key: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 key:i[fn::Om du råkar markera fel kan du avmarkera med
key:u.].
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 key:? eller key:ENTER för att få mer information.
Markera följande paket för installation[fn::Minns att du är i Emacs – du kan söka med t.ex. key:C-s (I-search).]:
- =meghanada=[fn::Ger Emacs möjligheten att förstå Java.]
- =flycheck=[fn::Visar kompileringsfel och varningar direkt i Emacs-buffern.]
- =company=[fn::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.]
- =use-package=[fn::Ett paket som gör konfiguration av Emacs-paket enklade och smidigare. Vi kommer att använda detta i Steg 8.]
- =diminish=[fn::Ett paket som låter oss förkorta namnet på ett mode, i detta fall meghanada. Används i Steg 8.]
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.
Installera paketen genom att trycka key: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 key:C-g och pröva att trycka key: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.
Kör key: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.
Ö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.
Starta om Emacs. Klart!
(Ett alternativ till att starta om Emacs är att markera alla rader
ovan förutom (package-initialize)
och köra key:M-x eval-region
.)
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.conf=[fn::Observera att namnet startar med en punkt!] 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”.
Ös!
Om du installerar Emacs på macOS så är key:Alt din Meta-tangent. Det är inget fel med det, men avsaknaden av key:AltGr (en Mac har två key:Alt istället) gör att vissa tecken som är vanligt förekommande i programmering inte går att skriva:
[
tolkas som kortkommandot key:M-8 och]
som kortkommandot key:M-9.{
tolkas som kortkommandot key:M-7 och}
som kortkommandot key:M-0.$
tolkas som kortkommandot key: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 key: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 key:M-x eval-region
.