Compare commits

..

No commits in common. "main" and "attic" have entirely different histories.
main ... attic

10 changed files with 641 additions and 263 deletions

View File

@ -1,4 +1,25 @@
#+TITLE: Velkommen til Emacskurs! * Emacskurs vår 2015
- [[./slides.org][Slides]] Her ligger kildekoden til alt kursmaterialet for kurset. Kurset arrangeres
- [[./init.org][Konfigurasjon]] av [[http://fui.ifi.uio.no/][Fagutvalget ved Institutt for informatikk]], og holdes på Institutt for
Informatikk i Simula, Tirsdag 17. Mars kl. 16:15.
Her er en oversikt over hva de forskjellige filene er:
- [[./emacs-init.el][emacs-init.el]] - en enkel konfigurasjonsfil.
- [[./slides.org][slides.org]] - org-filen som foilene genereres fra.
- [[./handout.org][handout.org]] - org-filen handouts genereres fra.
- [[./index.org][index.org]] - org-filen som kursets nettside genereres fra.
Du finner alt materiale på [[http://folk.uio.no/larstvei/emacskurs/][kursets nettside]] (som er generert fra
~index.org~). Merk at GitHub har støtte for å vise ~.org~-filer, så du kan
lese alt materiale her på GitHub.
* Lisens
#+BEGIN_HTML
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons-lisens" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />
#+END_HTML
Dette verk er lisensieret under en [[http://creativecommons.org/licenses/by-sa/4.0/][Creative Commons
Navngivelse-DelPåSammeVilkår 4.0 Internasjonal lisens]].

View File

@ -1,5 +1,3 @@
#+OPTIONS: html-style:nil
|---------------------+------------------------------| |---------------------+------------------------------|
| Tastekombinasjon | Beskrivelse | | Tastekombinasjon | Beskrivelse |
|---------------------+------------------------------| |---------------------+------------------------------|
@ -46,7 +44,6 @@
|---------------------+------------------------------| |---------------------+------------------------------|
| =C-d= | =delete-char= | | =C-d= | =delete-char= |
| =M-d= | =kill-word= | | =M-d= | =kill-word= |
| =M-DEL= | =backward-kill-word= |
| =C-_= | =undo= | | =C-_= | =undo= |
| =C-t= | =transpose-chars= | | =C-t= | =transpose-chars= |
| =M-t= | =transpose-words= | | =M-t= | =transpose-words= |

350
idemyldring.org Normal file
View File

@ -0,0 +1,350 @@
#+PROPERTY: header-args:emacs-lisp :noweb yes
Jeg har brukt Org for å kunne beskrive tanker og idéer +uten+ kludrete
+kommentarer+.
* Tanker og noter
+ For å la det føles naturlig å gå inn og legge til eller endre, er nok
naturlige inndelinger viktig.
+ Skal vi utforme =early-init.el= òg?
+ Skal vi anbefale dem å kompilere =init.el=?
* Skal vi i så fall nevne =sharpquote= (=#'=)?
+ Bør vi anbefale =consult=?
* ~consult-theme~ gjør det enkelt å raskt bytte mellom tema. Det kan gi et
godt førsteinntrykk ...
* ~consult-buffer~, ~consult-line~, ~consult-imenu~ ...
+ ~vertico~ og ~marginalia~(?) må finne sin plass.
+ Samspillet mellom deamon, auto-revert og lockfiles
* lockfiles blir nok et forvirringsmoment (de var det for meg)
+ Bør vi se etter en subtil måte å sette indenteringspreferanser på?
* Tab som default
* Mellomrom i LISP
* Filen selv
Jeg har forsøkt å bruke inndelinger og kalle ~package-install~ eller
~use-pacakge~ ved hver inndeling i stedet for å hope dem opp på ett sted, så får
de mer innsikt i hvordan ting henger sammen, og det blir lettere å finne ting.
#+begin_src emacs-lisp :tangle init-forslag.el
;;; init-forslag.el -- Forslag til init.el -*- lexical-binding: t -*-
;; Noen info om filens opphav.
;; - Hvem som skrev + epost?
;; - Lenke til repoet så de kan finne det igjen.
;;; Commentary:
;; Sammenfatting av hva vi har tatt med, og kort om hva vi har
;; vektlagt. Vi kan nevne her at vi legger vekt på IN2040.
;;; Code:
;;; Grunnleggende oppsett
<<grunnleggende>>
;;; Filer og buffere
<<filer-og-buffere>>
;;; Hjelp og dokumentasjon
<<docs>>
;;; Annen programmering
<<prog-mode>>
;;; LISP
<<lisp>>
;;; init-forslag.el ends here
#+end_src
* Grunnleggende
:PROPERTIES:
:header-args:emacs-lisp: :noweb-ref grunnleggende
:END:
Her har jeg lagt inn ting som gjelder Emacs fremfor programmering. Overskriften
bør kasnkje byttes, for det er ikke usannsynlig at det er her =consult= kan høre
hjemme.
#+begin_src emacs-lisp
;; Emacs ber deg iblant svare "yes" eller "no". Dette gjør at Emacs
;; nøyer seg med "y" eller "n".
(setq use-short-answers t)
;; Dette fjerner velkomstskjermen ved oppstart av Emacs.
(setq inhibit-splash-screen t)
#+end_src
Vi bør kanskje gi en kort forklaring av hva custom gjør: Holder på enkelte
verdier mellom sessions. Vi
#+begin_src emacs-lisp
(setq custom-file (expand-file-name "custom.el" user-emacs-directory))
(load custom-file t t)
#+end_src
** Oppsett for pakker
#+begin_src emacs-lisp
;;;; Installering av tredjepartspakker
#+end_src
Jeg har aldri brukt =package.el= eller ~use-package~ (har alltid håndtert ting
manuelt og byttet nylig til =straight.el=)
~package-initialize~ er autoloaded, så vi trenger ikke ~(require 'package)~.
Det kan ha pedagogisk hensikt å inkludere, da, for autoload er et konsept som
ikke alltid føles naturlig ...
#+begin_src emacs-lisp
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(unless package-archive-contents
(package-refresh-contents))
(package-initialize)
#+end_src
*** ~use-package~
Konfig-generatoren har denne tingen med, og en liten forklaring som dette er
betraktelig vennligere for en nybegynner enn [[help:use-package][dokumentasjonen]] ...
#+begin_src emacs-lisp
;; (use-package my-package-name
;; :ensure t ; Ensure my-package is installed
;; :after foo ; Load my-package after foo is loaded (seldom used)
;; :init ; Run this code before my-package is loaded
;; :bind ; Bind these keys to these functions
;; :custom ; Set these variables
;; :config ; Run this code after my-package is loaded
#+end_src
** Oppsett for egen elisp
Hvis de skriver egen LISP, bør vi kanskje ha med dette så kompilering ikke
forvirrer resultatet ...
#+begin_src emacs-lisp
(setq load-prefer-newer t)
#+end_src
** Tema
#+begin_src emacs-lisp
;;;; Tema og farger
#+end_src
Det er nok en god idé å installere begge tema så det er raskere å bytte mellom.
#+begin_src emacs-lisp
;; Vi har foreslått et mørkt og et lyst tema:
(package-install 'monokai-theme)
(package-install 'leuven-theme)
;; Avkommenter for å bruke foreslått mørkt tema:
;; (load-theme 'monokai t)
;; Avkommenter for å bruke foreslått lyst tema:
;; (load-theme 'leuven t)
#+end_src
** GUI-elementer
#+begin_src emacs-lisp
;;;; GUI-elementer
#+end_src
Jeg er enig i at scroll-, tool- og menu-bar bør skrus av. Jeg er veldig enig i
at ~blink-cursor-mode~ bør være av for menneskets velbehag, men har merket av
folk har sterkere meninger der. Jeg tenker at vi foreslår det ...
#+begin_src emacs-lisp
;; Skru av blinkende peker.
(blink-cursor-mode 0)
;; Disse skrur av diverse GUI-elementer.
(menu-bar-mode 0)
(tool-bar-mode 0)
(scroll-bar-mode 0)
#+end_src
* Filer og buffere
:PROPERTIES:
:header-args:emacs-lisp: :noweb-ref filer-og-buffere
:END:
Her må vi vurdere hvor mye vi vil ha med. Jeg har lagt til ~recentf-mode~, men
vi kan vurdere ~consult-buffer~, ~ibuffer~ og =project.el=.
#+begin_src emacs-lisp
;; For at Emacs skal huske hvor peker var da du sist lukket en fil.
(save-place-mode)
#+end_src
Uten ~consult-buffer~, må kommandoen ~recentf~ brukes, og den er ikke bundet til noe.
#+begin_src emacs-lisp
(recentf-mode)
(setq recentf-max-saved-items 199
recentf-auto-cleanup 300)
#+end_src
~ffap~ (/find-file-at-point/) gjør at ~find-file~ med peker på et filnavn bruker
det filnavnet som default.
#+begin_src emacs-lisp
;; Med dette vil Emacs hvis peker er på et filnavn når du bruker
;; `find-file-at-point', foreslå å åpne den filen.
(ffap-bindings)
#+end_src
** Navn på filer og buffere
Er det en god idé å gi dem en tast til å gi en fil de besøker nytt navn? Jeg
husker at jeg lette en del etter noe slikt da jeg begynte.
#+begin_src emacs-lisp
(keymap-set ctl-x-x-map "R" #'rename-visited-file)
#+end_src
Uniquify gjør det lettere å se forskjell på buffere med samme navn. Jeg har
tatt med instillingene fra min egen config. De gir formatet
=buffernavn |kontekst=.
#+begin_src emacs-lisp
(setq uniquify-buffer-name-style 'post-forward
uniquify-strip-common-suffix t
uniquify-separator " |"
uniquify-after-kill-buffer-p t
uniquify-ignore-buffers-re "^\\*")
#+end_src
** Auto-revert og lock-files
Hvordan vi håndterer auto-revert avhenger vel litt av hvordan vi presenterer
"lockfiles". "Lockfiles" er noe som forvirrer
#+begin_src emacs-lisp
(global-auto-revert-mode)
(setq global-auto-revert-non-file-buffers t
create-lockfiles nil)
#+end_src
** Backups
Jeg tenker at vi ikke snakker for mye om backups, men kanskje legger inn denne
linjen, for backups legges per default inn i samme mappen som filen, og det kan
være like plagsomt som det føles rotete ...
#+begin_src emacs-lisp
backup-directory-alist `(("." . ,(locate-user-emacs-file "backups")))
#+end_src
* Hjelp og dokumentasjon
:PROPERTIES:
:header-args:emacs-lisp: :noweb-ref docs
:END:
Jeg tenker det er viktig at vi får frem Emacs' /selvdokumenterende natur/.
** which-key og tastetrykk
~which-key~ er innebygd fra og med [[file:~/src/share/emacs/31.0.50/etc/NEWS.30::New package 'which-key'.][Emacs 30]]. Hvis vi skal ha det med, foreslår
jeg denne kombinajonen av innstillinger for ~which-key~ og ~echo-keystrokes~ for
å gi et responsivt, men ikke bråkete inntrykk, og med ~which-key~ alltid lett
tilgjengelig for oversikt.
#+begin_src emacs-lisp
(setq which-key-show-early-on-C-h t
which-key-idle-delay 600)
(setq echo-keystrokes 0.1)
(setq echo-keystrokes-help nil)
#+end_src
** Helpful
Jeg tror det kan være en god idé å bruke ~helpful~, for informasjonen det gir,
tydeliggjør at Emacs er satt sammen av funksjoner og variable vi kan fly rundt
og skrive om. Når jeg selv hacker på Emacs, er nesten all kildekodeinteraksjon
gjennom helpful ...
Helpful har dessuten en liste av keymaps hver kommando er bundet til. Generelt
gjør helpful Emacs veldig transparent. :D
Jeg tenker at det er en god idé å binde disse til taster:
+ ~helpful-callable~
+ ~help-variable~
+ ~helpful-symbol~
+ ~helpful-key~
+ ~helpful-at-point~
~helpful-at-point~ har jeg selv stor glede av ...
* Generelt for prog-mode
:PROPERTIES:
:header-args:emacs-lisp: :noweb-ref prog-mode
:END:
Bør få med:
+ ~corfu~
* ~kind-icon~ (virker det på non-u*ix?)
+ ~eglot~
Det er sikkert noen som vil ha linjenummer i margen. Folk som kommer fra =vim=,
har jeg inntrykk av at pleier å ville ha relative tall på talllinjen.
#+begin_src emacs-lisp
(setq display-line-numbers-type t)
;; (setq display-line-numbers-type 'relative)
(add-hook 'prog-mode-hook #'display-line-numbers-mode)
#+end_src
* LISP
:PROPERTIES:
:header-args:emacs-lisp: :noweb-ref lisp
:END:
Vi bør nok separere Scheme og elisp, men dette gjelder for begge. Paredit kan
være noe stort for en introduksjon, men ~electric-pair-mode~ lar oss det minste
sette inn balanserte par.
#+begin_src emacs-lisp
;; Automatically insert closing parens
(electric-pair-mode)
;; Visualize matching parens
(show-paren-mode 1)
;; (setq show-paren-delay 0
;; show-paren-style 'parenthesis)
#+end_src

Binary file not shown.

After

Width:  |  Height:  |  Size: 183 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.8 KiB

BIN
img/lisp_cycles.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
img/workflow_2x.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

256
index.org Normal file
View File

@ -0,0 +1,256 @@
#+TITLE: Emacskurs
# #+OPTIONS: toc:nil num:nil
#+OPTIONS: toc:2 num:nil H:4 tex:imagemagick
#+HTML_HEAD: <meta name="viewport" content="width=device-width, initial-scale=1"/>
#+HTML_HEAD: <link type="text/css" rel="stylesheet" href="css/bootstrap.min.css" />
#+HTML_HEAD: <link rel="stylesheet" type="text/css" href="css/style.css" />
#+HTML_HEAD: <link href="images/emacs-icon.png" type="image/png" rel="icon"/>
#+HTML_HEAD: <script type="text/javascript" src="js/jquery-2.1.3.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="js/jquery-ui.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="js/jquery.tocify.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="js/bootstrap.min.js"></script>
#+HTML_HEAD: <script type="text/javascript" src="js/org-bootstrap.js"></script>
* Introduksjon
Dette kurset arrangeres av [[http://fui.ifi.uio.no/][Fagutvalget ved Institutt for informatikk]], og
holdes på Institutt for Informatikk i Simula, Tirsdag 17. Mars kl. 16:15.
Denne siden er et supplement til kurset, der deler av stoffet dekkes, samt
linker til annet kursmaterialet og andre nyttige lenker.
** Kursmateriale
Kildekoden for alt materiale ligger på [[https://github.com/larstvei/emacskurs][GitHub]]. Her finner du:
- [[./foiler.html][Foiler]]
- [[./emacs-init.el][Konfigurasjonsfil]]
- [[./handout.html][Handout]]
Nettsiden er generert med et egenkomponert [[https://github.com/larstvei/org-bootstrap-document][Org-scheme]], og foilene er
generert med [[https://github.com/coldnew/org-ioslide][org-ioslide]].
** Nyttige lenker
- [[http://www.gnu.org/software/emacs/manual/html_node/emacs/index.html#Top][Emacs manualen]]
- [[http://termvakt.ifi.uio.no/Emacs][Termvaktens guide til Emacs]]
- [[http://www.masteringemacs.org/reading-guide/][En flott blogg om Emacs]]
- [[http://www.ic.unicamp.br/%7Ehelio/disciplinas/MC102/Emacs_Reference_Card.pdf][En cheat-sheet for Emacs]]
- [[http://www.reddit.com/r/emacs/][/r/emacs]]
- [[https://github.com/larstvei/dot-emacs][Min konfigurasjonsfil]]
* Komme igang med Emacs
Her står det litt om hvordan du installerer og konfigurerer Emacs.
** Emacs på Ifi
På Ifi er Emacs allerede installert. Du kan se hvilken versjon du har
tilgjengelig ved å skrive følgende i terminalen:
#+BEGIN_SRC sh
[larstvei@vetur ~]$ emacs --version
GNU Emacs 23.1.1
Copyright (C) 2009 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY. You may redistribute copies of
Emacs under the terms of the GNU General Public License. For more
information about these matters, see the file named COPYING.
#+END_SRC
I filområdet =/snacks/bin/= ligger det ekstra programvare, og der er en
nyere versjon av Emacs tilgjengelig. Se Termvaktsidene for mer informasjon
om [[http://termvakt.uio.no/Snacks][Snacks]].
#+BEGIN_SRC sh
[larstvei@vetur ~]$ /snacks/bin/emacs-newest --version
GNU Emacs 24.4.1
Copyright (C) 2014 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
#+END_SRC
For å slippe å skrive =/snacks/bin/emacs-newest= hver gang kan vi lage et
alias. Denne kommandoen legger til en linje i din =~/.bashrc=-fil:
#+BEGIN_SRC sh
echo alias emacs='/snacks/bin/emacs-newest' >> ~/.bashrc
#+END_SRC
Kommandoen ~alias emacs='/snacks/bin/emacs-newest'~ vil kjøres hver gang
du åpner en ny terminal. For at endringen skal ta effekt med en gang kan
du bruke ~source~:
#+BEGIN_SRC sh
[larstvei@vetur ~]$ source ~/.bashrc
[larstvei@vetur ~]$ emacs --version
GNU Emacs 24.4.1
Copyright (C) 2014 Free Software Foundation, Inc.
GNU Emacs comes with ABSOLUTELY NO WARRANTY.
You may redistribute copies of Emacs
under the terms of the GNU General Public License.
For more information about these matters, see the file named COPYING.
#+END_SRC
Fra Emacs 24 og oppover kommer Emacs med en innebygget pakke-behandler
som gjør det svært enkelt å finne nyttige utvidelser for Emacs. Denne
brukes i konfigurasjonsfilen, så man må med andre ord ha Emacs 24 for at
den skal fungere.
** Emacs på egen maskin
Emacs er tilgjengelig på Linux, OS X og Windows.
*** Linux
De aller fleste pakkesystemer for Linux har Emacs 24 tilgjengelig. Her
dekkes hvordan Emacs kan installeres for Ubuntu og Fedora, som
bruker hhv. ~apt-get~ og ~yum~.
For Ubuntu (og Debian) kan du bruke kommandoen:
#+BEGIN_SRC sh
sudo apt-get install emacs24
#+END_SRC
For Fedora skriver du kun:
#+BEGIN_SRC sh
sudo apt-get install emacs
#+END_SRC
*** OS X
Dersom du ikke allerede bruker [[http://brew.sh/][Homebrew]] kan du laste ned Emacs hos [[http://emacsformacosx.com/][Emacs
For OS X]]. Det er kun å flytte Emacs fra .dmg-fila til ~Applikasjoner~.
For Homebrew kan du kjøre kommandoen:
#+BEGIN_SRC sh
brew install --cocoa emacs
#+END_SRC
For at den skal bli søkbar i Spotlight må du kopiere Emacs til
~Applikasjoner~. Kommandoen ~open~ åpner filer og mapper, så ved å
kjøre:
#+BEGIN_SRC sh
open /usr/local/Cellar/emacs/24.4/
#+END_SRC
kan du bare flytte Emacs til ~Applikasjoener~.
Dersom man bruker Alfred holder det å legge til ~/usr/local/~ under
Features->Search Scope.
*** Windows
Du kan laste ned Emacs [[http://ftp.gnu.org/pub/gnu/emacs/windows/][her]]. Du finner filene helt på bunnen av siden, du
kan laste ned ~emacs-24.3-bin-i386.zip~, eller prøve en nyere hvis det
er tilgjengelig.
Extract mappen på et passende stad. Emacs er stand alone og trenger altså ikke å installeres.
Emacs kjøres ved å dobbeltklikke på filen runemacs.exe som ligger i mappen "bin".
Emacs fungerer på akkurat samme måte, men alt fungerer bedre i Linux eller på Mac.
** Konfigurere Emacs
Her gang Emacs starter ser den etter en konfigurasjonsfil, den velger
/den første/ den finner av disse tre filene:
- =~/.emacs=
- =~/.emacs.el=
- =~/.emacs.d/init.el=
Den siste ligger altså i en mappe som heter =~/.emacs.d/=, det kan være
fordelaktig dersom du ønsker å spre konfigurasjonen din over flere
~.el~-filer, eller dersom du ønsker å ha færre filer liggende i
hjemmeområdet.
Konfigurasjonsfilen blir tolket som et vanlig Emacs Lisp program, så alt
innholdet må være Emacs Lisp kode.
For å begynne kan du åpne Emacs og skrive =C-x C-f RET ~/.emacs=, og
skrive inn litt Emacs Lisp, f. eks:
#+BEGIN_SRC emacs-lisp
(blink-cursor-mode 0)
#+END_SRC
Dersom du lagrer (med =C-x C-s=) og åpner Emacs på nytt vil du se at
markøren ikke blinker lenger. Siden Emacs kan endres /under kjøring/ kan
du kun evaluere uttrykket, dette kan du gjøre ved å skrive =M-x
eval-buffer=, som evaluerer hele bufferet. Du kan også evaluere et enkelt
uttrykk ved å plassere markøren ved slutten av uttrykket og trykke =C-x
C-e=. Merk at endringer du gjør som ikke largres noe sted vil mistes når
du lukker Emacs.
Hvordan man konfigurerer gås nøyere gjennom under kurset, og vi tar
utgangspunkt i en enkel [[./emacs-init.el][konfigurasjonsfil]].
* Litt om bruk av verktøy
Som informatikkstudenter jobber vi mye med å løse problemer. Når vi jobber
med programmering blir vi ofte møtt med mange små hindringer som
distraherer oss fra problemet vi prøver å løse. Ved å velge gode verktøy
kan du unngå mange av disse hindringene og heller fokuser på å jobbe med
selve problemet.
Verktøyene vi bruker er gjerne programmer som [[http://termvakt.uio.no/Fjerninnlogging][SSH]], [[http://git-scm.com/][Git]], [[https://gcc.gnu.org/][GCC]], [[http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html][JDK]], [[https://eclipse.org/][Eclipse]],
[[http://www.latex-project.org/][LaTeX]] eller [[https://www.mozilla.org/en-US/firefox/developer/][Firefox]] og selvfølgelig et hav andre. De programmene vi velger
utgjør arbeidsflyten vår.
Noe av det vi gjør mest som programmerere er å jobbe med tekst. Det finnes
mange programmer som gjør denne jobben utmerket, f. eks. [[http://www.vim.org/][Vim]], [[http://www.sublimetext.com/3][Sublime]]
eller [[https://atom.io/][Atom]]. Vi skal lære om teksteditoren [[http://www.gnu.org/software/emacs/][Emacs]]. Det aller beste med Emacs
er at det kan /endres mens det kjører/. Dette er en utrolig kraftig
egenskap.
Om du ser for deg at du kommer til å programmere i mange år fremover er
min anbefaling at du lærer deg en håndfull programmer /godt/, og at en av
disse programmene bør være en teksteditor. Dersom du ønsker et fleksibelt
verktøy som dekker de fleste aspektene av programmering bør du se hva
Emacs har å tilby.
** Emacs
Emacs er et program som gir brukeren et interface for å redigere tekst. I
bunn er det en språktolker som kan tolke Emacs Lisp kode, som er et
fullverdig programmeringsspråk, med et stort bibliotek av funksjoner som
lar deg operere på tekst. Hver gang Emacs mottar et tastetrykk fyres det
av en funksjon. Disse funksjonene er som regel skrevet i Emacs Lisp
(resten er skrevet i C), og du kan åpne kildekoden og utforske hva den
gjør.
Siden Emacs Lisp er et tolket språk kan vi evaluere kode mens Emacs
kjører, og se effekten umiddelbart. Vi kan definere nye funksjoner, eller
redefinere eksisterende, og endre Emacs til å gjøre oppgavene vi
ønsker. Det unike med Emacs er at de endringene du gjør er en like «sann»
del av Emacs som alt av innebygd funksjonalitet, som gjør den langt mer
utvidbar enn de fleste andre programmer.
Som en effekt kan man bruke Emacs til utrolig mye forskjellig. Det finnes
støtte for de aller fleste programmeringsspråk, samt markup-språk som
HTML, LaTeX, Markdown og Org. Emacs kan også kommunisere med eksterne
prosesser, som lar deg f. eks. kjøre en terminal i Emacs, sende kode fra
et Emacs-buffer til en ekstern språktolker (f. eks. Python), som så
evalueres, kompilere LaTeX-dokumenter fra Emacs eller tilby et interface
til [[https://github.com/magit/magit][Git]].
Dersom man velger å bruke Emacs kan man også velge vekk veldig mange
andre programmer. Fordelen med dette er at det blir en slakere
læringskurve når du skal benytte deg av et nytt programmeringsspråk
e. l. siden du allerede er kjent med verktøyet. Ulempen er at
læringskurven til Emacs kan være noe bratt.
[[file:editor-learning-curve.png]]
* Lisens
#+BEGIN_HTML
<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img alt="Creative Commons-lisens" style="border-width:0" src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a><br />
#+END_HTML
Dette verk er lisensieret under en [[http://creativecommons.org/licenses/by-sa/4.0/][Creative Commons
Navngivelse-DelPåSammeVilkår 4.0 Internasjonal lisens]].

233
init.org
View File

@ -1,233 +0,0 @@
#+TITLE: Konfigurer din egen Emacs!
#+EMAIL: larstvei@ifi.uio.no
* Installer Emacs
+ Følg de offisielle instruksjonene
+ https://www.gnu.org/software/emacs/download.html
* Finn konfigurasjonsfilen
+ Emacs leter etter en Emacs Lisp fil den kan kjøre ved oppstart
+ =~/.emacs.el= (få bruker dette)
+ =~/.emacs=
+ =~/.emacs.d/init.el=
+ I den rekkefølgen
+ Se https://www.gnu.org/software/emacs/manual/html_node/emacs/Find-Init.html
+ For Windows + https://www.gnu.org/software/emacs/manual/html_node/emacs/Windows-HOME.html
* Tips
+ Det er lurt å forstå alt som legges inn i konfigurasjonsfilen
+ Du kan oppdatere Emacs under kjøring
+ Bruk =C-x C-e= for å evaluere et uttrykket bak pekeren
+ Bruk =M-x eval-buffer= for å evaluere hele filen
+ En konfigurasjonsfil bør være /idempotent/!
+ Det vil si at det er trygt å evaluere den flere ganger
* Sette variabler
+ Enkle konfigurasjoner gjøres ved å sette variabler
+ Få en mindre bråkete velkomst
#+begin_src emacs-lisp :tangle yes
;; Dette fjerner velkomstskjermen ved oppstart av Emacs.
(setq inhibit-splash-screen t)
#+end_src
+ Gi korte svar når Emacs ber om input
#+begin_src emacs-lisp :tangle yes
;; Emacs ber deg iblant svare "yes" eller "no". Dette gjør at Emacs
;; nøyer seg med "y" eller "n".
(setq use-short-answers t)
#+end_src
* Mindre distraksjoner ved å skru av modes
+ En blinkende peker blir fort gammelt
#+begin_src emacs-lisp :tangle yes
;; Skru av blinkende peker.
(blink-cursor-mode 0)
#+end_src
+ Andre GUI-elementer er også lite nyttig i et tastaturdrevet program!
#+begin_src emacs-lisp :tangle yes
;; Disse skrur av diverse GUI-elementer.
(menu-bar-mode 0)
(tool-bar-mode 0)
(scroll-bar-mode 0)
#+end_src
* Auto-revert
+ Vanligvis vil ikke Emacs automatisk oppdatere innholdet i et buffer når filen
endrer seg
+ I tillegg lagrer den «lås-filer» for å unngå at to programmer jobber på samme fil
+ Det kan være litt forvirrende, så la oss endre det
#+begin_src emacs-lisp :tangle yes
(global-auto-revert-mode)
(setq global-auto-revert-non-file-buffers t
create-lockfiles nil)
#+end_src
* Backup-filer
+ Emacs liker å lagre backupfiler, som kan være litt forkludrende
+ La oss gjemme de vekk
#+begin_src emacs-lisp :tangle yes
(setq backup-directory-alist `(("." . ,(locate-user-emacs-file "backups"))))
#+end_src
* Pakker
+ Det finnes utrolig mange pakker til Emacs
+ Legg til dette for å få tilgang til flere tusen pakker!
#+begin_src emacs-lisp :tangle yes
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
#+end_src
+ Den enkleste måten å ta i bruk en pakke er med =use-package=
#+begin_src emacs-lisp :tangle yes
;; (use-package my-package-name
;; :ensure t ; Ensure my-package is installed
;; :after foo ; Load my-package after foo is loaded (seldom used)
;; :init ; Run this code before my-package is loaded
;; :bind ; Bind these keys to these functions
;; :custom ; Set these variables
;; :config ; Run this code after my-package is loaded
#+end_src
* Vertikalt minubuffer
+ Pakken =vertigo= gir en mer oversiktlig måte å interagere med minibufferet
#+begin_src emacs-lisp :tangle yes
;; VERTical Interactive COmpletion
(use-package vertico
:ensure t
:config
(setq vertico-count 25)
(vertico-mode 1))
#+end_src
* Husk tidligere kommandoer
+ =savehist-mode= gjør at kommandoer du brukte nylig vises først
#+begin_src emacs-lisp :tangle yes
;; Save minibuffer history
(use-package savehist
:config
(savehist-mode 1))
#+end_src
* Navigering og søking
+ Pakken =consult= forbedrer mange kommandoer når du skal navigere og søke
#+begin_src emacs-lisp :tangle yes
(use-package consult
:ensure t
:bind ("C-x b" . consult-buffer)
:config
(setq consult-preview-key (list :debounce 0.1 'any)))
#+end_src
* Tidligere besøkte filer
+ Emacs har såklart en mode for å tilgjengeliggjøre nylig besøkte filer
#+begin_src emacs-lisp :tangle yes
(recentf-mode t)
(setq recentf-max-saved-items 1000)
#+end_src
* Which-key
+ =which-key= er en pakke som hjelper deg finne tastekombinasjoner
#+begin_src emacs-lisp :tangle yes
;; Display available keybindings in popup
(use-package which-key
:ensure t
:config (which-key-mode 1))
#+end_src
* Fargetema!
+ Du kan Style emacs som du vil
+ Se https://emacsthemes.com/
+ Pakken =ef-themes= har mange gode fargetemaer
#+begin_src emacs-lisp :tangle yes
(use-package ef-themes
:ensure t
:config
(ef-themes-select 'ef-light))
#+end_src
+ Bruk =M-x consult-theme= for å teste ut ulike fargetemaer!
* Programmering
+ /Noen/ liker linjenummere
#+begin_src emacs-lisp :tangle yes
(add-hook 'prog-mode-hook 'display-line-numbers-mode)
#+end_src
+ /Noen/ liker også relative linjenummere
#+begin_src emacs-lisp :tangle yes
(setq display-line-numbers-type t)
#+end_src
+ /Alle/ liker å se hvor en parentes starter og slutter
#+begin_src emacs-lisp :tangle yes
(show-paren-mode 1)
#+end_src

View File

@ -1,15 +1,12 @@
#+TITLE: Emacskurs #+TITLE: Emacskurs
#+EMAIL: larstvei@ifi.uio.no #+EMAIL: larstvei@ifi.uio.no
[[https://git.larstvei.no/larstvei/emacskurs]]
* Plan for kurset * Plan for kurset
+ Introduksjon til bruk av Emacs (ca. 30 minutter) + Introduksjon til bruk av Emacs (ca. 20 minutter)
+ Dere installerer Emacs 29 (frem til maten kommer)
+ Pizza! (for de som er påmeldt)
+ Se en konfigurasjonsfil vokse frem (ca. 20 minutter) + Se en konfigurasjonsfil vokse frem (ca. 20 minutter)
+ Workshop hvor vi hjelper deg starte å konfigurere Emacs (ca. 20 minutter) + Pizza! (for de som er påmeldt)
+ Workshop hvor vi hjelper deg komme i gang med Emacs (ca. 45 minutter)
* Hva er Emacs? * Hva er Emacs?
@ -55,7 +52,7 @@
+ Etter hvert: + Etter hvert:
+ Skriv din egen konfigurasjonsfil + Skriv din egen konfigurasjonsfil
+ Lær litt Emacs Lisp og skriv dine egne funksjoner + Lær litt Emacs Lisp, og skriv dine egne funksjoner
+ Gjør =Caps Lock= om til en ekstra =Ctrl= + Gjør =Caps Lock= om til en ekstra =Ctrl=
@ -65,11 +62,7 @@
+ Control + Control
+ =M-<any>= + =M-<any>=
+ Meta er venstre-=Alt= på de fleste maskiner (alternativt =ESC=) + Meta er =Alt= på de fleste maskiner (alternativt =ESC=)
+ =S-<any>=
* Shift
* Kan ikke brukes med tegn du må bruke Shift for å nå (f.eks. =:=)
+ =<any>= representerer et vilkårlig tegn eller tastekombinasjon + =<any>= representerer et vilkårlig tegn eller tastekombinasjon
@ -127,7 +120,7 @@
+ Gå til begynnelsen/slutten av bufferet + Gå til begynnelsen/slutten av bufferet
+ =C-l= + =C-l=
+ Juster vertikal visning av markøren til midten/toppen/bunnen + Juster vertikal visning av markøren til senter/toppen/bunnen
* Kill og yank * Kill og yank
@ -151,10 +144,6 @@
+ =C-d=, =M-d=, =C-M-d= + =C-d=, =M-d=, =C-M-d=
+ Fjern neste bokstav/ord/uttrykk + Fjern neste bokstav/ord/uttrykk
+ =DEL=, =M-DEL=, =C-M-DEL=
* Fjern forrige bokstav/ord/uttrykk
* =DEL= er "slettetasten", ikke "delete"
+ =C-_=, =C-/=, =C-x u= + =C-_=, =C-/=, =C-x u=
+ Undo! + Undo!
@ -166,7 +155,6 @@
+ =M-q= + =M-q=
+ Formaterer avsnitt til en fornuftig linjebredde + Formaterer avsnitt til en fornuftig linjebredde
+ Setter inn og fjerner kommentartegn etter behov
+ =M-u=, =M-l=, =M-c= + =M-u=, =M-l=, =M-c=
+ Gjør neste ord til UPPERCASE/lowercase/Capital-Case + Gjør neste ord til UPPERCASE/lowercase/Capital-Case
@ -180,7 +168,7 @@
+ Markerer all tekst + Markerer all tekst
+ =M-h= + =M-h=
+ Markerer et avsnitt ("paragraph") + Markerer en paragraf
+ Bruk i kombinasjon med =M-w=, =C-w= og =TAB= + Bruk i kombinasjon med =M-w=, =C-w= og =TAB=
@ -220,7 +208,7 @@
+ Drep (kill) buffer + Drep (kill) buffer
+ =C-x left=, =C-x right= + =C-x left=, =C-x right=
+ En annen måte å bytte buffer på + En annen måte å bytter buffer på
* Kommandoer * Kommandoer
@ -232,15 +220,14 @@
+ =M-%=, =M-x query-replace RET <from> RET <to> RET= + =M-%=, =M-x query-replace RET <from> RET <to> RET=
+ Som =replace-string= for utvalgte treff + Som =replace-string= for utvalgte treff
+ Bruk =y= / =n= for å velge om treffet skal erstattes + Bruk =y=/=n= for om treffet skal erstattes
+ Bruk =!= for å erstatte resten av treffene
* Søking * Søking
+ =C-s= + =C-s=
+ Søk /fremover/ i bufferet + Søk /fremover/ i bufferet
+ Gjenta =C-s= for neste treff + Gjenta =C-s= for neste treff
+ Avslutt med =RET=, slettekommando eller flytting av peker + Avslutt med =RET=
+ =C-r= + =C-r=
+ Søk /bakover/ i bufferet + Søk /bakover/ i bufferet
@ -324,7 +311,7 @@
+ [[https://magit.vc/][Magit]] + [[https://magit.vc/][Magit]]
+ Det beste grensesnittet til Git + Det beste grensesnittet til Git
+ [[https://orgmode.org/][Org mode]] + [[https://orgmode.org/][Org mode]]
+ Et markup-språk med fantastisk støtte for + Et markup språk med fantastisk støtte for
+ Notater + Notater
+ Publisering + Publisering
+ Literate programming + Literate programming