Bakåt Framåt Innehåll

6. Svenska tecken och andra tangenter

Linux är fortfarande inte ett plug and play system. För att få en fungerande miljö att arbeta i krävs en hel del eget konfigurerande. Till exempel för att få svenska tecken att fungera. Det finns flera skäl till varför svenska tecken inte är så givet på Linux.

Linux är ett unix-liknande system. Som sådant är det arvtagare till den ursprungliga Unix och dess beroende av programmeringsspråket C. Unix skapades i USA i slutet av 1960-talet av Ken Thomson och Dennis Ritchie Unix på en PDP-7 som stod och skrotade i ett hörn på Bell Labratories. I början på 1970-talet skapade de också programmeringsspråket C och skrev om Unix i det språket. Men eftersom det var i Amerika fanns inga behov av alla dessa konstiga tecken som till exempel de europeiska språken är så fulla av, därför räckte det med att Unix och C klarade av att hantera 7 bitars ascii, det vill säga 128 tecken från a-z, siffror och ytterligare några tecken.

När Linus skrev Linux gjorde han det med ett amerikansk tangentbord och inte ett finsk. På så sätt har den gamla 7-bitars-begränsningen levt vidare.

För att svenska tecken ska fungera krävs emellertid 8 bitar. Det finns numera en standard för detta, iso 8859-1. Det räcker emellertid inte med att ändra på själva teckenuppsättningen, eller tangentbordet i Linux för att få 8-bitar. Många program klarar nämligen inte 8 bitar hur som helst. En del gör det, andra kräver speciella instruktioner medan ytterligare andra inte klarar det alls.

Här ska omedelbart ett förbehållande göras. När man startar Linux (eller vilket annat unix-system som helst) så är det inte så att det användar gränssnitt man möter är en del av själva operativsystemet. I stället hamnar man i ett så kallat skal. Detta är ett program i sig själv som hjälper användaren att ge kommandon till själva operativsystemet och till andra program. Det finns en rad olika skal. Med RedHats distribution, som jag själv använder och som är grunden i denna manual, är skalet Bash det man hamnar i med automatik.

Jag kommer därför nedan endast ägna mig åt bash. Andra skal kräver en något annan syntax. För tillfället utgår jag ifrån att den som medvetet valt ett annat skal än bach vet vad han eller hon gör och behöver därför ingen hjälp.

(Du kan kolla vilket skal du kör genom att skriva

env | grep SHELL

på kommandoraden och trycka på return. Om det står /bin/bash så är det inget problem. Vilket skal du kör anges i filen /etc/password. Vill du ändra skall kan du ändra skal i den filen.)

6.1 Svenskt tangentbord

Det första man måste lösa för att kunna använda svenska bokstäver är att ha rätt tangentbord specificerad i Linux. I de flesta installationer har du redan gjort ditt val. I gamla Slackware valde man företrädesvis fi-latin1.map. I RedHat 3.03 kan man också välja se.latin1.map.

Om det här ändå skulle vara ett problem, om du till exempel valt fel, måste du tala om för Linux vilket tangentbord som ska användas varje gång det startar.

Det är i sig inget svårt, men kan ändå ställa till en del problem därför att de utvecklats åtminstone två standarder för hur själva scripten för uppstarten ska se ut.

När Linux startar tar den hjälp av filen /etc/inittab för att avgöra hur dess initialisering ska göras. I den hänvisas i sin tur till /etc/rc.d/rc.sysinit.

I den äldre (Slackware) varianten finns sedan några filer i biblioteket /etc/rc.d som sköter mer specifika initialiseringar. Troligtvis ligger initialiseringen av tangentbordet i rc.local eller i /etc/rc.d/rc.keymap. Om du har svårt att hitta vilken fil du måste gå in i kan du köra kommandot:

grep keytables *

(du måste då befinna dig i /etc/rc.d)

När du hittat rätt fil ändrar du bara på tangentbordsmappningen.

RedHat använder i stället ett System V specifikt sätt att starta upp systemet. Vi kan här inte gå in på alla dess detaljer. Det räcker med att konstatera att utbytesordet bestäms av vad som står i filen /etc/sysconfig/keyboard. Där bör du ha följande rad:

KEYTABLE="/usr/lib/kbd/keytables/se-latin1.map"

Nu kan du boota om datorn:

shutdown -r now

Om du inte känner för det finns det andra metoder.

En variant är att använda det kommando som Linux själv använder för att ladda tangentbordet, nämligen loadkeys:

/usr/bin/loadkeys /usr/lib/kbd/keytables/se-latin1.map

Den räcker för vårt syfte här. Nu är det dags att se till att man även kan använda svenska tecken på systemet.

6.2 Svenska tecken i bash och X

Enligt gammal sed så hanterar inte ens själva drivrutinerna för att driva en terminal 8 bitar. Det säjs att Linux numera inte lider av detta problem. Själv har jag emellertid lagt in den kod som man normalt använder för att göra det möjligt för teminalen att hantera 8 bitar.

Innan vi går vidare måste ytterligare något sägas om bash. Nästan alla program på Linux kan antingen konfigureras på en global nivå - det vill säga: förändringarna gäller alla på systemet - eller på användarnivå, alltså berör de bara den specifika användaren. Konfigurationsfilerna för hela systemet ligger oftast i /etc och olika underbibliotek, medan konfigurationsfilerna för varje användare ligger i dennes hembibliotek, tex /home/peter och föregås av en "." , alltså /home/peter/.konfigfil. I fortsättningen använda $HOME för att beteckna användarbiblioteket. Det är en miljövariabel som innehåller "vägen" (path) till den aktuella användarens hembibliotek.

I bash innebär det att man någonstans högt upp i /etc/profile eller $HOME/.bash_profile lägger in följande sekvens:

tty -s
if [ $? = 0 ]; then
        stty cs8 -istrip -parenb >&0
fi

För att underlätta användning av flera olika språk vid programmering finns något som kallas för locales. Dessa är en uppsättning språkliga och kulturella regler, från svenska tecken till myntvalörer och tid. För att få svenska tecken att fungera i bash (och i xterm) behöver man därför sätta en av dessa locales, nämligen LC_CTYPE, som hanterar tecken. Lägg in:

export LC_CTYPE=iso8859-1

i profile-filen

Eftersom vi ändå håller på och rotar i bash konfigurationsfiler kan vi lika gärna lägga till ännu en rad, som egentligen är specifikt för ett programm. Less är ett program som är bra att använda för att läsa textfiler. För att det ska fungera med svenska tecken måste man emellertid sätta en av dess miljövariabler till 8 bitar:

export LESSCHARSET=latin1

Vi bör också se till att en annan konfigurationsfil får en del tillsyn. Den är inte specifik för bash, men den bestämmer beteendet hos en hel del radbaserade program som man kör från bash. Det finns nämligen något som heter readline-lib. Det är en uppsättning rutiner som är till för att man ska kunna editera själva kommandoraden i några radbaserade kommandon, så som ftp, telnet och talk. Säg att du bara skriver ftp. Då kommer du till ftp-s eget kommandoskal där du kan ge ftp-specifika kommandon till ftp. Tex

ftp
>open foo.com

Du öppnar alltså en förbindelse med foo.com. Men säg att du skrev fel och ville ändra. Du behöver kort sagt att någon form av editeringskommandon är tillgängliga. De är vad readline-rutinerna är till för. Deras beteende styrs av en konfigurationsfil som heter .inputrc. Tyvärr vet jag inte hur man lägger den för global tillgång.

För att readline-rutinerna ska funka med svenska tecken krävs följande rader i $HOME/.inputrc

set meta-flag on
set convert-meta off
set output-meta on

Inputrc kan innehålla mycket mer. Jag har därför lagt upp en fil med en hel rad fördefinerade funktioner, som du kan ta hem och pröva.

Nu borde ju det mesta vara frid och fröjd. Det är det emellertid inte, särskilt om man vill använda X-windows. Därför att X använder en egen tecken-uppsättning. Kör man X rakt av försvinner både svenska tecken och en hel rad med andra tecken, företrädesvis sådana man når genom AltGr. Hur göra?

Har du skaffat RedHats officiella version följer MetroX med. Om man konfigurerar den med hjälp av det X-baserade programmet kan man välja svensk tangentbord. Det funkar nästan alltid.

Men många gånger fungerar det inte att använda MetroX. Kanske har man den inte, kanske stödjer den inte ens skärmkort. Därför är det bra att veta hur man löser svenska tangenter även i XFree86.

Man behöver i praktiken då göra två saker. Dels skaffa sig en försvenskad Xmodmap. Dels se till att AltGr-knappen fungerar.

En försvenskad .Xmodmap kan man ladda hem här. Den ska ligga antingen i hembiblioteket eller i /etc/X11/xinit/. Tex

cp xmodmap.se $HOME/.Xmodmap

En varning är dock på plats. Den kan innebära en del problem. Särskilt partiet som definerar AltGr, knappen. Prova med att ta bort de raderna. Xmodmap kan emellertid vara bra att ha en till hands. För om några tangenter krånglar kan man definiera dessa själv.

Av någon anledning krånglar tex knappen med tilde för mig. Genom att ha följande rad i $HOME/.xsession har det ordnat sig:

xmodmap -e "keycode 35 = diaeresis asciitilde asciicircum"

Har man således krångel med någon tangent kan man lokalisera hur den ska definieras i den svenska xmodmapen och lägga in en rad i .xsession. (.xsession är oftast en symbolisk länk till .Xclients, den behövs om man använder xdm (X display manager - mer om det i avsnittet om X-windows)).

Så var det AltGr. Jag måste erkänna att det är länge sedan som jag körde XFree86 i den officiella versionen. Så detta recept är inte bombsäkert. Men i /usr/X11/lib/X11/XF86Config finns följande rader:

#    LeftAlt     Meta
#    RightAlt    ModeShift
#    RightCtl    Compose
#    ScrollLock  ModeLock

Prova med att ta bort kommentar-markören framför RightAlt (alltså #). Tillsammans med Xmodap bör detta funka.

I XFree86s senaste betareleaser finns ett nytt konfigurationsprogram, XF86Setup. Med hjälp av det kan man definiera tangentbordets beteende. På följande vis ser det relevanta avsnittet ut i /etc/XF86Config:

Section "Keyboard"
   Protocol        "Standard"
   XkbRules        "xfree86"
   XkbModel        "pc102"
   XkbLayout       "se"
   XkbVariant      "nodeadkeys"
EndSection

Nu bör även X fungera med svenska tecken.

6.3 Program som behöver hjälp på vägen

Som redan antytts hjälper det inte alltid med de allmänna konfigurationerna. Många program behöver sina egna specifikationer. Vi går här igenom några stycken. Det speciella med dem är att jag använder dem och därför tvingats fixa dem. Det finns andra program det också är problem med, jag lämnar emellertid dem åt sidan så länge.

xterm

Eftersom denna manual går ut på att skapa en fungerande arbetsstation med X, måste vi så klart fixa till xterm först. Det bästa med xterm är dock att man för det mesta inte behöver göra någonting. Det kan emellertid vara bra att känna till hur man ska gå tillväga om 8 bitar inte redan är inställt på rätt sätt.

I princip alla program skapade för X går att konfigurera ut i det oändliga. Det beror på att X-windows arbetar med något som heter resurser, och som går att sätta specifik för varje program. De globala resurserna sätts i en rad filer som ligger i /usr/X11/lib/X11/app-defaults/. Men det går också att göra så att programmen beter sig på ett speciellt sätt enbart för en speciell användare genom att lägga in olika definitioner i $HOME/.Xdefaults

Börja med att testa om xterm fungerar med svenska tecken. Funkar det? Bra, gå vidare. Inte? Gör så här. Lägg följande rader ui.Xdefaults

XTerm*eightBitInput: true
XTerm*eightBitOutput: true

emacs

Emacs måste förstås funka med svenska bokstäver, hur skulle livet annars se ut? Visst funkar det, men bara om man vidtar vissa åtgärder. Emacs har förstås en egen fil för sådana åtgärder. Antingen /usr/emacs/site-lisp/default.el eller $HOME/.emacs. Där ska du kopiera in följande rader:

;; ISO Latin 1 support

(standard-display-european t)
(require 'iso-insert)
(require 'iso-syntax)
(standard-display-8bit 160 255)
(set-input-mode (car (current-input-mode)) (nth 1 (current-input-mode)) 0)

Sedan funkar det. Hurra!

pine

Förstås måste detta suveräna mail-program funka med 8-bitar. Det enklaste sättet är att helt enkelt starta pine. Gå till Setup och där välja config och leta reda på raden där det står character-set och ändra det till iso-8859-1

character-set = iso-8859-1

Pine fungerar emellertid inte med 8-bitar i subjec-raden. Leif Erlingsson (leif@lege.com) har skrivit ett några patchar till Pine 3.95 så att den fungerar med svenska tecken i subject-raden. Dessutom kan man i den mecka tämligen fritt med t.ex reply-to. Väl värt att ha. Jag har lagt upp en binär som Leif kompilerat. Försök inte om du inte har ELF.

Talk och Ytalk

Talk är verkligen trist att köra när svenska tecken inte funkar. Annars är det ju ett toppenprogram. Christer Weinigel (wingel@signum.se) har emellertid patchat både talk och ytalk så att de funkar med svenska bokstäver. Jag har lag upp de binärer han kompilerat.

Installation av Pine, Talk och Ytalk.

Min rekomendation är att du packar upp dem på något säker ställa och kopierar binärerna för hand till /usr/bin/ och pines konfigfil till /usr/lib.

In bin flyttar du sedan de gamla binärerna. Tex

mv pine pine.old 

Och sedan gör du en symbolisk länk. Tex

ln -s pine-8bit pine

sendmail

När vi nu ändå håller på med posten är det lika bra att kolla om sendmail har 8-bitar påslagen. Sendmails konfigurationsfil heter /etc/sendmail.cf. Innan du över huvud taget rör den bör du skapa en backup-kopia.

cd /etc
cp sendmail.cf sendmail.cf.funk

Kolla sedan om det ser ut så här någonstans i sendmail.cf:

###############
#   Options   #
###############

# strip message body to 7 bits on input?
O SevenBitInput=False

# 8-bit data handling
O EightBitMode=pass8

Se till att det gör det annars.

telnet och rlogin

Även om det finns X-baserade program för att köra telnet så visar det dig på något sätt att man jämnt använder de radbaserade versionerna i ett xterm-fönster. Åtminstone gör jag det. Dilemmat med dessa och rlogin är att de inte automatisk tar över den fungerande miljön hemifrån. Man måste helt enkelt säga till dem att inte ta bort den åttonde biten genom att starta dem med vissa kommando-argument.

telnet -L
rlogin -L
rlogin -8

Personligen använder jag ofta telnet för att skriva saker på andra system, och då behöver jag svenska tecken. Det vore ju därför skönt med ett lite kortare kommando. Det går att ordna. I bash kan man ange alias för kommandon man använder mycket. Det gör man i antingen /etc/bashrc eller $HOME/.bashrc. I min har jag lagt in bland annat:

alias telnet="telnet -L"

Ett varningens ord måste emellertid utfärdas. Alla system gillar inte när man loggar in med dessa alternativt satta till rlogin och telnet. Sun-maskiner är i själva inloggnings-proceduren allergiska mot telnet -L, return-knappen slutar funka. Använd då istället <cntr>-j, så brukar det fungera.

6.4 Andra tangenter

Nej, jag kommer faktisk bara skriva om en tangent, ett notoriskt problem-barn. Nämligen backspace. De allra flesta är tämligen vana, både från pc och mac, att om man trycker på den stora tangenten uppe till höger med en pil åt vänster, alltså backspace, så raderas tecknet som står precis till vänster om cursorn. Så är det tyvärr inte alltid i Linux, eller Unix. Skälen kommer djupt ur historiens mörker.

När Unix började levereras var inte en fullfjädrad dator på varje mans skrivbord något särskilt öppet alternativ. Det var för dyrt helt enkelt. I stället kopplade man upp bara en skärm och tangentbord - en så kallad (dum) terminal - till en central dator, en server. En hel massa terminaler kunde och kan fortfarande kopplas till en och samma unix-server.

Den ursprungliga terminalen hette DEC VT100 och på den fanns ingen backspace-tangent, bara en tangent som heter delet (den finns vanligtvis också på pc-tangentbord, men är mindre och sitter sämre till). Denna tangent kopplades så att den genererade en kod som ledde till att tecknet till vänster raderades (CTRL-H). Med allt fler tangentbord av olika tillverkare uppstod så småningom den stora förvirringen. Nämligen: hur ska den äkta backspace egentligen bete sig?

Trots att terminalen är ett mer eller mindre dött fenomen, särskilt i Linux-världen, styrs fortfarande gränssnittet på skärmen av de gamla terminalernas beteende. Hur dessa ska uppföra sig, det vill säga hur de ska rita upp bokstäver på skärmen, reagera på knapptryckningar, piltangenter och så vidare avgörs av en enorm databas av information om olika former av terminal-gränssnitt, /etc/termcap.

För tex xterms terminalgränssnitt lever den gamla DEC VT100-förvirringen vidare, där är nämligen i orginalutförande backspace kopplat till CTRL-?, i stället för CTRL-H.

För de allra flesta program och tillämpningar spelar inte det där så stor roll. De kringgår helt enkelt problemet genom att intern binda tangenterna på ett mer korrekt sätt.

Nu dyker emellertid våra trasslande readline-rutiner upp igen. Till exempel ftp, telnet och talk är beroende av dessa rutiner. Och readline-rutinerna har inte några egna tangent-bindningar utan använder de som finns angivna för terminalen i /etc/termcap.

Prova till exempel följande, innan du åtgärdat problemet:

ftp
>open foo.bom<BACKSPACE>

Vad händer? Inte raderas det bakåt. I stället händer följande:

>open foo.bom^?

Och du tvingas leta reda på delete-tangenten för att rätta till det hela. Vilket tar onödig tid, och har en tendens att alltid hända igen. Att trycka på backspace sitter liksom i nervsystemet. Vi måste således åtgärda detta.

Det kräver åtminstone tre åtgärder. Det ena är att rätta till ett fel i den svenska tangent-tabellen: /usr/lib/kbd/keytables/se-latin1.map. Börja med att säkerhetskopiera den.

cd /usr/lib/kbd/keytables/
cp se-latin1.map se-latin1.map.bak

Sedan måste du ändra i filen. Backspace-tangenten är tangent 14. Så här ser det ut i orginalfilen:

keycode  14 = Delete           Delete          
        alt     keycode  14 = Meta_Delete

Du ska ändra så att det ser ut såhär:

keycode  14 = BackSpace           BackSpace          
        alt     keycode  14 = Meta_BackSpace

Sedan måste du ladda in den ändrade tangent-tabellen:

loadkeys se-latin1.map

Det räcker emellertid inte. Man måste också ändra terminalens inställningar. Det här lär gå att göra på flera sätt. Efter lång tids letande har jag till slut hamnat i följande hack, som omtalas som "the dirty way". Men - det funkar.

Terminalens inställningar går att ändra med kommandot stty. Med "-a" som argument listar stty terminalens alla inställningar.

stty -a

Om det någonstans står "erase = ^?", då vet du att backspace inte kommer att funka. Alltså måste vi hitta på något sätt att ändra terminalens dåliga inställning. Också då använder vi stty. Vi talar helt enkelt om att erase ska vara lika med ^H (alltså <CTRL>-H) på följande sätt:

stty erase ^H

Ibland kan det vara lite krångligt att få till den tangent-kombinationen. För den betyder i praktiken att man ska trycka ner backspace-tangenten. Och i de flesta sammanhang betyder det att - ja, att man få just en backspace. Därför måste man "citera" nedslaget. På kommandoraden och i editorn vi gör man det så här:

<CTRL>-v-<BackSpace>

Alltså. Tryck ner CTRL och sedan v. Släpp tangenterna och tryck sedan på backspace. I emacs gör man det istället så här:

<CTRL>-q-<BackSpace>

Om du ger kommandot på kommandoraden, så har problemet löst sig. Det är bara det att det endast gäller i det fönster du för tillfället har öppet och bara tills du loggar ut. Vi behöver automatisera omställningen.

Det kan man göra genom att lägga in raden i /etc/profile eller $HOME/.bash_profile. Då körs den varje gång man loggar in.

Detta fungerar tillfredsställande om man kör i en VC, alltås inte i X. Med xterm i X funkar det emellertid inte. Det beror på att /etc/profile och $HOME/.bash_profile enbart körs när man loggar in. Och i X loggar man normalt inte in i ett terminalfönster utan i X i allmänhet. Xterm är därför inget loginfönster, utan enbart ett sätt att arbeta radbaserat. Detta går emellertid att åtgärda. Xterm går att starta som ett loginfönster genom tillägget "-l.s"

xterm -ls

Det innebär således att xterm antar den rätta tangenbindningen för backspace, om man lagt in "stty erase ^H" på rätt ställe.

Det här bör automatiseras så mycket som möjligt. Xterm-fönster öppnar man normalt på tre sätt. (1) vid uppstarten, (2) genom "root menyn" som kommer fram om man klickar på första musknappen i root-fönstret och (3) genom att klicka på xterm-knappen i knapp-menyn (FvwmButtons) som man förmodligen har.

Här får man använda sin egen fantasi och behov. Det första problemet löser man genom att ändra i $HOME/.xsession, t.ex genom att lägga dit föjande rad:

xterm -fg black -bg snow -ls &

De två andra problemen åtgärdar man i fönster-hanterarens konfigurationsfil. Beroende på om man kör fvwm eller fvwm2 heter filerna systemrc respektive .fvwmrc och ligger antingen /usr/X11/lib/X11/fvwm eller /usr/X11/lib/X11/fvwm2. Sök efter xterm i filen och lägg till "-ls" där du vill ha det.

6.5 Andra program?

Det finns förstås en massa andra program som det kan dyka upp problem med. Eftersom jag inte har erfarenhet av mer problem än de ovan redovisade kan jag inte hjälpa till med det. Läs manualsidorna och kolla in dokumentationen som listas nedan

6.6 Litteratur:

Keyboard-HOWTO

Danish-HOWTO (och i norsk översättning)

German-HOWTO (på tyska)

Keyboard setup mini-howto

ISO 8859-1 FAQ


Bakåt Framåt Innehåll