TECO-KURS Pär Emanuelsson Det här är första delen i en Teco-kurs, som jag tidigare har hållit på Tekniska Högskolan i Linköping vid två tillfällen. Det blir två delar till, som kommer i senare nummer av GARB. Kommentarer mottages tacksamt. Konventioner I den här skriften används 'kommando', 'instruktion' och 'funktion' som beteckningar för samma sak, även om det ibland är lite felaktigt. Teco-kommandon innehåller ofta kontrolltecken och de får inte förväxlas med "kontrolltecken" som fås genom att trycka på tangentbordet. Kontrolltecken skrivs som ^A och motsvarande tangent som C-A. Ett annat tecken som är otroligt vanligt är escape, som skrivs $. Överallt där ett $-tecken finns antas att det är ett escape-tecken. I annat fall anges det speciellt. Teco gör ingen skillnad på små och stora bokstäver. Jag kommer ändå att tillämpa en viss notation för läsbarhetens skull, men det är alltså valfritt. Man behöver normalt inte heller ha mellanslag någonstans, även om det är bra för läsbarheten. Det samma gäller "antal kommandon per rad". Operatorer De vanliga aritmetiska operatorerna finns i Teco, dvs '+ - * /'. De arbetar bara på heltal och uttryck beräknas från vänster till höger. Vill man ändra det, kan man använda parenteser, '( )', precis som vanligt. Parenteser har även en vidare användning: man får nämligen skriva godtyckliga sekvenser av kommandon innanför parenteser, men det återkommer vi till senare. Datatyper Det finns i princip endast två datatyper i Teco: Skrivs: Tal 12345 Sträng Hejsan$ Tal skrivs alltså som vanligt som en följd av siffror. Endast heltal existerar. Strängar skrivs som en följd av (nästan) godtyckliga tecken, men avslutas alltid med ett escape-tecken, $. I strängar sparas tecknen precis som de står. dvs versaler och gemener spelar roll. Datastrukturer Det finns några olika typer av data- eller lagringsstrukturer i Teco: Q-register a-z 0-9 . .. (Q-vektorer) Variabler Antal Rader$ Buffert Q-register kan ses som en sorts enkla minnen, ungefär som i en räknedosa. Namnet på ett Q-register består av ett tecken, antingen en bokstav a-z eller en siffra 0-9. Namnet kan också inledas med en punkt. Dessa Q-register används för Emacs interna behov och vi kommer i kontakt med några av dem lite senare. Namnet kan också inledas med två punkter. Dessa Q-register används för Tecos interna behov. Alla Q-register existerar och behöver inte deklareras på något sätt. Benämningen "Q -register a" brukar man förkorta till "Qa". Det finns också möjlighet att bygga upp en vektor i ett Q-register. Q-registret kallas då för en Q-vektor. Q-vektorer används dock sällan och måste dessutom deklareras. Därför är det satt inom parentes. Variabler är något som man har hittat på för att få lite mer flexibilitet. Variabler kan innehålla flera ord och konventionen är att varje ord ska ha stor första bokstav. Variabelnamn avslutas med escape, precis som vilken annan sträng som helst. De flesta operationer som går att göra på Q-register går också att göra på variabler. Variabler måste dock skapas "manuellt". Buffert är en viktig konstruktion. I princip all texthantering sker i en buffert. Man kan ha flera buffertar, men endast en åt gången är aktuell och kan manipuleras. Kommandon Teco-kommandon har följande syntax: m,n sträng1$sträng2$sträng3$...strängN$ "m" och "n" är två parametrar. "m" kallas för "prekommaargument" och "n" kallas "postkommaargument". dessa argument kan antingen vara tal eller strängar. " < komm > " står för ett Teco-kommando. Dessa har normalt 1-2 tecken. Dessutom finns möjligheten att skicka med ett godtyckligt antal strängargument, sträng1-strängN, åtskilda med escape. Det aktuella Teco-kommandot väljer själv vilka argument det vill läsa och kan också testa om ett visst argument existerar. Modifierare De två tecknen ":" och "@" (kolon och kanelbulle) har en speciell betydelse. De modifierar nämligen kommandon. Antingen ett, eller båda, kan användas och de sätts in mellan postkommaargumentet och kommandonamnet. Exempel kommer lite senare. Några grundläggande kommandon U Tilldela Q-register. Ex: 1 Ua ( a := 1 i Pascal ) Q Hämta Q-register. Ex: Qa - Qb Uc ( c := a - b ) Variabler kan också hanteras med ovanstående kommandon, fast man skriver då ett $ även före variabelnamnet. Ex: 25 U$Antal Rader$ I Lägg in text IHejsan$ Lägger in texten Hejsan bufferten vid markörens position. :IaHejsan$ Lägger in Hejsan i Q-register a (Qa) i stället för i bufferten. Ett exempel på hur :-modifieraren kan fungera. Ett speciellt Q-register är '*', som betyder att texten i stället skickas som argument till nästa kommando. Ex: :I*Hejsan$Uc Betyder exakt samma som :IaHejsan$ G Lägg in innehållet i Q-register i bufferten. Ex: Ga Bufferten Bufferten är alltså mycket central i Teco. Det finns många redigerings-kommandon med stor flexibilitet som arbetar på bufferten. Standardmetoden om man t.ex. vill ändra på innehållet i ett Q-register är att skapa en ny buffert, lägga in Q-registret, redigera och sedan skriva tillbaka tillbaka till Q-registret. Först finns det några viktiga värden: B Returnerar positionen för första tecknet i bufferten. Detta värde är normalt 0. . Aktuell position, dvs där vi ser markören på skärmen. Z Sista tecknet i bufferten. nJ Flyttar aktuell position (och markören) till tecken nummer "n". BJ flyttar alltså till början av bufferten. ZJ till slutet. nR Flyttar vänster "n" steg. 5R = > fem steg till vänster. nC Flyttar höger "n" steg. 2C = > två steg till höger. En viss redundans föreligger här, eftersom -2R är exakt samma som 2C, etc. nL Flytta till början på rad "n" nedåt. 0L = > början på aktuell rad. 1L = > början på nästa rad. -1L = > början på föregående rad. n:L Flytta till slutet på rad "n"-1 nedåt. 1:L = > slutet på aktuell rad. nD Radera "n" tecken till höger om aktuell position. 5D = > radera fem. -1D = > radera ett tecken till vänster. Texten skjuts automatiskt ihop. Inga tecken sparas heller i nån "killbuffert" eller liknande, som vi är vana från Emacs. n.mK Radera tecknen "n" t.o.m. "m" i bufferten. Dessa teckenpositioner är absoluta och oberoende av var aktuell position finns. 5,10K raderar alltså tecknen 5-10 i bufferten. Ingen raderad text sparas. n,mX Kopierar tecknen "n" t.o.m. "m" till ett Q-register. 10,13Xa = > lägg in tecknen 10-13 i Qa. Ingen text raderas. Positionerna är absoluta som för K-kommandot. Nu verkar det kanske krångligt att behöva använda absoluta positioner för att referera till en teckenföljd. Men det finns en mängd kommandon som genererar absoluta positioner som sedan kan användas som argument till kommandon som vill ha absoluta positioner. Ett exempel är FW, som returnerar två parametrar som anger var nästa ord finns. Det kan då t.ex. användas som: FW K = > radera nästa ord. FW Xa = > kopiera nästa ord till Qa. Loop I Teco finns också en repetitionsstruktur: < ...> Bildar en repetition. "..." motsvarar en följd av valfria kommandon. Om inget argument finns blir det en oändlig repetition. Annars kan man ange t.ex. 5< ... > = > repetera fem gånger. n; Avbryter loopen, om n > = 0. Som ett litet övningsexempel kan vi ta den situationen att vi har fått en stor logfil från nåt jobb. För hela filen gäller att de första 15 tecknen på varje rad är skräp, som vi vill ta bort. Om vi har filen i en buffert, skulle vi kunna skriva följande kommandosekvens i Teco: BJ < 15D 1L .-Z; > Först hoppar vi till början av bufferten. Sedan ska vi repetera över alla rader i bufferten. Vi tar bort 15 tecken till höger och hoppar sedan till början på nästa rad. Vi måste också avbryta repetitionen när vi har kommit till slutet på bufferten. Det gör vi genom att jämföra aktuell position, ".", med sista positionen i bufferten, "Z". Genom att subtrahera dem från varandra får vi ett tal som normalt är mindre än noll. Men när vi kommer till sista positionen blir "." = "Z" och då avbryter ";" repetitionen. Val Det finns också en konstruktion för val i Teco. Syntaxen är: n " v ... ' Här är "n" ett argument som vi vill testa. "v" är ett villkor. "... " är en följd av kommandon som ska utföras om villkoret är sant. Villkor är bl.a. (det finns fler): Testar: E = 0 N skilt från 0 G >0 L <0 Det finns också en "else"-gren som ser ut: "# ...' Ett komplett exempel kan se ut: Qa "E 1L' "# 5D' Om innehållet i Qa är lika med noll flyttas positionen till början på nästa rad. Annars tas fem tecken bort till höger om aktuell position. Villkorssatser får nästlas. Det här var första lektionen i Teco. Nu är ni förstås sugna på att prova själva? I Emacs finns något som kallas minibuffert och som fås med M-Altmode, dvs två tryck på "ESC". I minibufferten kan man skriva Teco-kommandon och dessa kommer att utföras när man lämnar minibufferten, genom två tryck på "ESC". Det finns dåligt med nybörjardokumentation av Teco. På filen INFO:TECO.PRIMER finns dock vissa grundläggande kommandon beskrivna. Dessutom finns hela Teco-manualen "on-line" i Emacs, genom kommandot C-_ T, dvs hjälptecknet och ett T. Prova! I Linus-KOM finns också ett Emacs-möte. Välkommen med frågor och Happy Hacking! /Pär : som returnerar vissa