Emacs
LinuxWiki.se
Copyright (c) 2006-2010 Kristian Rumberg and others (see history) This work is licensed to you under version 2 of the GNU General Public License. Alternatively, you may choose to receive this work under any other license that grants the right to use, copy, modify, and/or distribute the work, as long as that license imposes the restriction that derivative works have to grant the same rights and impose the same restriction. For example, you may choose to receive this work under the GNU Free Documentation License, the CreativeCommons ShareAlike License, the XEmacs manual license, or similar licenses. As a special exception, the code examples in this document can be copied, distributed and/or modified in any form without restrictions. You may extend this exception to your version of the document, but you are not obliged to do so. If you do not wish to do so, delete this exception statement from your version.
[redigera] Introduktion
Emacs är en mycket avancerad texteditor och härstammar ifrån en samling makron skrivna av användare på det amerikanska universitetet MIT under 70-talet. Under mitten av samma årtionde började dessa att sammanställas, en uppgift som Richard Stallman slutförde. Emacs står för Editor MACroS.
Det som är speciellt med emacs är att hela editorn är uppbyggd kring ett skriptspråk - Emacs Lisp. Det är väldigt lätt att konfigurera editorn med Lisp och man kan göra alltifrån att ändra tangentkommandons funktioner till att skapa hela program som går att köra i editorn.
I Emacs kan man redigera olika typer av textfiler på samma gång, varje filtyp har sitt eget "mode" (lägen) vilka kan erbjuda användaren extrafunktioner som snabbtangenter, menyer eller inställningar för just den typen av redigering (se ovan). Det finns även ett flertal spel, musik/video-spelare och andra program som går att köra i "texteditorn" emacs (se nedan).
De två största versionerna (i användartal räknat) av Emacs är GNU Emacs (började utvecklas 1984 av Stallman själv) och XEmacs, den senare är en grafisk förgrening (eng. fork) av GNU Emacs.
[redigera] Installera GNU Emacs
Börja med att installera emacs via din distributions pakethanterare. Tyvärr tillhandahåller de flesta distar endast den sedan flera år stabila versionen 21.4 som dessvärre är hopplöst föråldrad, främst till det yttre. Det rekommenderas därför varmt att man tankar ner en modernare utvecklingsversion (Emacs 23), med stöd för GTK-2 och XFT-rendering av text. För Ubuntuanvändare finns färdigkompilerade versioner länkade på http://peadrop.com/blog/2007/01/06/pretty-emacs/
För den som använder Mac OS X finns flera alternativ att välja bland. De mest använda är Aquamacs ([1]) och de versioner av Emacs som finns inom Macports ([2])
[redigera] Starta GNU Emacs och kör dess inbyggda nybörjarguide, stäng GNU Emacs
Emacs kan verka lite kryptisk för nya användare, särskilt eftersom dess kommandon inte riktigt ligger där en windowsanvändare förväntar sig att de ska. Det som folk i allmänhet först av allt märker är att CTRL + s inte sparar ditt dokument utan istället erbjuder sökning i dokumentet. Klipp ut och klistra in fungerar också lite annorlunda i Emacs - fast är istället betydligt flexiblare än i de flesta andra editorer. Den här artikeln ämnar vara en liten lathund för hur du kommer igång och sedan därifrån kan gå vidare till andra guider om denna avancerade texteditor.
Starta en terminal och skriv
emacs &(för en textbaserad session)
emacs -nw
Du möts nu av emacs välkomstskärm. Emacs må verka kryptisk men är dock en väldigt pedagogisk editor. Det medföljer nämligen en interaktiv nybörjarguide i själva editorn. För att sparka igång denna tryck
CTRL + h släpp bägge tangenterna och tryck t
Om du arbetar i en ordbehandlare som Microsoft Word eller OpenOffice Writer används vanligtvis CTRL i kombination med någon bokstav som snabbkommandon. I emacs är det likadant men här används även den sk. META-tangenten för att köra kortkommandon. META finns på vissa äldre datorsystem och på bland annat Sun SPARC men PC saknar denna.
På PC används istället ALT eller ESC. Om ALT (eller i vissa fall windowstangenten) fungerar i din emacs-version är allt frid och fröjd. Tvingas du istället använda ESC så ska du först trycka ner ESC, släppa denna och sedan trycka bokstaven - inte bägge samtidigt.
Vissa kommandon körs direkt genom CTRL + bokstav, eller META + bokstav. En hel del mycket vanliga kommando återfinns dock om man först skriver CTRL + x och därefter CTRL + bokstav.
Då CTRL används så mycket kan det vara ansträngande för lillfingrarna, många emacs-användare ställer därför in CAPS LOCK till att vara en extra CTRL-tangent (då CAPS LOCK ligger mer åtkomlig men sällan används). I Gnome är det superlätt att åstadkomma, gå in under "System/Preferences/Keyboard/Layout options/CTRL key position" och välj "Use CAPS LOCK as an extra CTRL key".
För att avsluta emacs, tryck CTRL + x följt av CTRL + c
[redigera] Hur man får Emacs att starta riktigt snabbt
emacs -Q -nw drar på en röd sekund igång Emacs i terminalläge. Priset är att inga personliga inställningar läses in
[redigera] Om något går fel (avbryt nuvarande kommando)
Det kommer hända, du kommer skriva fel och svära upprepade gånger åt emacs finurliga tangentkombinationer, innan du slutligen lär dig älska denna fantastiska editor ;) Till dess, om du börjar skriva och det blir fel kan du när som helst avbryta nuvarande kommando med genom att (upprepade gånger) trycka CTRL + g.
[redigera] Infoga text
Emacs har inte kommandoläge och inmatningsläge som tex. ed eller vi. Det går därför bra att när som helst mata in text där markören står.
[redigera] Infoga symbol genererad av en enskild tangent oavsett lisp-koppling
Som default i till exempel C/C++-läge infogar en tryckning på TAB inget tabtecken utan indenterar den nuvarande raden. Ofta är det precis vad man vill ha, men om man trots allt verkligen vill infoga en rå TAB så kan man göra det genom prefixet CTRL + q följt av tangenten. Emacs kör då inte eventuella lisp-kopplingar utan gör en enkel self-insert
[redigera] Flytta markören
I Emacs flyttar du markören med piltangenterna precis som vanligt. Du kan också använda CTRL + f (ett steg framåt), CTRL + b (ett steg bakåt), CTRL + n (ett steg nedåt) samt CTRL + p (ett steg uppåt). Används f eller b med META istället för CTRL flyttar man markören ett helt ord bakåt eller framåt.
[redigera] Flytta till början av raden
CTRL + a eller home
[redigera] Flytta till slutet av raden
CTRL + e eller end
[redigera] Flytta till början av meningen
META + a
[redigera] Flytta till slutet av meningen
META + e
[redigera] Flytta till början av filen
META + <
[redigera] Flytta till slutet av filen
META + >
[redigera] Scrolla skärmen en sida framåt
CTRL + v eller page down
[redigera] Scrolla skärmen en sida bakåt
META + v eller page up
[redigera] Gå till valfri rad
Tryck META + g två gånger i följd och skriv in önskad rad.
[redigera] Centrera skärmvyn lodrätt kring markörens position
CTRL + l
[redigera] Infoga rader
[redigera] Infoga en tom rad vid markören utan att flytta fram denna
CTRL + o
[redigera] Infoga radbrytning
CTRL + m eller ENTER
[redigera] Infoga indenterad nyrad
CTRL + j
[redigera] Infoga fil i aktuell buffert
CTRL + x följt av i
[redigera] Markera/klipp ut/klistra in text/ta bort text
[redigera] Markera text
Tryck först CTRL + SPACE. Flytta därefter markören med piltangenterna till den position dit markeringen ska avslutas, härifrån kan du tex. utföra utklippning och kopiering
[redigera] Hoppa till en tidigare markering
Tryck först CTRL + u och därefter CTRL + SPACE. Upprepade tryckningar hoppar vidare bakåt i markeringshistoriken.
[redigera] Byt plats på markerings start och slut
CTRL + x följt av CTRL + x
[redigera] Klipp ut markerad text
CTRL + w
eller
SHIFT + DEL
[redigera] Kopiera markerad text
META + w
eller
SHIFT + INSERT
[redigera] Klipp ut resten av raden
CTRL + k
Klipp ut från markören och till radens slut. Det går utmärkt att upprepa kommandot för att klippa ut större block med text, tex funktioner och stycken.
[redigera] Klistra in text
CTRL + y
eller
CTRL + INSERT
[redigera] Bläddra i urklipp
Klistra in en gång med CTRL + y, tryck sedan META + y för att bläddra i urklipp
[redigera] Bläddra i urklipp a la "clipper"
Vill man ha en "clipper"-liknande funktion i emacs kan man installera http://www.todesschaf.org/files/browse-kill-ring.el . Skapa en mapp ".emacs_plugins" i din hemmapp och kopiera in filen. Öppna sedan ~/.emacs och lägg in följande rader
; Browse killring
(load-file "~/.emacs_plugins/browse-kill-ring.el")
(require 'browse-kill-ring)
(global-set-key [(super ?u)] 'browse-kill-ring)
Nu kommer funktionen vara tillgänglig under Windowstangenten + y.
[redigera] Ta bort ett tecken
CTRL + d fungerar precis som delete, dvs tar bort tecknet framför markören. Detta tecken hamnar inte i det bläddringsbara urklippet.
[redigera] Ta bort ett ord
META + d tar bort ordet framför markören. Ordet hamnar i urklipp.
[redigera] Avmarkera markerad text
CTRL + g
[redigera] Ångra/upprepa
[redigera] Ångra
CTRL + _ Om det finns en markering kommer emacs ångra ändringar inom markeringen.
[redigera] Upprepa (ångra ångring)
Tryck tex. högerpil (eller CTRL + f) och därefter CTRL + _ tills önskat historikläge uppnås
[redigera] Upprepa en viss operation ett visst antal gånger
Tryck CTRL + u, skriv in antalet upprepningar och utför därefter operationen.
Om antalet upprepningar är mellan 1 och 9 fungerar CTRL + siffra, följt av operationen.
[redigera] Sök och ersätt
Emacs stödjer så kallad inkrementerad sökning, dvs emacs söker medan du skriver in din söktext (Mozilla Firefox använder samma teknik).
[redigera] Sök framåt
Tryck CTRL + s och skriv in din söktext, för att gå söka vidare tryck åter CTRL + s, för att avbryta tryck CTRL + g.
[redigera] Sök bakåt
Tryck CTRL + r och skriv in din söktext, för att gå söka vidare bakåt tryck åter CTRL + r, för att avbryta tryck CTRL + g.
[redigera] Sök och ersätt
Tryck META + % och skriv in vad som ska ersättas och vad det ska ersättas med.
Själv har jag bundit kommandot till den oanvända kombinationen META + s enligt
(global-set-key [(meta ?s)] 'query-replace-regexp)
För att kodkänna en ersättning, tryck y, för att hoppa över en ersättning tryck n. För att godkänna alla kommande ersättningar tryck !
[redigera] Arbeta med buffertar
I Emacs arbetar man inte direkt mot filer utan mot något mer abstrakt som kallas buffertar. Filer läses in i buffert och här sker all editering - sparar man filen skrivs sedan innehållet tillbaka till filen.
Det går att ha flera buffertar öppna samtidigt, och växla mellan dessa på flera sätt.
[redigera] Gå till en öppnad buffert / läs in fil i ny buffer (öppna)
CTRL + x följt av CTRL + f
Observera att du kan använda TAB för att aktivera word completion så att du slipper skriva in hela sökvägen/filnamnet. Om du tidigare öppnat filer, sedan stängt dem så kan du upprepa gamla filöppningar genom att bläddra med pilarna och nedåt
[redigera] Spara bufferts innehåll till fil (spara)
CTRL + x följt av CTRL + s
Nej, spara ligger inte under CTRL + s ;) , det är sök
CTRL + x följt av s sparar alla öppna buffrar (filer i vårt fall)
[redigera] Spara bufferts innehåll till valfri fil (spara som)
CTRL + x följt av CTRL + w
[redigera] Gå till öppen buffert
CTRL + x följt av b och skriv in namnet på sökt buffert. Tänk på att använda TAB så ofta det går så bespar du dig även här mycket skrivande. Skriver du ingenting tar emacs dig till föregående buffert. Tryck i alla händelser ENTER för att byta buffert.
[redigera] Visa en meny med alla öppna buffertar
CTRL + x följt av CTRL + b
Jag använder denna funktioner väldigt ofta och har därför mappat "buffer-menu" till knappen som ligger ovanför "TAB". Lägg in följande i ~/.emacs
;; Buffer-list
(global-set-key [(?§)] 'buffer-menu)
[redigera] Stäng buffert
CTRL + x följt av k
[redigera] Arbeta med fönster
Det går utmärkt att jobba med en fil/buffer i taget och växla mellan dessa. Ibland vill man dock kunna se flera filer, eller tom. olika delar av samma fil i samtidigt. För detta syfte har emacs fönster
[redigera] Splitta det aktiva fönstret i två (vertikalt)
CTRL+ x följt av 2
Det aktiva fönstret delas mitt itu och tillåter dig att arbeta med olika delar av samma buffert eller att öppna en ny buffert/fil i den ena/båda av fönstren.
[redigera] Splitta det aktiva fönstret i två (horisontellt)
CTRL+ x följt av 3
Samma som föregående, fast splittringen sker horisontellt.
[redigera] Stäng det aktiva fönstret
CTRL + x följt av 0
Stänger det aktiva fönstret men behåller dess buffertar öppna, ger tillbaka skärmuttrymme till dess syskon-fönster.
[redigera] Maximera det aktiva fönstret
CTRL + x följt av 1
Stänger övriga fönster men behåller dess buffertar öppna.
[redigera] Hoppa till annat fönster
CTRL + x följt av o
Hoppar till nästa fönster.
Det finns till många emacs-användares förtret ingen fördefinerad tangent för att hoppa till föregående fönster. CTRL + x följt av o är emellertid bundet till funktionen other-window som accepterar ett heltal som argument. Är det positivt eller uteblivet hoppar den framåt, är det negativt så hoppar den bakåt. Emacs innehåller otroligt många kommandon, och trots att nästan alla tangentkombinationer är upptagna kan man ändå aldrig binda samtliga funktioner till snabbtangenter, knapparna räcker inte till. CTRL + x följt av p råkar dock vara ledig och passar väldigt bra att definera som just "hoppa till föregående fönster"". Du gör det genom att lägga in följande rad i filen ~/.emacs
(global-set-key[(control ?x) ?p] (lambda () (interactive)(other-window -1)))
Exakt hur den fungerar behöver du inte bekymra dig om, vill du däremot fördjupa dig i Emacs LISP så finns det flera skolor och hjälptexter tillgängliga på internet.
[redigera] Makron i emacs
[redigera] Spela in macro
CTRL + x följt av ( För att avsluta inspelningen, tryck CTRL + x följt av )
[redigera] Spela upp makro rad för rad på en region text
Spela in ett makro, markera sedan det område som makrot ska köras på, tryck CTRL + x sedan CTRL + k följt av r
Jag använder själv istället tangentkombinationen META + l
(global-set-key [(meta ?l)] 'apply-macro-to-region-lines)
[redigera] Programmeringsrelaterade inbyggda funktioner
[redigera] Kommentera en region
I ett flertal modes (C/C++/Java) fungerar CTRL + c följt av CTRL + c. Om inte denna bindning är definerad fungerar alltid META + x följt av kommandot comment-region.
[redigera] Avkommentera en region
Tryck META + x följt av kommandot uncomment-region.
[redigera] Indentera en region
Emacs försöker att automatiskt indentera koden när användaren gör nyrad. För att manuellt indentera raden kan man trycka TAB var som helst på raden. Om man vill indentera ett antal rader kod kan man markera dem och därefter köra META + x följt av indent-region.
[redigera] Bortom textredigering
Emacs tillhandahåller en fullständig lisp-miljö och det är därför inte konstigt att finns en uppsjö program att som går att köra inne i editorn.
[redigera] Animerad kärlekshälsning
Tryck META + x och skriv animate-birthday-present (följt av ENTER).
[redigera] Bildvisning
Tryck META + x, skriv thumbs och tryck ENTER, välj mapp och tryck ENTER
[redigera] Filhantering
Tryck CTRL + x och därefter d (öppnar nuvarande mapp). Du kan också trycka CTRL + x, CTRL + f och mata in sökvägen till en mapp (följt av ENTER). Härifrån kan du visa och röra dig mellan mappar, skapa, kopiera, byta namn samt ta bort filer och mappar.
De flesta av nedanstående kommando utförs på den fil som markören står på, vill man utföra något på en serie filer kan dessa markeras med m.
R byt namn eller flytta på en eller flera filer
C kopiera en eller flera filer
Q sök och ersätt i markerade filer
d markera en eller flera filer för borttagning
u avmarkera en fil
x verkställ borttagningar
ENTER öppna fil vid markörens position
Det finns ett alternativt filhanteringsläge (tryck META+x, skriv "wdired-change-to-wdired-mode") som låter användaren redigera fillistan som ren text, att byta namn på en fil är då så enkelt som att trycka BACKSPACE och skriva över det gamla filnamnet. Likaså fungerar sök och ersätt - vilket ger en mycket kraftfull och väldigt smidig batch-renaming. När du är nöjd med dina ändringar så utför du ändringarna genom att "spara" fillistningen CTRL + x följt av CTRL + s.
För att snabbare komma till "writeable dired mode" lägg in följande i .emacs, då räcker det med att trycka "W" i vanliga dired mode för att växla läge
(require 'wdired)
(add-hook 'dired-mode-hook
(lambda ()
(define-key dired-mode-map "W" 'wdired-change-to-wdired-mode)))
[redigera] Anslut till en ftp/sftp-server
För att detta ska fungera krävs tillägget "tramp-mode", det finns installerat i Emacs 22 och 23 men går att installera manuellt i äldre versioner. Gå till dired mode CTRL + x följt av d. Skriv sedan in login och server enligt "/loginname@servernamn:". Emacs upptäcker själv ifall det är en ftp- eller en sftp-server som man försöker komma åt. För att ansluta till tex. ftp.sunet.se skriver man "/anonymous@ftp.sunet.se:". När man väl är inloggad fungerar samma kommandon som i vanliga dired-mode.
[redigera] Googla ifrån emacs
Lägg in följande i slutet av din ~/.emacs
(defun google-region (region-start region-end)
(interactive "r")
(browse-url (format "http://google.com/search?q=%s"
(buffer-substring-no-properties
region-start
region-end))))
Evaluera funktionen eller starta om emacs. Nu kan du markera en text i emacs, trycka META + x och skriva "google-region" så öppnas en webläsare med din sökning.
[redigera] Kalkulator
Tryck META + x och skriv calculator. Härifrån kan du mata in enkla algebraiska uttryck, som beräknas efter en entertryckning. För att avsluta, tryck q.
[redigera] Kompilera eller evaluera ett textstyckte i valfritt programmeringsspråk
Lägg in följande i slutet av .emacs, evaluera funktionen eller starta om emacs
(defun run-region()Skriv och markera en text, tex.
(interactive)
(let (h)
(setq h (make-hash-table :test 'equal))
(puthash "python" "python" h)
(puthash "perl" "perl" h)
(puthash "ruby" "ruby" h)
(puthash "c" "gcc -x c - && ./a.out" h)
(puthash "c++" "g++ -x c - && ./a.out" h)
(puthash "octave" "octave -q" h)
(shell-command-on-region (region-beginning) (region-end)
(gethash (completing-read "Select language: " (list "c" "c++" "octave" "perl" "python" "ruby")) h))
)
)
print 3+4(texten kan mycket väl spänna över flera rader). Tryck META + x och skriv run-region, välj sedan programmeringsspråk (i det här fallet "python" eller "ruby") och tryck enter. Resultatet "7" kommer synas längst ner i fönstret.
[redigera] Kompilera ifrån emacs
Tryck META + x, skriv compile, tryck enter, skriv make (eller anropa kompilatorn på annat sätt) och tryck enter.
[redigera] Kör ett externt kommando ifrån emacs
Tryck META+x och skriv shell-command, tryck ENTER, mata in kommandot och tryck ENTER. En snabbare variant är META + !, skriv in kommandot och tryck ENTER
[redigera] Kör msn/jabber/icq/irc ifrån emacs
Det finns flera irc-klienter tillgängliga för emacs, och med hjälp av bitlbee (som agerar som proxy) kan man ansluta till ett flertal olika IM-tjänster via en vanlig IRC-klient.
[redigera] Samtala med emacs inbyggda psykolog
Tryck META + x och skriv doctor (följt av ENTER).
[redigera] Sök bland filers innehåll (grep i Emacs)
Tryck CTRL + x följt av d. Gå till mappen du vill söka i. Tryck META + x och skriv find-grep. Här skriver du strängen du vill söka efter
[redigera] Spela spel i emacs
Några av de mindre nyttiga programmen är spel såsom tetris, fem i rad, solitar, pong samt snake. Du startar något av dessa genom att trycka META + x och därefter skriva tetris, gomoku, solitair, pong eller snake.
Spelet "Nummove" av Kristian Rumberg går att hämta hem här
Ett annat spel som Kristian skrivit, som tyvärr bara fungerar i nyare versioner av emacs är ett rymdäventyr-spel vid namn "Alienmangel". En spelvideo återfinns här och spelet går att hämta här
[redigera] Spela musik och film ifrån emacs
Paketet emms gör emacs till en mediaspelare
En bra konfiguration är
;Emms
(setq load-path (cons "~/emacs.d/emms" load-path)) ; förutsätter att emms är installerat i angiven mapp
(require 'emms-setup)
(emms-standard)
(emms-default-players)
(require 'emms-info-libtag)
(setq emms-info-functions '(emms-info-libtag))
(require 'emms-info-mp3info)
(require 'emms-info)
(require 'emms-info-ogg)
(require 'emms-volume)
(require 'emms-info-libtag)
(require 'emms-player-mplayer)
(setq emms-player-list '(emms-player-mplayer))
(define-key emms-playlist-mode-map (kbd "SPC") 'emms-pause)
Lägg den sist i din ~/.emacs (kräver att mplayer finns installerat)
För att ladda in en mapp med musik, tryck META + "x" föjt av "emms-add-directory", välj mapp. Skriv därefter META+"x" "emms-playlist-mode-go". Jag har själv bundit det sista steget med META+"6" enligt
(global-set-key[(meta ?6)] 'emms-playlist-mode-go)
[redigera] Starta en terminal i emacs
Tryck META + x, skriv shell och tryck enter. Du får då upp en terminal. För att bläddra i historyn, tryck META + p, respektive n. För att utföra historysökning, tryck META + r. Du avslutar shell med CTRL + x följt av k. För att starta en extra shell tryck META + "x" och skriv "rename-uniquely" följt av META + "x" skriv "shell"
[redigera] Visa batteritid
Om du har en laptop kan du se dess återstående batteritid genom att trycka META + x och skriva battery
[redigera] Konfigurera Emacs
Emacs går att konfigurera i princip hur mycket som helst och det är omöjligt att beskriva alla finesser inom detta område. Vissa saker kan det emellertid vara bekvämt att känna till.
Emacs är väldigt dynamiskt och har därför heller inga "solida" tangentbordskonfigurationer. Editorn drivs i grunden av ett scriptspråk kallas elisp som "håller samman editorn". Händelser, däribland tangentbordstryckningar kan kopplas via en tabell till olika elisp-funktioner, som anropas när händelsen inträffar. Dessa funktioner går också att anropa manuellt genom att trycka META + X, skriva in dess namn och trycka enter. Trycker man tex. på högerpil så anropas metoden forward-key. Prova själv att köra detta kommando genom META + X. För att bläddra mellan redan inmatade kommandon tryck META + x och därefter META + p.
elisp är för övrigt ett fullfjädrat programmeringsspråk och det går därför att skriva riktiga program och köra dessa i editorn. Det går tex. att skicka mail, spela spel, använda en kalkulator, komma åt en shell, använda IRC och mycket mycket mera. Skämtare menar att Emacs är en urusel editor, men ett underbart operativsystem :)
[redigera] Hur är tangenter definerade och hur söker man upp kommandon?
Innan vi väljer att konfigurera något så vill vi veta hur vår konfiguration ser ut just nu. Tryck META + X och skriv describe-key (du behöver inte skriva hela ordet, skriv några bokstäver och tryck sedan TAB så försöker emacs gissa vad du vill göra) och tryck enter. Tryck tex. CTRL + a så berättar emacs att denna tangentkombination leder till kommandot move-beginning-of-line, vilket flyttar markören till början av raden.
Anta att vi inte visste kommandot hette eller dess tangentkombination. Då kan vi skriva META + X och skriva apropos. Nu kan vi söka bland emacs' funktioner och kommandon, i det här fallet kanske move to beginning of line. Vi får här upp en lista på förslag på kommandon. Om vi scrollar ner lite finner vi således move-to-beginning-of-line.
I det ovanliga fallet där vi vet vad kommandot heter, men inte till vilket eller det alls är kopplat till något kommando kan vi använda META + X följt av where-is. Låt oss här skriva i move-to-beginning-of-line, svaret blir C-a samt home.
Som övning kan läsaren själv ta redo på vad CTRL + e gör.
[redigera] (Om)definera en tangent (lokalt eller globalt)
Kommandot local-set-key gör att man kan koppla eller koppla om en tangentkombination till en elisp-funktion. Gör man det kommer bindningen gälla för det nuvarande läget, tex. java-mode eller c-mode. global-set-key kommer att fungera i alla lägen och buffrar i "hela emacs". Ingen av dessa kommer dock att gälla om man startar om emacs. För att åstadkomma detta måste man lägga in kommandot i sin konfigurationsfil ~/.emacs. Mer om detta senare.
[redigera] Användbara scripts och extramoduler
[redigera] Teman i Emacs
Gå till http://www.cs.cmu.edu/~maverick/GNUEmacsColorThemeTest/ och hämta hem temapaketet. Skapa en mapp under ~/.emacs.d/color-themes och kopiera in alla filer från paketet. Lägg in följande i .emacs
(setq load-path (append load-path (list "~/.emacs.d/color-theme")))
(require 'color-theme)
Kör META + x, skriv color-theme-select och tryck enter
[redigera] Aktivera autokomplettering
Emacs indenterar själv koden man skriver. Skulle den vara felindenterad ställer man sig i början av raden och trycker TAB så hoppar koden rätt. Det går att ställa in så att TAB fungerar på detta vis i början av rader och som autokompletteringsknapp för text i andra fall.
Koden är lånad av iaidoka men aningen modiferad. Lägg in kodstycken i slutet av ~/.emacs och starta om emacs (egentligen inte nödvändigt men enklast).
(defun indent-or-complete ()
"Complete if point is at end of a word, otherwise indent line."
(interactive)
(if (looking-at "\\>")
(dabbrev-expand nil)
(indent-for-tab-command)
))
; Tab completion
(let (modelist it)
(setq modelist '('c-mode-common-hook 'lisp-mode-common-hook 'text-mode-hook
'java-mode-hook 'emacs-lisp-mode-hook
'LaTex-mode-hook 'Tex-Mode-hook 'python-mode-hook 'octave-mode-hook))
(setq it modelist)
(while it
(add-hook (eval (car it)) (function (lambda ()
(local-set-key (kbd "<tab>") 'indent-or-complete) )))
(add-hook (eval (car it)) (function (lambda ()
(local-set-key (kbd "TAB") 'indent-or-complete) )))
(setq it (cdr it))
)
)
;; The order that different completes are tested.
(setq hippie-expand-try-functions-list
'(try-expand-dabbrev-visible
try-expand-dabbrev
try-expand-dabbrev-all-buffers
try-expand-dabbrev-from-kill
; try-expand-all-abbrevs
; try-expand-line
))
[redigera] Auctex (Latex)
Auctex är ett mycket omfattande och avancerat hjälpmedel för att skriva dokument med Latex. Med Auctex medföljer också renderingssystemet preview-tex som gör att man kan visa renderade Latex-element som bilder istället för som ren kod (det kan göra texten mer lättläst).
Auctex brukar finnas i de flesta distributioners pakethanterare. Installera det därifrån och lägg därefter in följande i ~/.emacs
(load "auctex.el" nil t t)
(load "preview-latex.el" nil t t)
http://www.gnu.org/software/auctex/
[redigera] Automatisk insättning av define/ifndef/endif i nyskapade headerfiler
(add-hook 'c-mode-common-hook
(function (lambda()
(let (l)
(setq l (length (buffer-name)))
(when (equal (substring (buffer-name) (- l 2) l) ".h")
(when (not (file-exists-p (buffer-file-name)))
(setq l (upcase (substring (buffer-name) 0 (- l 2))))
(insert (concat "#ifndef " l "_H"))
(newline)
(insert (concat "#define " l "_H"))
(newline)(newline)
(newline)(newline)
(insert "#endif")
(previous-line)
(previous-line)
)
)))))
[redigera] Automatisk insättning av licensnotiser
För den som programmerar mycket fri och öppen programvara vore det praktiskt ifall det fanns ett system för att automatiskt infoga en licensnotis när en ny källkodsfil skapas. Nedan följer ett exempel på ett sådant system. Dokumentation för systemet är i produktion.....
Lägg in följande rad i ~/.emacs
(load-file "~/.emacs_plugins/licnotice/licnotice.el")
Spara nedanstående fem filer under ~/.emacs_plugins/licnotice/
licnotice.el
(defun c-comment-lines(b e)
(interactive)
(goto-char b)
(insert "/*")(newline)(beginning-of-line)
(insert " * ")
(while (< (point) e)
(next-line)(beginning-of-line)(insert " * ")
)
(next-line)
(beginning-of-line)
(insert " * ")(end-of-line)(newline)
(insert " */")
)
(setq licnotice-var-progname nil)
(setq licnotice-var-whatitdoes nil)
(setq licnotice-var-author nil)
(setq licnotice-var-email nil)
(setq licnotice-var-license "GPL")
(setq licnotice-path "~/.emacs_plugins/licnotice/")
(defun licnotice-select-license()
(interactive)
(setq licnotice-var-license (completing-read "Select license: " (list "BSD" "MIT" "GPL" "LGPL" "ISC")))
)
(defun licnotice-settings()
(interactive)
(licnotice-select-license)
(setq licnotice-var-progname (read-string "What is the name of your program? "))
(setq licnotice-var-whatitdoes (read-string "Tell me what it does very very briefly: "))
(setq licnotice-var-author (read-string "What is your name? "))
(setq licnotice-var-email (read-string "Tell me your email: "))
)
(defun licnotice-dump-settings()
(interactive)
(insert (concat
"(when 1 " "\n"
"(setq licnotice-var-progname \"" licnotice-var-progname "\")" "\n"
"(setq licnotice-var-whatitdoes \"" licnotice-var-whatitdoes "\")" "\n"
"(setq licnotice-var-author \"" licnotice-var-author "\")" "\n"
"(setq licnotice-var-email \"" licnotice-var-email "\")" "\n"
"(setq licnotice-var-license \"" licnotice-var-license "\")" "\n"
"(licnotice-enable)" "\n"
")"
))
)
(defun licnotice-enable()
(interactive)
(setq license-text-is-enabled t)
)
(defun licnotice-disable()
(interactive)
(setq license-text-is-enabled nil)
)
(licnotice-disable)
; Enable license text inserting for a list of modes
(setq modelist '( 'c-mode-common-hook
'lisp-mode-common-hook
'java-mode-hook
'emacs-lisp-mode-hook
'lisp-mode-hook
'python-mode-hook
'pascal-mode-hook
'delphi-mode-hook))
(setq it modelist)
(while it
(add-hook (eval (car it))
(function (lambda()
(unless (equal (buffer-name) "*scratch*")
(when (not (file-exists-p (buffer-file-name)))
(when license-text-is-enabled
(when (eq licnotice-var-progname nil)
(licnotice-settings)
)
(licnotice-insert)
)
))
)
))
(setq it (cdr it))
)
(defun licnotice-insert-private-head ()
(interactive)
(insert (concat licnotice-var-progname " - " licnotice-var-whatitdoes))(newline)
(insert (concat "Copyright (C) 2008, " " " licnotice-var-author " (" licnotice-var-email ")"))(newline)
;(insert "All rights reserved.")(newline)
(newline)
)
(defun licnotice-private-comment-region(bpos, epos)
(interactive)
(if (or
(equal major-mode 'c-mode)
(equal major-mode 'c++-mode)
(equal major-mode 'java-mode)
)
; c-style-comments
(c-comment-lines bpos epos)
; standard comments
(when 1
(comment-region bpos epos)
(end-of-buffer)
)
)
(newline)
(newline)
)
(defun licnotice-insert()
(interactive)
(let (bpos epos)
(setq bpos (point))
(licnotice-insert-private-head)
(setq epos (+ (point) (car (cdr (insert-file-contents (concat licnotice-path licnotice-var-license))))))
(licnotice-private-comment-region bpos epos)
)
)
GPL
This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
LGPL
This program is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
BSD
Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The names of its contributors may not be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
MIT
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
ISC
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies. THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
[redigera] C/C++
[redigera] ETags/CTags
Om man navigerar i C-kod kan det vara väldigt praktiskt att kunna hoppa till definitionen av en symbol. För detta syfte finns etags (som bygger på ctags), det fungerar för C++ men kan inte hantera metodnamn vilket kraftigt begränsar dess användbarhet.
http://www.emacswiki.org/emacs/EmacsTags
[redigera] Makron för automatisk insättning av vanliga element
OBS Denna kod är alltför "långnivå" och kan ersättas med TEMPO-macron (http://www.emacswiki.org/cgi-bin/emacs-en/TempoMode)
Följande kommando körs med META+x
(defun c-make-section()
(interactive)
(let (s)
(setq s (read-string "Section name: "))
(insert "/")
(dotimes (n 60) (insert "*"))
(newline)
(dotimes (n (- 30 (/ (length s) 2)) ) (insert " "))
(insert s)
(newline)
(dotimes (n 60) (insert "*"))
(insert "/")
(newline) (newline)
)
)
(defun c-make-for()
(interactive)
(let (iname lim)
(setq iname (read-string "counter name: "))
(setq lim (read-string "limit: "))
(indent-according-to-mode)
(insert (concat "for (int " iname "=0; i < " lim " ; ++i) "))
(c-insert-brac)
)
)
(defun c-make-main()
(interactive)
(insert "int main(int argc, char * argv[]) {")
(newline)(newline)
(insert "}")
(previous-line)
(indent-according-to-mode)
)
(defun c-insert-brac()
(interactive)
(insert "{")(indent-according-to-mode)
(newline)
(newline)
(insert "}")
(indent-according-to-mode)
(previous-line)
(indent-according-to-mode)
)
(defun c-insert-comment()
(interactive)
(insert "/* */")
(backward-char)
(backward-char)
(backward-char)
)
(defun c++-insert-comment()
(interactive)
(insert "// ")
)
(defun c++-make-class()
(interactive)
(let (name)
(setq name (read-string "Classname: "))
(insert (concat "class " name " {"))(indent-according-to-mode)
(newline-and-indent) (insert "public:")(indent-according-to-mode) (newline-and-indent)
(insert (concat name "();")) (newline-and-indent)
(insert (concat "~" name "();")) (newline-and-indent)
(insert "};")(indent-according-to-mode)
)
Ovanstående funktioner kan kopplas till valfria tangenter. Undertecknad använder
(defun c-hooks()
(local-set-key [(meta ?1)] 'c-insert-comment)
(local-set-key [(meta ?4)] 'c-make-section)
(local-set-key [(meta ?7)] 'c-insert-brac)
)
(defun c++-hooks()
(c-hooks)
)
(add-hook 'c-mode-hook 'c-hooks)
(add-hook 'c++-mode-hook 'c++-hooks)
[redigera] CEDET/ECB/SEMANTICS
Med dessa paket förvandlas Emacs till en modern IDE med code/classbrowser och intelligent autocompletion. Dessvärre fungerar det sällan till 100% och söker man en riktigt bra fri IDE för just C++ så tvingas undertecknad rekommendera Eclipse eller Netbeans.
[redigera] Clang completion mode
Nytt, väldigt snabbt och välfungerande mode som använder clang för att analysera C/C++ och tillhandahålla autocompletion. Betydligt bättre och mycket lättare att installera än Semantics
https://llvm.org/svn/llvm-project/cfe/trunk/utils/clang-completion-mode.el
[redigera] Flymake - automatisk syntaxkontroll under tiden man skriver koden
Användare av IDE:er som Netbeans och Eclipse brukar uppskatta den automatiska syntaxkontroll som körs medan man skriver koden. Ett sådant system kan underlätta mycket då man slipper kompilera om manuellt för att hitta småfel.
Flymake är ett tillägg till Emacs som ger denna funktionalitet till vår favoriteditor. Det stödjer i teorin alla möjliga programmeringsspråk men jag har bara testat det för C/C++/Python. För att använda det för C/C++ behöver man skapa ett nytt target i sin make-fil "check-syntax". Detta kommer byggas om och om igen under tiden man skriver koden. Slå på flymake med META + "x" och skriv "flymake-mode".
För att få stöd för python krävs lite mer jobb, se http://www.emacswiki.org/cgi-bin/wiki/PythonMode
[redigera] "Man kan aldrig få för mycket whitespace?"
För att automatiskt rödmarkera onödiga blanktecken i slutet av en rad lägg in följande i ~/.emacs. För att slå av och på läget trycker man CTRL + c följt av e.
(defun toggle-trailing-whitespace-display ()
"Toggle the display of trailing whitespace, by changing the
buffer-local variable `show-trailing-whitespace'."
(interactive)
(save-excursion
(if show-trailing-whitespace
(setq show-trailing-whitespace nil)
(setq show-trailing-whitespace t))
(force-window-update (current-buffer)))
(message (concat "Display of EOL spaces "
(if show-trailing-whitespace
"enabled" "disabled"))))
(setq-default show-trailing-whitespace t)
(global-set-key "\C-ce" 'toggle-trailing-whitespace-display)
[redigera] MATLAB/Octave
[redigera] Färgmarkera automatiskt rader som "ekar"
http://www.emacswiki.org/cgi-bin/wiki/Echoline
[redigera] Ändra standardkommentartypen för Octave-mode till MATLAB-stil
(defvar octave-comment-char ?%
"Character to start an Octave comment.")
[redigera] Sätt octave-mode som förvalt för m-filer
(setq auto-mode-alist (cons '("\\.m\\'" . octave-mode) auto-mode-alist))
[redigera] Python
Vill du koda python rekommenderas Flymake som finns beskrivet ovan. Ytterligare ett mycket trevligt tillägg är rope http://rope.sourceforge.net/ropemacs.html som gör Emacs till en förstklassig Python-IDE, med funktioner som autocompletion, refactoring och snabb tillgång till klassdokumentation.
Vanligen så scriptar man Emacs med LISP, men via modulen PyMacs så kan man också använda Python. Följande exempel visar hur man slår samman en lista skapad i LISP med en skapad i Python
(require 'pymacs)
(setq v '(1 2 3))
(setq v2 (append v (pymacs-eval "[4, 5, 6]")))
[redigera] Ruby
Vill du koda Ruby (on rails) ska du titta här http://www.hyperionreactor.net/node/43
[redigera] Ta bort överfördiga blanktecken
META + x, skriv "picture-mode", tryck CTRL + c två gånger.
[redigera] Ta bort överflödiga blanktecken vid sparning
När man programmerar är det lätt att få in några extra mellanslag här och där. Dessa resulterar dock i ganska fula patchar ifall man versionshanterar koden. Ett sätt att undvika problemet är att beordra Emacs att radera alla onödiga blanksteg vid sparning
(add-hook 'before-save-hook 'delete-trailing-whitespace)
[redigera] Emacs standing alone on a Linux Kernel
Folk säger att Emacs är som ett eget operativsystem och faktiskt, med Linuxkärnan i botten så är det tydligen möjligt :) Jag har inte testat själv, det vore kul att prova i tex. Qemu http://www.informatimago.com/linux/emacs-on-user-mode-linux.html
[redigera] Externa länkar
- GNU Emacs hemsida
- XEmacs hemsida
- Emacs Wiki En enorm informationsbank om Emacs.
- Lathund för Emacs
- Emacs för Mac OS X
- En introduktion till Emacs (ljudspår) (presentation given av Kristian under Hack-A-Ton 18 Nov 2006)
- Mycket bra "tips och tricks"-sida kring emacs
- En mycket bra guide till emacs med många bra figurer och exempel












