Emacs

LinuxWiki.se

Hoppa till: navigering, sök
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.

Innehåll

[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

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).

Bild:Emgame.png


Bild:Emsurfgame.png

Bild:Emacshot.jpg

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.

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.

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.

Bild:bkillring.png

[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

Ett extremt exempel på emacs förmåga att hantera många fönster och modes samtidigt
Ett extremt exempel på emacs förmåga att hantera många fönster och modes samtidigt

[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()
(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))
)
)
Skriv och markera en text, tex.
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

Bild:numshot.png

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

Bild:amshot.png

[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).

Bild:Auctex.jpg

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.

Bild:Semantics.png

http://cedet.sourceforge.net/

[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

Bild:flymake.png

[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

Den här artikeln är hämtad från http://wiki.linuxportalen.se/index.php/Emacs
Personliga verktyg