Kapitel 9 Versionskontroll och Emacs Det blir två olika ämnen idag. 9.1 Versionskontroll Versionskontrollsystem är system som kan hantera flera olika versioner av dokument. Flera personer kan ändra i dokumenten och det går att få fram vilka tidigare versioner som helst och se vilka ändringar som gjorts när. Det finns flera olika versionskontrollsystem som har olika för- och nackdelar. Ett mycket vanligt är CVS. En fördel med det är just att det används så mycket. I labben ska ni få använda Subversion (SVN) som är ett senare system som är likt CVS men har en del viktiga förbättringar. Några exempel på modernare versionskontrollsystem är Bazaar, Git och Mercurial. Databasen där alla versioner av filerna i ett projekt ligger kallas ett repositorium (repository). Att ta fram filer därifrån kallas att checka ut dessa filer. Då får man en arbetskatalog (working directory) där man kan göra de ändringar man vill. Efter att man gjort en ändring som ska in i projektet så checkar man in den filen igen så hamnar den versionen i repositoriet. Alla versioner som checkats in kan tas fram i efterhand, så man kan be om t. ex. hur en viss version såg ut den 1 april förra året. Ofta går det att nå ett repositorium över nätet så att personer som ska medverka i ett projekt inte behöver ha konto på samma dator. Även om versionskontrollsystem framförallt används för programmering så kan det med fördel användas även i andra sammanhang där flera personer skriver något tillsammans. Figur 9.1: Såna här missöden händer lätt om flera personer kan ändra i samma filer. Även för sådant man skriver själv är det användbart, bland annat för att kunna gå tillbaka till tidigare versioner. 9.1.1 Om flera ändrar samtidigt Om flera personer har skrivrättigheter i samma katalog där de tillsammans sköter några filer blir det lätt olyckor, som i figur 9.1. Att undvika och lösa sådana problem är en av huvudfunktionerna för versionskontrollsystem. I en del versionskontrollsystem så låser man normalt en fil man ska göra ändringar i så att andra inte får göra ändringar samtidigt. 95
9. VERSIONSKONTROLL OCH EMACS I de flesta system nu är det dock oftast inget större problem med samtidiga ändringar. Om en användare gör en ändring i början av en fil samtidigt som en annan ändrar i slutet av samma fil så kan systemet slå ihop dessa ändringar av sig självt. Systemet vet nämligen vilken version av dokumentet som de olika användarna har utgått ifrån. Bara om ändringarna sker på samma ställe behövs hjälp med att reda ut det. Då visar systemet båda versionerna och en människa får reda ut läget. 9.1.2 Grenar (branches) En vanlig lite mer avancerad finess i versionskontroll (som ni inte kommer att använda i labben) är att skapa förgreningar i utvecklingen. Istället för enbart en linjär utveckling mot nyare och nyare versioner kan man även dela utvecklingen i två eller flera grenar med gemensamt ursprung. I programutveckling är detta vanligt för att skilja på olika versioner av ett program. Om man t. ex. har släppt en version 1 och sedan mitt i arbetet på en mycket ändrad version 2 märker av en viktig bugg i version 1 som man borde ändra på, så kan man gå tillbaka till version 1 och knoppa av en gren där man bara gör den ändringen och släppa den fixade versionen där som version 1.1 eller nåt sånt. Det är också vanligt att ändringar som är till för att lägga till någon viss finess knoppas av i en egen gren. Sen när det delprojektet är klart så slås den grenen ihop med huvudgrenen (stammen, trunk). 9.1.3 Kommandon Oftast är det ett enda kommando med vilket man kan göra allt som ett versionskontrollsystem kan göra, genom att ge det olika argument. För CVS heter kommandot cvs och för Subversion heter det svn, och liknande för andra system. Första argumentet till svn är ett underkommando till det. Med svn help får man hjälp. Men Emacs känner igen vilka filer som tas om hand av Subversion och gör mycket av det där automatiskt åt en, eller med kommandon i en meny Tools Version Control. Man kan använda samma kommandon i Emacs oavsett vilket versionskontrollsystem man använder. Emacs känner igen vilket system som har hand om just dina filer. Ibland används förkortningen VC för Version Control, och det ingår i en hel del namn på Emacskommandon. 9.2 Emacs Det står en hel del om emacs i avsnitt 2.2 på s. 22. Här är några ytterligare delar. På s. 99 100 följer sedan den refcard.pdf som följer med Emacs 1 med tips om kortkommandon och annat. (Men en hel del av dessa är sådana som ni knappast kommer att behöva.) 9.2.1 Kommandon I Emacs finns en stor mängd kommandon som gör olika saker med texten. När man trycker på en tangent i Emacs eller väljer något från en meny så utförs något av dessa kommandon. När man trycker på <home> eller C-a utförs t. ex. ett kommando move-beginning-of-line som går till början av raden och när man väljer Tools Spell Checking Spell-Check Buffer i menyerna utförs ett kommando ispell-buffer. 2 Normalt behöver man inte veta vad dessa namn på kommandona är. När man lär sig att man kan gå till början av raden med C-a så behöver man därför inte lära sig vad det kommando som utförs heter. Men när man vill använda ett kommando som inte finns i menyerna och som det inte finns ett kortkommando för så kan man ändå utföra kommandot genom att använda M-x och sedan ge kommandots namn (följt av RET). I sådana lägen kan man använda TAB för att få komplettering. 9.2.2 Att få hjälp Man kan få hjälp av olika slag i Emacs med olika kommandon som börjar med C-h (där h står för help). I tabell 9.1 visas några av de kommandon som börjar med C-h. För flera av dessa ska man efter kommandot tala om vad man vill ha hjälp med. Efter C-h c eller C-h k får man t. ex. trycka på en tangent för att få fram hjälp om just den. Om man 1 Med fullständig sökväg /local/share/emacs/23.2/etc/ refcards/refcard.pdf 2 Flera gånger i denna text kallas tangenttryckningen för ett kommando det också, så det kan stå»använd kommandot C-a«. Förhoppningsvis ska det inte leda till sammanblandning. 96
9.2. Emacs Tangent Kommando Beskrivning Tabell 9.1: Några C-h-kommandon. C-h c describe-key-briefly Talar om vilket kommando en viss tangent utför C-h k describe-key Talar även om vad detta kommando gör C-h a apropos-command Hittar ett kommando som innehåller något visst i sitt namn C-h i info Går in i Info C-h f describe-function Beskriv ett namngivet kommando C-h w where-is Hitta snabbkommando för ett visst kommando. C-h m describe-mode Beskriver aktuellt Emacs-läge. C-h t help-with-tutorial Lär dig en del Emacs-kommandon. t. ex. undrar vad som händer om man trycker på C-l kan man fråga med C-h k C-l och om man undrar vad kommandot som utförs med C-x C-b heter kan man använda C-h c C-x C-b. Hur fortsätter kommandot? Dessutom kan man använda C-h i ett flerteckenskommando för att se hur det kan fortsätta. Med C-x C-h får man t. ex. veta vad det finns för kommandon som börjar med C-x (så som t. ex. C-x C-f och C-x C-s) och med C-c C-h kan man se vad som börjar med C-c osv. Ofta så visas den hjälp man får fram i en särskild buffert *Help*. Många speciella buffertar i Emacs har sådana namn som börjar och slutar med asterisk. Istället för C-h kan man även använda <f1> som hjälptangent, dvs. funktionstangenten»f1«. 9.2.3 Manualen Det huvudsakliga dokumentationssättet till GNU är Texinfo. Det är ett format från vilket man både kan generera tryckta böcker och datorläsbar dokumentation i Info-format, alltså det som ni såg på på sidan 55. Det som blir en länk i Info-dokumentet blir istället en sidhänvisning i den tryckta boken, osv. Även Emacs är dokumenterat med Texinfo och i Emacs-menyerna finns det ett särskilt alternativ Help Read the Emacs Manual som direkt går till just det Info-dokumentet. (I många fall dessa manualer även på nätet i flera olika format. På http://www.gnu.org/ software/emacs/ finns t. ex. länkar till Emacsdokumentationen.) 9.2.4 Lägen Det som här kallas lägen i Emacs kallas också moder som mer direkt översättning av modes. Emacs använder olika slags lägen för olika slags filer. Det är alltid en major mode och kan även vara flera minor modes som ändrar beteendet på olika sätt. Olika lägen kan ha olika kortkommandon, olika menyer, olika färgläggning av bufferten, osv. Prefixtangenten C-c inleder ofta kommandon som är speciella för olika lägen. (Det har ni sett exempel på t. ex. i LaTeX-läge och HTML-läge.) 9.2.5 Prefix-argument Vissa kommandon i Emacs kräver ett argument som läses in i minibufferten efteråt. Efter C-x C-f får man t. ex. ange vilken fil det är man vill öppna. Det går dessutom alltid ge ett numeriskt prefixargument direkt före ett kommando. Olika kommandon behandlar detta argument på olika sätt. Med M-f går man t. ex. framåt ett ord. Genom att ge ett argument så går man istället fram så många ord. Ett sätt att ge prefix-argument är att trycka på siffror medan man håller Ctrl eller Meta intryckt. Så med M-1 M-2 M-f går man därmed framåt 12 ord. Eftersom själva kommandot innehåller Meta är det mesta praktiskt att använda Meta med siffrorna också denna gång, så behöver man aldrig lyfta på Alt-tangenten. Om man istället skulle gå fram tolv tecken med C-f använder man lämpligen C-1 C-2 C-f istället, så slipper man lyfta på Control-tangenten. I Emacslägen där man inte skriver in text, t. ex. Dired som är läget man får när man öppnar en katalog i Emacs, räcker det med att trycka på siffertangenter utan Ctrl eller Meta. 97
9. VERSIONSKONTROLL OCH EMACS Ett annat sätt är att använda C-u och sen skriva vanliga siffror: C-u 1 2 M-f. Om man ger bara C-u utan några siffror räknas det som 4, och två C-u som 16. Det ger ett enkelt sätt att t. ex.»gå ner några rader«( C-u <down>) eller»gå upp rätt många rader«(c-u C-u <up>). Vissa kommandon bryr sig bara om ifall de får ett argument eller inte, men inte vad argumentet är. Ett exempel är kommandot M-q (fill-paragraph) som bryter om det stycke man står i. Om man ger det ett prefixargument så lägger det dessutom in dubbla mellanslag här och där så att det ska bli en rak högermarginal. När man bara ska ge ett prefixargument vilket som helst och det inte spelar roll vad det är brukar man använda C-u, så t. ex. C-u M-q. Ett annat exempel på det som ni sett var på sidan 52 när ni fick använda C-u C-x =. Själva kommandot där var alltså bara C-x =, men det användes med ett argument för att det skulle bete sig lite annorlunda. 9.2.6 Sökningar Inkrementella sökningar med C-s (framåt) och C-r (bakåt) har ni redan gjort. Om man tar med minst en versal i söksträngen så görs det skillnad på versaler och gemener, men inte annars, så med foo hittar man såväl»foo«som»foo«som»foo«, men med söksträngen Foo hittar man bara»foo«och inte t. ex.»foo«eller»foo«. Som det stod på s. 87 kan man söka efter reguljära uttryck genom att lägga till Meta också, dvs. med C-M-s och C-M-r. 9.2.7 Regionen På sidan 25 stod det om regionen i Emacs. Ett till sätt att markera en region från tangentbordet är att hålla ner skifttangenten medan man förflyttar sig med piltangenterna. Många kommandon beter sig lite annorlunda ifall man har en aktiv markerad region. Kommandot M-$ som du använt för att stavningskontrollera ett ord kontrollerar t. ex. hela regionen om man har en aktiv sådan. Referenskort till Emacs på de två följande sidorna 98
GNU Emacs Reference Card (for version 23) Starting Emacs To enter GNU Emacs 23, just type its name: emacs Leaving Emacs suspend Emacs (or iconify it under X) exit Emacs permanently Files C-z C-x C-c read a file into Emacs C-x C-f save a file back to disk C-x C-s save all files C-x s insert contents of another file into this buffer C-x i replace this file with the file you really want C-x C-v write buffer to a specified file C-x C-w toggle read-only status of buffer C-x C-q Getting Help The help system is simple. Type C-h (or F1) and follow the directions. If you are a first-time user, type C-h t for a tutorial. remove help window C-x 1 scroll help window C-M-v apropos: show commands matching a string C-h a describe the function a key runs C-h k describe a function C-h f get mode-specific information C-h m Error Recovery abort partially typed or executing command C-g recover files lost by a system crash M-x recover-session undo an unwanted change C-x u, C-_ or C-/ restore a buffer to its original contents M-x revert-buffer redraw garbaged screen C-l Incremental Search search forward C-s search backward C-r regular expression search C-M-s reverse regular expression search C-M-r select previous search string M-p select next later search string M-n exit incremental search RET undo effect of last character DEL abort current search C-g Use C-s or C-r again to repeat the search in either direction. If Emacs is still searching, C-g cancels only the part not matched. c 2010 Free Software Foundation, Inc. Permissions on back. Motion entity to move over backward forward character C-b C-f word M-b M-f line C-p C-n go to line beginning (or end) C-a C-e sentence M-a M-e paragraph M-{ M-} page C-x [ C-x ] sexp C-M-b C-M-f function C-M-a C-M-e go to buffer beginning (or end) M-< M-> scroll to next screen C-v scroll to previous screen M-v scroll left C-x < scroll right C-x > scroll current line to center of screen C-u C-l Killing and Deleting entity to kill backward forward character (delete, not kill) DEL C-d word M-DEL M-d line (to end of) M-0 C-k C-k sentence C-x DEL M-k sexp M-- C-M-k C-M-k kill region C-w copy region to kill ring M-w kill through next occurrence of char M-z char yank back last thing killed C-y replace last yank with previous kill M-y Marking set mark here exchange point and mark set mark arg words away mark paragraph mark page mark sexp mark function mark entire buffer Query Replace C-@ or C-SPC C-x C-x M-@ M-h C-x C-p C-M-@ C-M-h C-x h interactively replace a text string M-% using regular expressions M-x query-replace-regexp Valid responses in query-replace mode are replace this one, go on to next SPC replace this one, don t move, skip to next without replacing DEL replace all remaining matches! back up to the previous match ^ exit query-replace RET enter recursive edit (C-M-c to exit) C-r Multiple Windows When two commands are shown, the second is a similar command for a frame instead of a window. delete all other windows C-x 1 C-x 5 1 split window, above and below C-x 2 C-x 5 2 delete this window C-x 0 C-x 5 0 split window, side by side C-x 3 scroll other window C-M-v switch cursor to another window C-x o C-x 5 o select buffer in other window C-x 4 b C-x 5 b display buffer in other window C-x 4 C-o C-x 5 C-o find file in other window C-x 4 f C-x 5 f find file read-only in other window C-x 4 r C-x 5 r run Dired in other window C-x 4 d C-x 5 d find tag in other window C-x 4. C-x 5. grow window taller C-x ^ shrink window narrower C-x { grow window wider C-x } Formatting indent current line (mode-dependent) TAB indent region (mode-dependent) C-M-\ indent sexp (mode-dependent) C-M-q indent region rigidly arg columns C-x TAB insert newline after point C-o move rest of line vertically down C-M-o delete blank lines around point C-x C-o join line with previous (with arg, next) M-^ delete all white space around point M-\ put exactly one space at point M-SPC fill paragraph M-q set fill column to arg C-x f set prefix each line starts with C-x. set face M-o Case Change uppercase word lowercase word capitalize word uppercase region lowercase region The Minibuffer M-u M-l M-c C-x C-u C-x C-l The following keys are defined in the minibuffer. complete as much as possible TAB complete up to one word SPC complete and execute RET show possible completions? fetch previous minibuffer input M-p fetch later minibuffer input or default M-n regexp search backward through history M-r regexp search forward through history M-s abort command C-g Type C-x ESC ESC to edit and repeat the last command that used the minibuffer. Type F10 to activate menu bar items on text terminals.
GNU Emacs Reference Card Buffers select another buffer C-x b list all buffers C-x C-b kill a buffer C-x k Transposing transpose characters C-t transpose words M-t transpose lines C-x C-t transpose sexps C-M-t Spelling Check check spelling of current word M-$ check spelling of all words in region M-x ispell-region check spelling of entire buffer M-x ispell-buffer Tags find a tag (a definition) M-. find next occurrence of tag C-u M-. specify a new tags file M-x visit-tags-table regexp search on all files in tags table M-x tags-search run query-replace on all the files M-x tags-query-replace continue last tags search or query-replace M-, Shells execute a shell command M-! run a shell command on the region M- filter region through a shell command C-u M- start a shell in window *shell* M-x shell Rectangles copy rectangle to register C-x r r kill rectangle C-x r k yank rectangle C-x r y open rectangle, shifting text right C-x r o blank out rectangle C-x r c prefix each line with a string C-x r t Abbrevs add global abbrev C-x a g add mode-local abbrev C-x a l add global expansion for this abbrev C-x a i g add mode-local expansion for this abbrev C-x a i l explicitly expand abbrev C-x a e expand previous word dynamically M-/ Regular Expressions any single character except a newline. (dot) zero or more repeats * one or more repeats + zero or one repeat? quote regular expression special character c \c alternative ( or ) \ grouping \(... \) same text as nth group \n at word break \b not at word break \B entity match start match end line ^ $ word \< \> buffer \ \ class of characters match these match others explicit set [... ] [^... ] word-syntax character \w \W character with syntax c \sc \Sc International Character Sets specify principal language C-x RET l show all input methods M-x list-input-methods enable or disable input method C-\ set coding system for next command C-x RET c show all coding systems M-x list-coding-systems choose preferred coding system M-x prefer-coding-system Info enter the Info documentation reader C-h i find specified function or variable in Info C-h S Moving within a node: scroll forward SPC scroll reverse DEL beginning of node. (dot) Moving between nodes: next node n previous node p move up u select menu item by name m select nth menu item by number (1 9) n follow cross reference (return with l) f return to last node you saw l return to directory node d go to top node of Info file t go to any node by name g Other: run Info tutorial h look up a subject in the indices i search nodes for regexp s quit Info q Registers save region in register insert register contents into buffer save value of point in register jump to point saved in register Keyboard Macros C-x r s C-x r i C-x r SPC C-x r j start defining a keyboard macro C-x ( end keyboard macro definition C-x ) execute last-defined keyboard macro C-x e append to last keyboard macro C-u C-x ( name last keyboard macro M-x name-last-kbd-macro insert Lisp definition in buffer M-x insert-kbd-macro Commands Dealing with Emacs Lisp eval sexp before point eval current defun eval region read and eval minibuffer load from standard system directory Simple Customization C-x C-e C-M-x M-x eval-region M-: M-x load-library customize variables and faces M-x customize Making global key bindings in Emacs Lisp (example): (global-set-key (kbd "C-c g") search-forward) (global-set-key (kbd "M-#") query-replace-regexp) Writing Commands (defun command-name (args) "documentation" (interactive "template") body) An example: (defun this-line-to-top-of-window (line) "Reposition current line to top of window. With ARG, put point on line ARG." (interactive "P") (recenter (if (null line) 0 (prefix-numeric-value line)))) The interactive spec says how to read arguments interactively. Type C-h f interactive for more details. Copyright c 2010 Free Software Foundation, Inc. For GNU Emacs version 23 Designed by Stephen Gildea Permission is granted to make and distribute modified or unmodified copies of this card provided the copyright notice and this permission notice are preserved on all copies. For copies of the GNU Emacs manual, see: http://www.gnu.org/software/emacs/#manuals
Laboration 9: Versionskontroll och Emacs Versionskontroll Gå till din kurskatalog. Du ska där skapa två underkataloger med hjälp av dessa kommandon: svn co svn://stp/ids10/username svn co svn://stp/ids10/alla där username är ditt användarnamn. Du blir tillfrågad om ett lösenord. (Inget kommer att ekas när du skriver in lösenordet.) Det är inte ditt vanliga inloggningslösenord utan ett annat. Just ditt lösenord står av bekvämlighetsskäl i filen /local/svn/passwords/username som bara är läsbar för dig. Kommandona ovan för att checka ut katalogerna var engångsföreteelser. Där behövde du ge adresser till de repositorier som skulle användas, men nu minns Subversion detta. Gå först till den nya katalog som heter som ditt användarnamn. En av filerna där heter foo.txt. Öppna den i Emacs. I informationsraden står det»svn«för att visa att denna fil sköts av Subversion. Använd C-x 5 f i Emacs för att öppna en ny fil ids9.txt i samma katalog för att skriva svaren på följande frågor i. Vad gjorde detta kommando (tydli- Uppgift 9.1 gen)?... is not a version controlled directory.: Varning! Om du får denna varning tillsammans med en fråga om»vc backend«så avbryt med C-g! Då har du försökt checka in en fil någonannanstans än i någon av dina två Subversion-kataloger. Tillbaks till foo.txt. Byt ut ordet»gamla«mot»nya«där och spara. Nu skiljer sig den version du har i din katalog från den incheckade. Använd Tools Version Control Compare with Base Version för att i kompakt form få se skillnaderna. Det viktigaste Emacs-kommandot för versionskontroll är C-x v v för att checka in en fil, så det är det värt att lära sig kortkommandot för. Använd det nu! Innan själva incheckningen sker får du skriva ett loggmeddelande om vad det är för en ändring du gjort. Gör så. Uppgift 9.2 Vad är kortkommandot för att avsluta detta loggmeddelande? Uppgift 9.3 Hur fick du reda på vad kortkommandot var? Kommer du på nåt annat sätt du kunde få reda på det då? Bland relaterade kommandon finns bland annat sådana för att lista en fils historia (logg), ta fram tidigare versioner, med mera. Din fil ids9.txt är inte inlagd i Subversion bara för att den ligger i samma katalog. Lägg in den filen också (trots att du än så länge bara svarat på några få frågor. För detta behöver du göra C-x v v två gånger. Första gången registrerar du filen och andra gången checkas den verkligen in. Gör så! (Loggmeddelandet kan vara tomt om du vill.) När du är klar ska det stå»svn:«med siffror efter i informationsraden. Flytta även dina svar från förra kapitlet till denna katalog under namnet ids8.txt (oavsett om du är klar med den eller inte) och checka in den filen. Eventuella kompletteringar till dessa labbar ska du senare lägga in i dessa filer och checka in. Titta nu i katalogen alla som du också skapade i början av dessa instruktioner. Den skiljer sig genom att där har ni alla rätt att skriva. Gå till den kata- 101
LABORATION 9: VERSIONSKONTROLL OCH EMACS logen och ge kommandot svn update. Ifall någon annan redan har gjort någon ändring så kommer du nu att få filerna där ändrade enligt detta. Uppgift 9.4 Vad gav svn update för resultat? Öppna filen sagobok.txt i den katalogen. Den innehåller början till en sagobok skriven med LaTeX. Prova att TeXa den och se på resultatet med hjälp av C-c C-c ett par gånger. (Om det blir något TeX-fel så är det någon som råkat lägga in något fel. Det fixar nog den personen snart. Då gör du svn update igen för att få den nya versionen.) Det finns en rubrik i filen som heter som ditt användarnamn. Ersätt det som står under rubriken med din saga. Du ska ha en LaTeX-anpassad saga i din fil ids6.tex som du kan kopiera detta ifrån. Prova att det går bra att TeXa utan felmeddelanden efter ditt inlägg och checka sedan in din ändring. Tillbaks till foo.txt: Uppgift 9.5 Använd Tools Version Control Show History för att få se loggen för foo.txt. Hur lyder den? För varje version står det»r«följt av siffror för att visa vilken revidering den versionen hör till. Uppgift 9.6 Vad är det för siffror för den tidigaste versionen av den filen? Hitta ett kommando i Tools Version Control för att visa en annan version och välj den där allra första versionen. (Skriv bara siffrorna utan inledande»r«.) Uppgift 9.7 av denna fil? Så vad stod det i denna första version Checka in din ids9.txt innan du går vidare! Slutar för dagen?: Om du slutar för dagen innan du är klar, så checka in det du har gjort hittills i ids9.txt innan du går! Om du har ändrat saker i din ids8.txt så checka in den också innan du går. Emacs Ta fram hjälp Uppgift 9.8 I detta kapitel stod det att kommandot C-x = beter sig lite annorlunda när det får ett prefixargument. Hur beskrivs den skillnaden i kommandots hjälptext? (Citera!) Ta fram en förteckning med Emacskommandon som innehåller»word«i sitt namn för att hitta kommandon som gör saker med ord. Det står vad kommandona heter och hur man kan utföra dem. (Om det inte går på annat sätt så med M-x.) Ibland finns det flera sätt att utföra samma kommando. Uppgift 9.9 I den förteckning du fått fram nämns backward-word som kan utföras med M-b. Vilka andra tangenter kan man trycka på för att utföra det kommandot? Ta fram kommandon vars namn slutar på»regexp«. Uppgift 9.10 Uppgift 9.11 detta? Hur gjorde du det? Vad visade Emacs för resultat från De flesta av dessa kommandon finns det inte snabbkommandon för, utan det är M-x som nämns för att köra dem, men det finns några undantag som har snabbkommandon. Uppgift 9.12 Ett av dessa undantag är ett kommando för att visa sådant som matchar ett visst reguljärt uttryck på ett visst sätt (med en viss face). Vad heter det kommandot? Uppgift 9.13 Snabbkommandot för det kommandot består av tre delar. Ge de två första delarna och tryck sen på hjälptangenten för att få veta vad det finns för möjliga kommandon som börjar likadant. Hur såg hjälpen du fick då ut? (Alltså innehållet i bufferten *Help* då.) Emacs-kommandot shell finns det inget snabbkommando för, så det får man lov att ge med M-x. Gör så! Detta kör ett skal inne i Emacs. 102
Emacs Uppgift 9.14 Man rör sig runt i bufferten med vanliga förflyttningskommandon som t. ex. <up> och <down>, så dessa fungerar inte som i terminalen så att de tar fram tidigare kommandon. Vad kan man istället ge för kommandon för att få detta? Hur såg du det? Ramar Kommandon som gör saker med ramar (frames) börjar med C-x 5. Ta reda på vad det finns för olika kommandon som börjar med C-x 5 och har ett tecken till. Uppgift 9.15 Vad heter kommandot med vilket man kan öppna en fil i en annan ram som du gjorde tidigare under denna labb? Öppna den nya filen /tmp/fil.txt i en ny ram. Uppgift 9.16 Du har fått ett nytt fönstersystemsfönster. Vad är dess titel? (Det som står på dess översta rad.) Detta hade också gått att använda File New Frame i menyerna till följt av det vanliga kommandot för att öppna en fil i den nya ramen. Kommandot för att ta bort en ram finns även det i Filemenyn. Använd det. I menyn Tools Compare (Ediff) hittar du ett Emacskommando för att jämföra två buffertar. Använd det! (Välj bufferten med den äldsta filen först (A) och sen den nya (B).) Du får en egen liten ram som heter Ediff. De viktigaste kommandona här är SPC (mellanslag alltså) för att gå till nästa skillnad och DEL för att gå till förra skillnaden. Prova att gå fram några steg! Det finns annat att trycka än SPC och DEL och det står hur du kan få hjälp. Uppgift 9.19 Hur många skillnader räknar Ediff med mellan dessa filer? Uppgift 9.20 Vilken tangent kan man använda här för att hoppa till en viss skillnad genom att ange dess nummer som prefixargument? Uppgift 9.21 Uppgift 9.22 Uppgift 9.23 Vad består skillnad nummer 313 av? Vad består skillnad nummer 150 av? Hur avslutar man Ediff? Det finns flera andra Ediff-kommandon som du såg i menyn. Ett ytterligare som av någon anledning inte fanns i menyn är ediff-backup. Ta fram beskrivningen av detta kommando nu när du vet dess namn. Uppgift 9.24 Hur lyder den beskrivningen? Prova detta kommando med dodo.txt. Uppgift 9.17 Vad händer om man på detta sätt försöker ta bort den sista ramen man har kvar? Hur skrev du för att köra detta kom- Uppgift 9.25 mando? Jämföra filer med Ediff /local/kurs/ids/verb.txt har ändrats en del jämfört med motsvarande fil förra året, /local/ kurs/ids09/verb.txt. Du har tidigare stött på skalkommandot diff för att jämföra filer. Nu ska du istället använda ett Emacskommando. Öppna båda dessa filer i Emacs. Uppgift 9.18 Namnet på en buffert i Emacs brukar ju vara som filnamnet. Hur tycks Emacs sätta namn på buffertar när man öppnar flera filer med samma namn? Tangentbordsmakron Med makron kan man»spela in«tangenttryckningar för att sedan upprepa dem flera gånger. Gå till Emacs-dokumentationen i Info (t. ex. med Help Read the Emacs Manual) och välj menyalternativet»keyboard Macros«där. Uppgift 9.26 Så vilken tangent kan du använda för att börja spela in? Uppgift 9.27 Och vilken tangent för att sluta spela in (avsluta definitionen)? 103
LABORATION 9: VERSIONSKONTROLL OCH EMACS Uppgift 9.28 Det finns andra sätt att reda på detta, men slå ändå upp i Info för att se att du kan det också. Kontrollfråga: Vad är det för nummer på detta avsnitt i Info? (De övriga kommandona som har med makron att göra kan du strunta i denna gång.) Kopiera us-states.txt till us-states-9.txt Öppna kopian i Emacs och placera dig först på första raden. Använd nu enbart kortkommandon från tangentbordet för att ändra den raden från 1787-12-07 Delaware till Delaware (1787) genom att»döda«årtalet och sen klistra in det igen på rätt ställe tillsammans med övriga ändringar. (I resultatet är det bara ett mellanslag mellan delstatsnamn och parentes.) När detta går bra så spela in medan du gör det. Stå i början av den första raden som ska ändras och tryck på tangenten för att spela in. Ändra raden som du ska och avsluta genom att placera dig i början av nästa rad och avsluta inspelningen. Nu kan du trycka på den senaste tangenten igen för att utföra samma sak för den raden, osv. för alla rader, så att alla rader kommer att bestå av ett delstatsnamn, ett mellanrum och dess årtal inom parentes. Glöm inte att spara resultatet! Avslutning Checka in ids9.txt igen med dina nya svar. Jag kommer att checka ut den från repositoriet för att titta på den, så det är svaren som är incheckade som jag kommer att se. Du behöver alltså inte skicka några bilagor till Per, men maila honom ändå för att tala om att du är klar med labben. Om du har ändrat saker i din ids8.txt så checka in den också innan du går. 104