Compare commits
No commits in common. "main" and "attic" have entirely different histories.
27
README.org
27
README.org
@ -1,4 +1,25 @@
|
||||
#+TITLE: Velkommen til Emacskurs!
|
||||
* Emacskurs vår 2015
|
||||
|
||||
- [[./slides.org][Slides]]
|
||||
- [[./init.org][Konfigurasjon]]
|
||||
Her ligger kildekoden til alt kursmaterialet for kurset. 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.
|
||||
|
||||
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]].
|
||||
|
@ -1,5 +1,3 @@
|
||||
#+OPTIONS: html-style:nil
|
||||
|
||||
|---------------------+------------------------------|
|
||||
| Tastekombinasjon | Beskrivelse |
|
||||
|---------------------+------------------------------|
|
||||
@ -46,7 +44,6 @@
|
||||
|---------------------+------------------------------|
|
||||
| =C-d= | =delete-char= |
|
||||
| =M-d= | =kill-word= |
|
||||
| =M-DEL= | =backward-kill-word= |
|
||||
| =C-_= | =undo= |
|
||||
| =C-t= | =transpose-chars= |
|
||||
| =M-t= | =transpose-words= |
|
||||
|
350
idemyldring.org
Normal file
350
idemyldring.org
Normal 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
|
BIN
img/MatrixBluePillRedPill.jpg
Normal file
BIN
img/MatrixBluePillRedPill.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 183 KiB |
BIN
img/editor-learning-curve.png
Normal file
BIN
img/editor-learning-curve.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.8 KiB |
BIN
img/lisp_cycles.png
Normal file
BIN
img/lisp_cycles.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 36 KiB |
BIN
img/workflow_2x.png
Normal file
BIN
img/workflow_2x.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 72 KiB |
256
index.org
Normal file
256
index.org
Normal 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
233
init.org
@ -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
|
35
slides.org
35
slides.org
@ -1,15 +1,12 @@
|
||||
#+TITLE: Emacskurs
|
||||
#+EMAIL: larstvei@ifi.uio.no
|
||||
|
||||
[[https://git.larstvei.no/larstvei/emacskurs]]
|
||||
|
||||
* Plan for kurset
|
||||
|
||||
+ Introduksjon til bruk av Emacs (ca. 30 minutter)
|
||||
+ Dere installerer Emacs 29 (frem til maten kommer)
|
||||
+ Pizza! (for de som er påmeldt)
|
||||
+ Introduksjon til bruk av Emacs (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?
|
||||
|
||||
@ -55,7 +52,7 @@
|
||||
|
||||
+ Etter hvert:
|
||||
+ 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=
|
||||
|
||||
@ -65,11 +62,7 @@
|
||||
+ Control
|
||||
|
||||
+ =M-<any>=
|
||||
+ Meta er venstre-=Alt= på de fleste maskiner (alternativt =ESC=)
|
||||
|
||||
+ =S-<any>=
|
||||
* Shift
|
||||
* Kan ikke brukes med tegn du må bruke Shift for å nå (f.eks. =:=)
|
||||
+ Meta er =Alt= på de fleste maskiner (alternativt =ESC=)
|
||||
|
||||
+ =<any>= representerer et vilkårlig tegn eller tastekombinasjon
|
||||
|
||||
@ -127,7 +120,7 @@
|
||||
+ Gå til begynnelsen/slutten av bufferet
|
||||
|
||||
+ =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
|
||||
|
||||
@ -151,10 +144,6 @@
|
||||
+ =C-d=, =M-d=, =C-M-d=
|
||||
+ 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=
|
||||
+ Undo!
|
||||
|
||||
@ -166,7 +155,6 @@
|
||||
|
||||
+ =M-q=
|
||||
+ Formaterer avsnitt til en fornuftig linjebredde
|
||||
+ Setter inn og fjerner kommentartegn etter behov
|
||||
|
||||
+ =M-u=, =M-l=, =M-c=
|
||||
+ Gjør neste ord til UPPERCASE/lowercase/Capital-Case
|
||||
@ -180,7 +168,7 @@
|
||||
+ Markerer all tekst
|
||||
|
||||
+ =M-h=
|
||||
+ Markerer et avsnitt ("paragraph")
|
||||
+ Markerer en paragraf
|
||||
|
||||
+ Bruk i kombinasjon med =M-w=, =C-w= og =TAB=
|
||||
|
||||
@ -220,7 +208,7 @@
|
||||
+ Drep (kill) buffer
|
||||
|
||||
+ =C-x left=, =C-x right=
|
||||
+ En annen måte å bytte buffer på
|
||||
+ En annen måte å bytter buffer på
|
||||
|
||||
* Kommandoer
|
||||
|
||||
@ -232,15 +220,14 @@
|
||||
|
||||
+ =M-%=, =M-x query-replace RET <from> RET <to> RET=
|
||||
+ Som =replace-string= for utvalgte treff
|
||||
+ Bruk =y= / =n= for å velge om treffet skal erstattes
|
||||
+ Bruk =!= for å erstatte resten av treffene
|
||||
+ Bruk =y=/=n= for om treffet skal erstattes
|
||||
|
||||
* Søking
|
||||
|
||||
+ =C-s=
|
||||
+ Søk /fremover/ i bufferet
|
||||
+ Gjenta =C-s= for neste treff
|
||||
+ Avslutt med =RET=, slettekommando eller flytting av peker
|
||||
+ Avslutt med =RET=
|
||||
|
||||
+ =C-r=
|
||||
+ Søk /bakover/ i bufferet
|
||||
@ -324,7 +311,7 @@
|
||||
+ [[https://magit.vc/][Magit]]
|
||||
+ Det beste grensesnittet til Git
|
||||
+ [[https://orgmode.org/][Org mode]]
|
||||
+ Et markup-språk med fantastisk støtte for
|
||||
+ Et markup språk med fantastisk støtte for
|
||||
+ Notater
|
||||
+ Publisering
|
||||
+ Literate programming
|
||||
|
Loading…
Reference in New Issue
Block a user