# The Linux Keyboard HOWTO

## Andries Brouwer, aeb@cwi.nl
v2.5, 27 sierpień 1997
Wersja polska: Gwidon S. Naskrent naskrent@hoth.amu.edu.pl
v1.1, 29 X 1997

Notka ta zawiera informacje na temat klawiatury i konsoli w Linuxie, oraz używania znaków spoza ASCII. Opisuje ona wersję 2.0 Linuxa. Dokument ten został napisany w standardzie ISO-8859-2. Oryginał tego dokumentu znajduje się pod adresem ftp.icm.edu.pl/pub/Linux/sunsite/docs/HOWTO/

## 1. Użyteczne programy

Poniższe pakiety zawierają programy odnoszące się do klawiatury lub konsoli:

`kbd-0.90.tar.gz` zawiera `loadkeys`, `dumpkeys`, `showkey`, `setmetamode`, `setleds`, `setfont`, `showfont`, `mapscrn`, `kbd_mode`, `chvt`, `resizecons`, `disalloc`, `getkeycodes`, `setkeycodes`.

`util-linux-2.6` zawiera `setterm`, `kbdrate`. (Tak, `more` w util-linux 2.6 zrzuca `core` z powodu konfliktu nazw. Zachowaj swoją starą kopię, albo używaj util-linux-2.5, albo zmień 'savetty' na 'my_savetty' w more.c).

`shutils-1.12` zawiera `stty`.

`open-1.4.tgz` zawiera `open` (które powinno się przemianować na `openvt`. Patrz też `dynamic-vc-1.1.tar.gz`).

`SVGATextMode-1.6.tar.gz` zawiera `SVGATextMode`, program który zastępuje stare `resizecons`

Dystrybucja X zawiera `xmodmap`, `xset`, `kbd_mode` (patrz też X386keybd(1) co do sytuacji pod XFree86 1.3, oraz Xserver(1) co do rozszerzenia XKEYBOARD pod X11R6).

`termcap-2.0.8.tar.gz` zawiera `termcap`, starą bazę danych właściwości terminala. `ncurses-1.9.9e.tar.gz` zawiera bazę termlib która zastępuje termcap (wiele programów jednak ciągle używa termcap).

Patrz loadkeys(1), setleds(1), setmetamode(1) co do kodów wysyłanych przez różne klawisze i ustawiania diod poza X. Pod X, użyj xmodmap(1).

Patrz setfont(8) co do ładowania czcionek konsoli. Wielu ludzi woli załadować jakąś czcionkę w rodzaju iso01.f16, ponieważ domyślna jest czcionką sprzętową karty graficznej, i często jest to czcionka "Code Page 437", w której brakuje akcentowanych znaków i innych symboli z zestawu Latin-1.

Patrz setterm(1), kbdrate(8) co do właściwości takich jak kolory tła i pisma, wygaszanie ekranu, szybkość powtarzania klawiszy - wszystko poza X. Pod X, patrz xset(1), też co do dźwięku przy naciśnięciu klawisza i głośności dzwonka.

Plik `/etc/termcap` definiuje Esc-sekwencje dla wielu programów które odnoszą się do konsoli (lub innego terminala). Bardziej nowoczesna wersja znajduje się w `/usr/lib/terminfo`. (Patrz terminfo(5). Pliki terminfo są kompilowane kompilatorem terminfo `/usr/lib/terminfo/tic`, patrz tic(1). Ich zawartość obejrzeć można używając programu `infocmp`, patrz infocmp(1). Sekwencje konsoli linuxowej opisane są w console_codes(4).

## 2. Ogólnie o klawiaturze

Naciskasz klawisz, a kontroler klawiatury wysyła kody skanowe do sterownika klawiatury jądra. Niektóre klawiatury można programować, ale przeważnie kody klawiszy odpowiadające klawiszom są stałe. Sterownik klawiatury jądra przesyła po prostu cokolwiek otrzymuje do programu aplikacji, gdy ta jest w trybie skanowania kodów, na przykład podczas działania `X`. W przeciwnym razie przekłada on strumień kodów skanowych na kody klawiszy, odpowiadające zdarzeniom naciśnięcia i zwolnienia klawisza (pojedyncze naciśnięcie klawisza może wytworzyć do sześciu kodów skanowych). Kody te [klawiszy] są przesyłane do programu aplikacji gdy znajduje się on w trybie kodów klawiszy (używane, na przykład, przez `showkey`). W przeciwnym razie, owe kody klawiszy porównywane są z rozkładem klawiatury, i znaleziony tam znak lub ciąg znaków jest przesyłany do aplikacji, bądź następuje wykonanie opisanej tam czynności. (Na przykład, jeśli naciśnie się i zwolni klawisz `a`, klawiatura wysyła kody skanowe 0x1e i 0x9e, przekształcane są one na kody klawiszy 30 i 158, a potem przesyłane jako 0141, kod ASCII lub Latin-1 litery 'a'; jeśli naciśnie się i zwolni `Delete`, klawiatura wysyła kody skanowe 0xe0 0x53 0xe0 0xd3, przekształcane na kody klawiszy 111 i 239, a potem przesyłane jako czterosymbolowa sekwencja ESC `[ 3 ~`, wszystko to zakładając amerykański układ klawiatury jako domyślny (przykładem kombinacji klawiszy której przypisana jest czynność jest Ctrl-Alt-Del).

Tłumaczenia pomiędzy nieczęstymi kodami skanowymi i klawiszy można dokonać używając narzędzia `setkeycodes` - tylko bardzo nieliczni będą go potrzebować. Tłumaczenia pomiędzy kodami klawiszy i znakami bądź ciągami znaków lub czynności, to jest układem klawiatury, dokonuje się przy pomocy narzędzia `loadkeys`. Po szczegóły patrz getkeycodes(8), setkeycodes(8), dumpkeys(1), loadkeys(1).

Tam gdzie w powyższym opisie piszę "przesłane do aplikacji", znaczy to rzeczywiście "przesłane do sterownika terminala". To jest, dalsze przetwarzanie jest bardzo podobne do przetwarzania tekstu który odbierany jest na złączu szeregowym. Szczegóły tego przetwarzania ustala program .

## 3. Ogólnie o konsoli

I odwrotnie, kiedy wypisujesz coś na konsolę, najpierw podpada to pod standardowe przetwarzanie tty, a potem dostarczane jest sterownikowi konsoli. Sterownik konsoli emuluje vt100 i przekłada dane wejściowe aby rozpoznać Esc-sekwencje vt100 (ruchu kursora, czyszczenia ekranu itp.) Znaki które nie są częścią Esc-sekwencji są najpierw przetwarzane na Unicode, używając jednej z czterech tablic odwzorowań jeśli konsola nie była od początku w trybie UTF-8, potem odnoszone do tabeli opisującej zależność między wartościami Unicode i pozycjami w czcionce, a uzyskane ośmio- lub dziewięciobitowe indeksy zapisywane są w pamięci ekranu, gdzie powodują wyświetlenie kształtów znaków znalezionych w ROMie znakowym karty graficznej. Do ROMu znakowego można załadować własne czcionki używając `setfont`, załadować odpowiadającą tablicę odwzorowań Unicode używając `loadunimap`, i załadować tablicę odwzorowań użytkownika używając `mapscrn`. Więcej szczegółów poniżej.

Istnieje wiele konsol (zwanych Wirtualnymi Konsolami lub Wirtualnymi Terminalami) które dzielą ten sam ekran. Możesz ich używać jako oddzielnych urządzeń, albo uruchamiając na nich oddzielne sesje logowania, albo po prostu przesyłając na nie jakieś dane wyjściowe z początku czy końca system log. Patrz niżej ("Przełączanie konsol") co do tego jak je ustawiać i przełączać się między nimi.

## 4. Kasowanie terminala

Na ekranie są śmieci, a wszystkie naciśnięcia klawiszy dają w efekcie znaki do rysowania ramek. Co robić?

Wiele programów przerysuje ekran po naciśnięciu ^L. Może to pomóc w sytuacji gdy na ekranie znajdują się śmieci z modemu lub nadany komunikat. Komenda `clear` czyści ekran.

Komenda `reset` kasuje sterownik konsoli. Pomaga to w sytuacji gdy ekran pełen jest dziwnych znaków graficznych, a także jeśli skurczy się do jednej linii na dole. Jeśli nie masz tej komendy, bądź jeśli robi ona coś innego, stwórz własną dodając poniższe dwie linie do pliku wykonywalnego `reset` w swojej ścieżce:

> `

>     #!/bin/sh
>     echo -e \\033c

> `

to jest, masz zamiar posłać dwa znaki: Esc-c, na konsolę.

Dlaczego ekran czasami się miesza i wyświetlane jest 24 lub jedna linia, zamiast zwykłych 25? Cóż, głównym winowajcą jest tutaj TERM=vt100 (albo jakiś inny terminal z 24 liniami) zamiast TERM= linux przy łączeniu się zdalnie. Jeśli stanie się to na /dev/tty2 napisz:

> `

>     % cat > /dev/tty2
>     ^[c
>     ^D

> `

na jakieś innej WK (gdzie wpisujesz cztery symbole do `cat`: Esc, c, Enter, Ctrl-D) i odśwież ekran na /dev/tty2 (możliwie używając ^L), co przywróci porządek. Oczywiście stałym rozwiązaniem jest używanie odpowiedniego kawałka `termcap` lub `terminfo`.

Dlaczego tak się dzieje że czasami dostajesz masę znaków do rysowania ramek, np. po wysłaniu na ekran pliku binarnego za pomocą `cat` ? Istnieje wiele Esc-sekwencji które zmieniają zestaw znaków, a twój plik może przypadkiem zawierać niektóre z nich. Esc c to ogólne przekasowanie, lekarstwo na wszystko, ale jeżeli wiesz dokładnie co poszło nie tak, możesz to naprawić bez kasowania innych atrybutów konsoli. Na przykład po

> `

>     % cat
>     ^N
>     ^D

> `

twój znak zachęty konsoli będzie się cały składał ze znaków do rysowania ramek. Napisz teraz (na ślepo):

> `

>     % cat
>     ^O
>     ^D

> `

I wszystko jest znów w porządku (wpisałeś trzy symbole do każdego `cat`: ^N lub ^O, Enter, ^D). Żeby zrozumieć co się dzieje, patrz "Zestawy znaków konsoli" poniżej.

Jeśli załadowałeś jakiś dziwną czcionkę i chcesz powrócić do domyślnej.

> `

>     % setfont

> `

wystarczy (założywszy że zachowałeś domyślną czcionke w domyślnym miejscu). Jeśli ta czcionka nie zawiera osadzonej mapy unikodowej (i wypisuje złe symbole dla znaków akcentowanych), wpisz

> `

>     % loadunimap

> `

Na przykład, jeśli wykonam

> `

>     % loadkeys de-latin1

> `

będę miał niemiecką klawiaturę, a klawisz na lewo od Enter wypisze mi a-umlaut. Działa to, ponieważ a-umlaut występuje na stronie kodowej 437, i mapa unikodowa jądra jest inicjalizowana dla CP 437, a moja karta graficzna ma wbudowaną czcionkę CP 437. Jeśli teraz załaduję czcionkę ISO-8859-1 używając

> `

>     % setfont iso01.f16

> `

nadal wszystko działa, bowiem `setfont` podstawia jądru ważną mapę unikodową (jeśli do czcionki nie jest dołączona mapa), a bez mapy jądro odwołuje się bezpośrednio do czcionki, a to jest zupełnie poprawne dla systemu ISO-8859-1 z czcionką iso01.f16. Ale przywrócenie poprzedniej czcionki za pomocą

> `

>     % setfont

> `

daje dużą sigmę zamiast a-umlaut - wszystkie akcentowane znaki są pomieszane, ponieważ ta czcionka również nie ma osadzonej mapy unikodowej. Po wykonaniu

> `

>     % loadunimap

> `

która ładuje domyślną mapę unikodową (prawidłową dla domyślnej czcionki), wszystko znów działa jak trzeba. Zwykle `loadunimap` nie jest wywoływane bezpośrednio, lecz przez `setfont`. Tak więc poprzednie dwie komendy można zastąpić przez

> `

>     % setfont -u def

> `

Czcionki etiopskie oraz lat1u*.psf mają osadzone tabele znaków Unicode. Większość pozostałych nie ma.

Na starych terminalach wydruk zawierający znaki tabulacji może wymagać opóźnienia, więc musisz napisać

> `

>     % stty tab3

> `

(patrz stty(1)).

Tryb graficzny zmienić możesz używając `resizecons` albo `SVGATextMode`. To zwykle załatwia aspekt wyświetlania. Po stronie wprowadzania może istnieć wiele potencjalnie niewłaściwych rzeczy. Jeśli `X`, `DOOM`, albo jakiś inny program używający trybu "surowego" pada, twoja konsola może ciągle znajdować się w stanie "surowym" (lub "półsurowym"), i trudno jest wydawać polecenia. Patrz "Jak wyjść z trybu surowego" poniżej. Jeśli załadowałeś zły układ klawiatury, to

> `

>     % loadkeys -d

> `

ładuje ponownie układ domyślny, ale może się okazać że trudno jest napisać "-" ! Alternatywa to:

> `

>     % loadkeys defkeymap

> `

Czasami nawet litery są poplątane. Warto wiedzieć że istnieją cztery główne typy klawiatur: QWERTY, QWERTZ, AZERTY i Dvoraka. Trzy pierwsze nazwane są od pierwszych sześciu klawiszy i z grubsza odpowiadają krajom angielsko-, niemiecko-, i francuskojęzycznym. W porównaniu z QWERTY, układ QWERTZ zamienia Y i Z. W porównaniu z QWERTY, układ AZERTY zamienia Q i A, W i Z, i ma M na prawo od L, na pozycji średnika. Układ Dvoraka ma zupełnie inny porządek liter.

## 4.1 Sprzętowe kasowanie klawiatury

Coś może być nie w porządku na poziomie niższym niż wie o tym Linux. Istnieją co najmniej dwa różne niższe poziomy (klawiatura i sterownik klawiatury) w których wydać można komendę "wyłącz klawiaturę" sprzętowi za nią odpowiedzialnemu. Klawiatury często można zaprogramować na używanie jednego z trzech różnych zestawów kodów skanowych.

Niemniej nie wiem o żadnym przypadku w którym okazałoby się to jakimś problemem.

Niektóre klawiatury mają wbudowaną zdolność zmiany układów. Stormy Henderson (`stormy@ghost.net`) pisze: "Jeśli twoja klawiatura przeprogramowała się przez przypadek, możesz (na klawiaturze Gateway AnyKey) nacisnąć control-alt-suspend_macro by skasować ustawienia klawiszy do stanu normalnego".

## 5. Delete i Backzspace

Nakłonienie Delete i Backspace do prawidłowej pracy jest wcale trywialne, zwłaszcza w środowisku mieszanym, gdzie komunikujesz się z konsolą, z `X`, `bash`, `emacsem`, logujesz się zdalnie itd. Może będziesz musiał wyedytować kilkanaście plików konfiguracyjnych żeby powiedzieć wszystkim konkretnym programom czego dokładnie chcesz. Z jednej strony problemem jest jakie klawisze wypisują jakie kody (i jak te kody przetrawia `kermit` czy `emacs`), a z drugiej strony jakie funkcje są przypisane jakim klawiszom.

Ludzie często skarżą się "mój klawisz wstecznej spacji nie działa", jak gdyby ten klawisz miał wbudowaną funkcję "skasuj poprzedni znak". Niestety wszystko co ten, albo każdy inny, klawisz robi to wypisanie kodu, i można tylko mieć nadzieję że sterownik tty jądra i wszystkie aplikacje można tak skonfigurować że klawisz wstecznej spacji rzeczywiście działa jako klawisz kasujący poprzedni znak.

Większość unixowych programów otrzymują swoje dane wejściowe tty przez sterownik tty jądra w trybie "niesurowym", i zwykłe polecenie `stty` ustala znak kasujący. Jednak programy takie jak `bash`, `emacs` czy `X` przetwarzają dane wejściowe własnymi metodami, i muszą być każde z osobna przekonane do właściwego działania.

## 5.1 Jak powiedzieć Unixowi jakiego znaku chcesz używać żeby skasowaćostatnio napisany znak?

> `

>     % stty erase ^?

> `

Jeśli znak jest kasowany, ale w dziwny sposób, coś jest nie w porządku z twoimi ustawieniami tty. Jeśli ustawione jest `echoprt`, kasowane znaki ujęte są między `\` oraz `/`. Jeśli `echoe` nie jest ustawione, znak kasowania jest wypisywany (co jest rozsądne w przypadku gdy jest to znak drukujący, jak #). Większość ludzi woli `stty echoe -echoprt`. Napisanie `stty sane` zrobi to i więcej. Napisanie `stty -a` pokazuje bieżące ustawienia. Jak to się stało że domyślnie nie były poprawne? Będą, jeżeli użyjesz poprawnego `getty`.

Zauważ że wiele programów (jak `bash`, `emacs` itd.) mają swoje własne przypisania klawiszy (zdefiniowane w `~/.inputrc`, `~/.emacs` itd.) i nie wpływa na nie ustawienie znaku kasowania.

Standardowy unixowy sterownik tty nie rozpoznaje kursora, ani klawiszy (takich jak klawiszy strzałek) przesuwających bieżącą pozycję, i stąd nie ma też komendy takiej jak "skasuj bieżący znak". Ale na przykład możesz nauczyć `bash` na konsoli rozpoznawania Delete wstawiając

> `

>     set editing-mode emacs
>     "\e[3~":delete-char

> `

do `~/.inputrc`

### "Kiedyś getty dobrze oddawało DEL i BS, ale teraz się popsuło"

Dawniej, sterownik konsoli zwykle wypisywał BS-spacja-BS (`\010\040\010`) gdy otrzymał znak DEL (`\177`). Dzisiaj, znaki DEL są ignorowane (tak jak powinny, ponieważ sterownik emuluje vt100). Zdobądź lepsze getty, tj. takie które nie wypisuje DEL.

### "Login zachowuje się inaczej przy pierwszej i drugiej próbielogowania"

Przy pierwszej próbie, komunikujesz się z `getty`. Przy drugiej próbie, komunikujesz się z `login`, innym programem.

## 5.2 Jak powiedziec Linuxowi jaki kod wysyłać po naciśnięciu klawisza

Na konsoli lub, ściślej, gdy nie jesteś w trybie (pół)surowym, użyj

> `

>     % loadkeys mykeys.map

> `

A pod X użyj

> `

>     % xmodmap mykeys.xmap

> `

[gdzie mykeys.(x)map to oczywiście konkretny plik definicji klawiatury - przyp. tłum.]

Zauważ że (od XFree86-2.1) X czyta linuxowe ustawienia układów klawiatury przy initializacji Xowego keymap. Chociaż oba systemy nie są w 100% kompatybilne, oznacza to że w wielu przypadkach używanie `xmodmap> stało się zbędne. Załóżmy, na przykład, że chcesz żeby twój klawisz Backspace dawał wsteczną spację (^H, ósemkowe 010), a szary klawisz Delete DEL (ósemkowe 012), dodaj poniższe do` etc/rc.local (albo tam gdzie trzymasz swoje pliki inicjalizacyjne).

> `

>     /usr/bin/loadkeys << EOF
>     keycode 14 = BackSpace
>     keycode 111 = Delete
>     EOF

> `

Zauważ że zmieni to funkcję tych klawiszy tylko gdy nie używa się modyfikatorów. Domyślnie jądro Linuxa pozwala Ctrl-Backspace wypisywać wsteczną spację - czasami przydaje się to jako zapasowe wyjście, gdy stwierdzisz że możesz wypisywać tylko znaki DEL.

Lewy klawisz Alt jest czasem zwany klawiszem Meta, a domyślnie kombinacje AltL-X są przypisane do symbolu Meta-X. Ale jakim ciągiem znaków jest Meta-X? Ustalane jest to (via tty) przez znacznik Meta, ustawiony komendą setmetamode. Dwiema możliwościami są: Esc X albo X iloczyn logiczny 0200.

### Dlaczego klawisz Backspace nie wysyła domyślnie wstecznejspacji?

(i) Ponieważ vt100 miał klawisz Delete nad klawiszem Enter.

(ii) Bo Linus tak postanowił.

## 5.3 Jak nakazać X zamianę Delete i Backspace

> `

>     % xmodmap -e "keysym BackSpace = Delete" -e "keysym Delete = BackSpace"

> `

Albo, jeśli chcesz tylko żeby klawisz Backspace dawał wsteczną spację:

> `

>     % xmodmap -e "keycode 22 = BackSpace"

> `

Albo, jeśli chesz tylko żeby klawisz Delete dawał Delete:

> `

>     % xmodmap -e "keycode 107 = Delete"

> `

(ale zwykle takie jest już domyślne przypisanie).

## 5.4 Jak powiedzieć emacsowi co robić gdy otrzyma Delete lubwsteczną spację

Wsadź do swojego pliku `.emacs` linie jak niżej:

> `

>       (global-set-key "\?" 'delete-backward-char)
>       (global-set-key "\C-h" 'help-command)

> `

Oczywiście możesz w ten sam sposób przypisać inne polecenia innym klawiszom. Zauważ że niektóre tryby główne i poboczne redefiniują przypisania klawiszy. Na przykład w trybie szukania przyrostowego [incremental mode] można znaleźć kod:

> `

>     (define-key map "\177" 'isearch-delete-char)
>     (define-key map "\C-h" 'isearch-mode-help)

> `

Oznacza to że używanie dwóch powyższych komend globalnych może nie być dobrym pomysłem. Za dużo jest miejsc z wbudowanym założeniem ^H = pomoc i Del = delete. Nie oznacza to że musisz ustawić klawisze tak żeby Backspace dawało Del. Ale jeśli tak nie jest, najłatwiej jest zmienić ich układ na najniższym możliwym poziomie `emacsa`.

## 5.5 Jak nakazać emacsowi zamienienie Delete i Backspace

Wsadź do swojego pliku `.emacs` linie jak niżej:

> `

>       (setq keyboard-translate-table (make-string 128 0))
>       (let ((i 0))
>       (while (< i 128)
>           (aset keyboard-translate-table i i)
>           (setq i (1+ i))))
>       (aset keyboard-translate-table ?\b ?\^?)
>       (aset keyboard-translate-table ?\^? ?\b)

> `

Ostatnie wersje `emacsa` mają funkcję `keyboard-translate`, więc można uprościć powyższe do

> `

>     (keyboard-translate ?\C-h ?\C-?)
>     (keyboard-translate ?\C-? ?\C-h)

> `

Zauważ że pod `X` `emacs` może rozróżniać Ctrl-h i klawisz Backspace (niezależnie od tego jakie kody oba wypisują na konsoli), a domyślnie `emacs` będzie widział klawisz wstecznej spacji jako DEL (wykonujący polecenia kasowania, przypisane temu znakowi, a nie polecenia pomocy, przypisane do ^H). Można rożróżniać Backspace i Delete, np. poprzez

> `

>       (global-unset-key [backspace] )
>       (global-set-key [backspace] 'delete-backward-char)
>       (global-unset-key [delete] )
>       (global-set-key [delete] 'delete-char)

> `

## 5.6 Jak nakazać kermitowi zamienienie Delete i Backspace

Wsadź do swojego pliku `.kermrc` linie jak niżej:

> `

>       set key \127 \8
>       set key \8 \127

> `

## 5.7 Jak poinformować xterm o twoich ulubionych trybach tty

Xterm dziedziczy zwykle tryby tty po programie który go wywołał. W `xdm`, domyślne klawisze kasowania i usuwania to `#` i `@`, jak w starej dobrej wersji 6 Unixa. Jeśli nie podoba ci się to, możesz wsadzić coś podobnego do

> `

>       XTerm*ttymodes: erase ^? kill ^U intr ^C quit ^\ eof ^D susp ^Z start ^Q stop ^S eol ^@

> `

do `/usr/lib/X11/app-defaults/XTerm` albo do `$HOME/.Xresources`, zakładając że masz linię

> `

>       xrdb $HOME/.Xresources

> `

w swoim `$HOME/.xinitrc`.

## 5.8 Jak poinformować xmosaic że klawisz Backspace wypisuje Del

Wsadzenie

> `

>       *XmText.translations: #override\n\
>              <Key>osfDelete: delete-previous-character()
>       *XmTextField.translations: #override\n\
>               <Key>osfDelete: delete-previous-character()

> `

do twojego `$HOME/.Xresources` pomoże.

W Netscape FAQ można jednak przeczytać:

            Dlaczego mój klawisz Backspace nie działa w polach tekstowych?
            Domyślnie, Linux i XFree86 dostarczane są ze źle skonfigurowanymi
            klawiszami Backspace i Delete. Wszystkie programy oparte na Motif
            (w tym oczywiście Netscape Navigator) będą w ten sam sposób źle
            działać.

            Specyfikacja Motif mówi że Backspace ma kasować poprzedni znak a
            Delete ma kasować znak następny. Linux i XFree86 są dostarczane
            z takim ustawieniem że oba klawisze - Backspace i Delete - wypisują
            Delete.

            Możesz to naprawić używając któregoś z programów xmodmap, xkeycaps
            bądź loadkeys i sprawić że odpowiedni klawisz wypisuje klawsym
            wsteczna spacja, a nie Delete.

            Możesz to również naprawić używając pliku .motifbind; patrz
            strona man VirtualBindings(3).

            Uwaga: nie używaj zasobów *XmText.translations lub *XmTextField.
            translations próbując naprawić ten problem. Jeśli tak zrobisz,
            rozwalisz pozostałe przypisania klawiszy w polach tekstowych NN.

## 5.9 Lepsze rozwiązanie dla programów używających Motifa, jak netscape

Ted Kandell (ted@tcg.net) sugeruje co następuje:

Dodaj poniższe gdzieś w swoim `.profile`:

> `

>       stty erase ^H

> `

Jeśli używasz basha, dodaj poniższe linie do swojego `.inputrc`:

> `

>            "\C-?": delete-char
>            "\C-h": backward-delete-char

> `

Dodaj następujące linie do swojego pliku `.xinitrc`:

> `

>            xmodmap <<-EOF
>            keycode 22  =  BackSpace osfBackSpace
>            keycode 107 =  Delete
>            EOF

>            # wystartuj tu swojego managera okien, np.
>            #(fvwm) 2>&1 | tee /dev/tty /dev/console

>            stty sane
>            stty erase ^H
>            loadmap <<-EOF
>            keycode 14  = BackSpace
>            keycode 111 = Delete
>            EOF

> `

Będzie to definitywnie działać dla klawiatury PC 101 lub 102-klawiszowej, z każdym rozkładem Linuxa/XFree86.

Ważną częścią uczenia aplikacji motifowych takich jak Netscape poprawnej pracy jest dodanie osfBackSpace do keycode 22, oprócz BackSpace.

Zauważ nie po obu stronach znaku = nie mogą się znajdować spacje.

## 5.10 Co z termcap i terminfo?

Gdy ktoś ma problemy z wsteczną spacją, ma on tendencję do patrzenia w swój kawałek termcap (lub terminfo) opisujący terminal; i rzeczywiście, istnieje tam zdolność kb (lub kbs) opisująca kod wypisywany przez klawisz Backspace. Niemniej niewiele programów jej używa, więc - chyba że masz problemy z jednym konkretnym programem - prawdopodobnie błąd leży gdzie indziej. Oczywiście poprawienie swojego kawałka termcap (terminfo) nie jest złym pomysłem tak czy owak. Patrz niżej pod "Zmienna TERM".

## 6. Zestawy znaków konsoli

Jądro próbuje wywnioskować najpierw jaki symbol rozumieć przez każdy podany przez użytkownika bajt, a następnie gdzie ten symbol jest umieszczony w bieżącej czcionce.

Jądro wie o pięciu tłumaczeniach bajtów na symbole konsoli-ekranu. W trybie Unicode (UTF-8) kod UTF-8 jest przekształacany bezpośrednio na Unicode. Założeniem jest że prawie wszystkie potrzebne symbole w Unicode się znajdują, a w przypadkach gdzie nie jest to prawdą zarezerwowane są kody 0x00ff* dla bezpośredniego dostępu do czcionki. Poza trybem Unicode, używa się jednej z tabeli tłumaczeń. Te cztery tabele to: a) Latin1 -> Unicode, b) grafika vt100 -> Unicode, c) PC -> Unicode, d) zdefiniowane przez użytkownika.

Istnieją dwa zestawy znaków, zwane G0 i G1, i jeden z nich jest zestawem bieżącym (początkowo G0). Wypisanie ^N spowoduje że bieżącym zestawem będzie G1, ^O że G0.

Zmienne G0 i G1 wskazują na tablice tłumaczeń, i mogą być zmienione przez użytkownika. Początkowo wskazują na tablice a) i b), odpowiednio. Sekwencje Esc(B, Esc(0, Esc(U, Esc(K powodują że G0 wskazuje na tablice tłumaczeń a), b), c), d), odpowiednio. Sekwencje Esc)B, Esc)0, Esc)U, Esc)K powodują że G1 wskazuje na tablice tłumaczeń a), b), c), d), odpowiednio.

Sekwencja Esc-c powoduje skasowanie terminala, czyli to czego chcesz jeżeli ekran jest cały zaśmiecony. Często doradzane `echo ^V^O` spowoduje tylko że zestawem bieżącym będzie G0, ale nie ma gwarancji że G0 pokazuje na tablicę a). W niektórych dystrybucjach istnieje program reset(1), który wypisuje po prostu echo ^[c. Jeśli twój kawałek termcap dla konsoli jest poprawny (i ma `:rs=\Ec:`), wtedy zadziała także `setterm -reset`.

Zdefiniowaną przez użytkownika tablicę odwzorowań ustawić można używając mapscrn(8). Rezultatem odwzorowania jest to że jeżeli wypisywany jest symbol c, to wysyłany do pamięci ekranu jest symbol `s = map[c]`. Obraz bitowy który odpowiada `s` znajduje się w ROMie znakowym, i może zostać zmieniony przy pomocy setfont(8).

## 7. Przełączanie konsoli

Domyślnie przełączania konsoli dokonuje Alt-Fn lub Ctrl-Alt-Fn. Pod `X` (lub nowszymi wersjami `dosemu`) działa tylko Ctrl-Alt-Fn. Wiele układów klawiatur pozwala na cykliczne przemieszczanie się między konsolami przy użyciu Alt-strzałka_w_prawo i Alt-strzałka_w_lewo.

XFree86 1.3 nie wie że przyciśnięty jest Alt gdy przełączasz się do okienka X. Tak więc nie możesz przełączyć się natychmiast na jakąś innej WK, ale musisz najpierw zwolnić Alt. W drugą stronę powinno to działać; jądro zawsze zanotowywuje stan góra/dół wszystkich klawiszy. (na tyle na ile można; na niektórych klawiaturach część klawiszy nie wysyła kodu skanowego po naciśnięciu, np. klawisze PFn na FOCUS 9000) lub zwolnieniu (np. klawisz Pause na wielu klawiaturach).

XFree86 1.3 zapisuje czcionki załadowane do ROMu znakowego przy starcie i przywraca je przy przełączaniu konsoli. Tak więc efekt `setfont` na WK zostaje wymazany gdy przełączasz się między X i zewnętrzem. Używanie `setfont` pod X może doprowadzić do dziwnych rezultatów.

Pod kontrolą programową WK można zmieniać używając komendy `chvt`.

## 7.1 Zmiana numeru Wirtualnych Konsoli

To pytanie ciągle pojawia się od czasu do czasu, ale odpowiedź brzmi: już masz ich dosyć. Od wersji 1.54 jądra istnieje od 1 do 63 wirtualnych konsol. Nowa konsola tworzona jest natychmiast po otwarciu. Usuwa się ją narzędziem `disalloc` (ale można ją usunąć tylko gdy nie ma z nią skojarzonych procesów).

Dla starszych jąder, zmień linię

> `

>     #define NR_CONSOLES     8

> `

w `include/linux/tty.h` (nie zwiększaj tej liczby powyżej 63), i zrekompiluj jądro.

Jeśli jeszcze nie istnieją, stwórz urządzenia tty używając `MAKEDEV` lub `mknod ttyN c 4`, gdzie `N` oznacza numer tty. Na przykład:

> `

>     for i in 9 10 11 12; do mknod /dev/tty$i c 4 $i; done

> `

albo, lepiej, (ponieważ zatroszczy się to również o właściciela i prawa dostępu)

> `

>     for i in 9 10 11 12; do /dev/MAKEDEV tty$i; done

> `

Jeśli chcesz żeby nowe WK uruchamiały `getty`, dodaj linie w `/etc/inittab` (ale jest znacznie lepiej mieć uruchomione tylko dwie `getty`, i tworzyć więcej konsol dynamicznie w razie potrzeby. W ten sposób będziesz miał więcej pamięci gdy nie używasz wszystkich konsol, a także więcej konsol, w razie gdybyś naprawdę ich potrzebował. Wyedytuj `/etc/inittab` i wykomentuj wszystkie `getty` prócz dwóch pierwszych).

Gdy konsole są przydzielane dynamicznie, zazwyczaj najłatwiej jest mieć tylko jedną czy dwie z uruchomionym `getty. Więcej otwiera się za pomocą `open -l -s bash`. Nieużywane konsole (bez skojarzonych procesów) usuwa się za pomocą `disalloc`. Ale, rzec możesz, zajęty jestem czynnościami w których nagle potrzebuję więcej konsol, a nie mam znaku zachęty bash aby wydać polecenie `open`. Na szczęście możliwe jest stworzenie nowej konsoli po naciśnięciu jednego klawisza, bez względu na to co dzieje się na konsoli bieżącej. Jeśli masz `spawn_login` z `kbd-0.90.tar.gz` i wstawisz`

> `

>             loadkeys << EOF
>             alt keycode 103 = Spawn_Console
>             EOF
>             spawn_login &

> `

do ``etc/rc.local, naciśnięcie Alt-strzałka_w_górę utworzy nową WK z uruchomionym `login` (i przełączy się na nią). Używając `spawn_console &` zamiast `spawn_login &` uzyskasz tam uruchomiony `bash`. Patrz też `open-1.4.tgz` oraz `dynamic-vc-1.1.tar.gz`.

To jaka czynność winna być podejmowana po naciśnięciu tego klawisza Spawn_Console można również ustawić w `/etc/inittab` pod `kbrequest`, jeśli masz świeży plik inicjalizacyjny. Patrz inittab(5) (czynność ta może być czymś zupełnie innym - nazwałem ten klawisz Spawn_Console po prostu dlatego że do tego go wykorzystywałem).

Na terminalach wyliczonych w `/etc/securetty/ możesz zalogować się tylko jako root. Istnieją programy które czytają ustawienia terminala z plików `/etc/ttys/` i `/etc/ttytype`. Jeśli masz takie pliki, i stworzysz dodatkowe konsole, dobrym pomysłem mogłoby być również dodanie dla nich linii w tych plikach.`

## 8. Ctrl-Alt-Del i inne specjalne kombinacje klawiszy

## 8.1 Ctrl-Alt-Del (przeładowanie)

Jeśli naciśniesz Ctrl-Alt-Del (albo każdy inny klawisz z przypisanym przed loadkeys klawsymem Boot) komputer albo przeładuje się natychmiast (bez sync), albo do `init` wysyła się SIGINT. To pierwsze zachowanie jest domyślne. Może je zmienić root używając systemowego wywołania reboot(), patrz ctrlaltdel(8). Niektóre pliki `init` zmieniają wartość domyślną. To co nastąpi gdy `init` otrzyma SIGINT zależy od użytej wersji tegoż - często określa to pole `pf` w `/etc/inittab` (co oznacza że możesz w tym przypadku uruchomić dowolny program).

W obecnym jądrze Ctrl-AltGr-Del nie jest już domyślnie przypisane do Boot.

## 8.2 Inne kombinacje

    Name            Default binding
    -------------------------------
    Show_Memory     Shift-Scrollock     [pokazuje info o pamięci]
    Show_Registers  AltGr-ScrollLock    [pokazuje zawartość rejestrów]
    Show_State      Ctrl-ScrollLock     [pokazuje status]
    Console_n       Alt-Fn and Ctrl-Alt-Fn  (1 <= n <= 12) [konsola nr n]
    Console_{n+12}  AltGr-Fn                (1 <= n <= 12) [konsola nr n+12]
    Incr_Console    Alt-RightArrow      [o konsolę w górę]
    Decr_Console    Alt-LeftArrow       [o konsolę w dół]
    Last_Console    Alt[Gr]-PrintScreen [ostatnia konsola]
    Scroll_Backward Shift-PageUp        [przewija ekran w górę]
    Scroll_Forward  Shift-PageDown      [przewija ekran w dół]
    Caps_On                             [włącza duże litery. CapsLock działa
                                        jako przełącznik]
    Compose         Ctrl-.              [tryb składania, np. '+e daje é]

## 8.3 Kombinacje w X

    Ctrl-Alt-Fn     Przełącza na WK nr n
    Ctrl-Alt-KP+    Następny tryb
    Ctrl-Alt-KP-    Ostatni tryb
    Ctrl-Alt-BS     "zabija" X

[KP+ i KP- to szary plus i minus z klawiatury numerycznej - przyp. tłum.]

Na niektórych płytach głównych Ctrl-Alt-KP- i Ctrl-Alt-KP+ są równoważne naciśnięciu przycisku Turbo. To jest, oba dadzą w wyniku kody skanowe 1d 38 4a ca b8 9d i 1d 38 4e ce b8 9d, i oba przełączać będą między trybem turbo (>= 25 Mhz) i nie-turbo (8/12 Mhz). (te kombinacje klawiszy często działają tylko po ustawieniu zworkami na płycie głównej).

Perry F. Nguyen (pfnguyen@netcom22.netcom.com) pisze: AMI BIOS ma właściwość która blokuje klawiaturę i miga diodami jeżeli naciśnięto kombinację Ctrl-Alt-Backspace w czasie pytania o hasło BIOS, aż to hasło nie zostanie wpisane.

## 8.4 Kombinacje Dosemu

    Ctrl-Alt-Fn     Przełącz na WK nr n (od wersji 0.50, wcześniej Alt-Fn)
    Ctrl-Alt-PgDn   "zabij" dosemu (w trybie SUROWYM klawiatury)

(i wiele innych kombinacji - patrz dokumentacja dosemu)

## 8.5 Składanie symboli

Jeden symbol może być złożony przy użyciu kilku klawiszy.

- lewyAlt-naciśnięcie, plus numer dziesiętny wpisany na klawiaturze numerycznej, plus lewyAlt-zwolnienie daje symbol o kodzie o tym numerze (w trybie Unicode ten sam mechanizm, ale wtedy z czterema cyframi szesnastkowymi, można wykorzystać do zdefiniowania symbolu Unicode).
- Klawisz diakrytyki plus symbol daje ten symbol z nałożoną diakrytyką. Jeśli kombinacja nie jest zdefiniowana, oba klawisze brane są oddzielnie. To które klawiszę są diakrytykami jest ustawialne przez użytkownika; domyślnie żaden. Można zdefiniować pięć (sześć od 2.0.5) klawiszy diakrytyki (za pomocą loadkeys(1)); dead_grave, dead_acute, dead_circumflex, dead_tilde, dead_diaeresis (też dead_cedilla). Co dokładnie oznacza owo nałożenie również jest ustawialne przez użytkownika; np. klawisz diakrytyki + symbol jest równoważne Compose + diakrytyka + symbol.
- Compose plus dwa symbole daje symbol-złożenie. Ten kombinacje są ustawialne przez użytkownika. Dzisiaj istnieje 68 kombinacji zdefiniowanych domyślnie; możesz je zobaczyć pisząc "dumpkeys | grep compose"
- Dalej idą owe klawisze modyfikujące zwane "Sticky" (od 1.3.33). Na przykład można napisać ^C jako SControl, C i Ctrl-Alt-Backspace jako SControl, SAlt, BackSpace

Zauważ że istnieją przynajmniej trzy takie mechanizmy złożeń:

1. Mechanizm sterownika klawiatury Linuxa, używany w połączeniu z loadkeys.
2. Mechanizm X - patrz X386keybd(1), później XFree86kbd(1). Pod X11R6: zmodyfikuj `/usr/X11R6/lib/X11/locale/iso8859-1/Compose`.
3. Mechanizm emacsowy uzyskiwany po załadowaniu "iso-insert.el" lub wywołaniu iso-accents-mode.

W X porządek obu symboli jest dowolny; i Compose-,-c i Compose-c-, dadzą dla Linuxa i emacsa domyślnie działa tylko ta pierwsza sekwencja. Dla X lista kombinacji złożeń jest ustalona. Linux i emacs są elastyczne. Te trzy domyślne listy są nieco podobne, ale różnią się szczegółami.

## 9. Różne właściwości konsoli

## 10. Jak wyjść z trybu surowego

Jeśli jakiś program używający trybu klawiatury K_RAW zakończy działanie bez przywrócenia trybu klawiatury do K_XLATE, trudno jest coś zrobić - nie działa nawet Ctrl-Alt-Del. Niemniej można czasami uniknąć naciskania przycisku Reset (co jest też pożądane; twoi użytkownicy mogą się zdenerwować jeśli przerwiesz im sesję Hacka przeładowaniem; możesz też uszkodzić swój system plików). Proste rozwiązania opierają się na zalogowaniu się z innego terminalu lub innego komputera i wykonania `kbd_mode -a`. Procedura poniżej zakłada że nie jest uruchomiony X, i że ekran znajduje się w trybie tekstowym, że znajdujesz się w znaku zachęty bash, że używasz amerykańskiego układu klawiatury i że znakiem który przerywa działanie komendy jest u ciebie Ctrl-C.

Krok 1. Uruchom X. Jak poniżej: naciśnij 2 (nie zwalniaj), naciśnij F12 (nie zwalniaj) i natychmiast potem naciśnij =. Uruchomi to X. (Wyjaśnienie: jeśli naciśnięcie klawisza wysyła kod klawisza K, to zwolnienie klawisza wysyła kod K+128. Być może twoja powłoka nie lubi tych znaków powyżej 128, więc unikamy wysłania ich nie zwalniając żadnego z klawiszy. Musimy jednak być szybcy, w przeciwnym razie nastąpi powtarzanie klawiszy. Cyfra 2 daje Ctrl-C, które usuwa poprzednie śmieci, F12 daje X, a = Return). Twój ekran może być teraz szary, ponieważ nie wskazano `.xinitrc`. Ctrl-Alt-Fn jednak działa, możesz więc przejść do innej WK (Ctrl-Alt-BS także działa, ale zwraca cię do poprzedniego stanu, a tego nie chcesz).

Step 2. Ustaw zmianę trybu klawiatury. (Na przykład poprzez `sleep 5; kbd_mode -a`).

Step 3. Opuść X. Alt-Fx (często Alt-F7) przywraca X, a wtedy Ctrl-Alt-Backspace powoduje wyjście z niego. W ciągu pięciu sekund twoja klawiatura znów będzie nadawała się do użytku.

Jeśli chcesz przygotować się na tą okoliczność, uczyń `\215A\301` (3 symbols) aliasem na `kbd_mode -a`. Teraz naciśnięcie tylko = F7 = (trzy symbole) przywróci cię do normalności.

## 11. Diody na klawiaturze

1. Są to znaczniki klawiatury zależne od `tty`; każda WK ma swój NumLock, CapsLock i ScrollLock. Domyślnie te znaczniki pokazywane są przez diody. Zwykłym sposobem ich zmiany jest naciśnięcie odpowiedniego klawisza (uwaga uboczna: naciśnięcie klawisza NumLock w trybie klawiszy aplikacji nie zmieni stanu NumLock, ale wypisze Esc-sekwencję. Jeśli chcesz żeby klawisz NumLock zawsze zmieniał stan NumLock, przypisz go do Bare_Num_Lock).

2. Następnie, na każde `tty` istnieją domyślne znaczniki klawiatury, aby zinicjalizować je gdy nastąpi przekasowanie. Tak więc jeśli chcesz żeby NumLock był cały czas włączony, jest to możliwe. Zwykle zmienić to można przez `setleds -D`.

3. Istnieje możliwość że diody nie oddają stanu znaczników klawiatury, ale coś innego.

3A. To coś innego może być jakimiś trzema bitami gdzieś w jądrze - co można wykorzystać jeżeli chcesz pilnować bitów stanu jakiegoś sprzętu czy programu. Jeśli chcesz tego, zmodyfikuj źródło jądra aby wywoływało gdzieś `register_leds()`/

3B. To coś innego może być też czymkolwiek co jakiś program chce pokazać za pomocą diod. Tak więc osoby które lubią takie rzeczy mogą ułożyć ze światełek ładne wzorki. Jeśli chcesz tego, użyj ioctl KBSETLED.

To drugi sposób nie jest "na tty", ale wybór pomiędzy pierwszym a drugim sposobem jest.

Podsumowując: każde `tty` ma znacznik kbd -> ledmode. Jeśli ma on wartość LED_SHOW_FLAGS, wtdy pokazane są znaczniki klawiatury (NumLock itd.) konkretnego `tty`. Jeśli ma on wartość LED_SHOW_IOCTL, wtedy diody pokazują każdą wartość którą ostatnio im przypisano za pomocą ioctl KBSETLED.

Dodać można że `X` używa ioctl-ów aby ustawić diody, ale nie kasuje swojej WK przy wyjściu, tak więc po używaniu `X` istnieć może jedna WK która nie jest w domyślnym stanie LED_SHOW_FLAGS. Można to naprawić wykonując `setleds -L` na tej WK. Patrz setleds(1).

## 12. Zmienna TERM

Wiele programów używa zmiennej `TERM` i bazy danych `/etc/termcap` lub `/usr/lib/terminfo/*` żeby zadecydować które ciągi znaków wysłać by wyczyścić ekran, przesunąć kursor itd., i często także by zdecydować który ciąg znaków wysyłany jest przez klawisz wstecznej spacji [użytkownika], klawisze funkcyjne itp. Tą wartość ustawia zrazu jądro (dla konsoli). Zwykle wartość tą ponownie ustawia `getty`, używając `/etc/ttytype` lub argumentu podanego w `/etc/inittab`. Czasami jest ona również ustawiana w `/etc/profile`.

Starsze systemy używają `TERM=console` lub `TERM=co80x25`. Nowsze systemy (z ncurses 1.8.6) używają bardziej dookreślonego `TERM=linux` lub `TERM=linux-80x25`. Niemniej starsze wersje `setterm` sprawdzają obecność `TERM` równej con* i dlatego odmawiają pracy z `TERM=linux`.

Od wersji jądra 1.3.2, domyślną wartością jądra dla konsoli jest `TERM=linux`.

Jeśli masz plik termcap bez kawałka opisującego linux, dodaj słowo linux do kawałka dla konsoli:

> `

>             console|con80x25|linux:\

> `

i ustaw `/usr/lib/terminfo/l/linux` jako kopię lub odnośnik symboliczny do `/usr/lib/terminfo/c/console`.

## 12.1 Terminfo

W kawałku terminfo dla konsoli linuxowej od ncurses 1.8.6 brakuje `kich1=\E[2~`, czego potrzebują niektóre programy. Wyedytuj plik i skompiluj go `tic`.

## 13. Jak zmusić inne programy do działania ze znakami spoza ASCII

W dawnych złych czasach było to wcale nużące. Każdy program z osobna musiał być indywidualnie przekonywany do zostawienia twoich bitów w spokoju. Nie żeby dzisiaj wszystko było łatwe, ale ostatnio wiele narzędzi GNU nauczyło się reagować na `LC_CTYPE=iso_8859_1` lub `LC_CTYPE=iso-8859-1`. Spróbuj najpierw tego; jeśli nie pomoże, spójrz na podpowiedzi poniżej. Zauważ że w nowszych wersjach `libc` procedura `setlocale()` działa tylko jeżeli zainstalowałeś pliki locale (tj. w `/usr/lib/locale`).

Przede wszystkim ósmy bit powinien przetrwać przetwarzanie danych wejściowych w jądrze, więc upewnij się że ustawiłeś `stty cs8 -istrip -parenb`

A. Dla `emacsa` szczegóły w dużym stopniu zależą od wersji. Informacja poniżej dotyczy wersji 19.34. Wstaw linie:

> `

>             (set-input-mode nil nil 1)
>             (standard-display-european t)
>             (require 'iso-syntax)

> `

do swojego `$HOME/.emacs`. Pierwsza linia (mówiąc ściślej - końcowe 1) mówi `emacsowi` żeby nie obcinał ósmego bitu ze wprowadzanych znaków. Druga linia mówi `emacsowi` żeby nie wyświetlał znaków spoza ASCII jako wartości ósemkowych. Trzecia linia wyszczególnia właściwości składni i tablicę konwersji małych/dużych liter dla zestawu znaków Latin-1. Dwie ostatnie linie są zbędne jeżeli masz coś podobnego do LC_TYPE=ISO-8859-1 w swoim środowisku (zmienna ta może też nazywać się LC_ALL albo po prostu LANG. Jej wartość może być czymkolwiek co zawiera ciąg znaków 88591, 8859-1 lub 8859_1).

To już dobry początek. Na terminalach które nie potrafią wyświetlać symboli ISO-8859-1 spoza ASCII, komenda

> `

>             (load-library "iso-ascii")

> `

spowoduje że znaki akcentowane wyświetlane będą jako {,c}a. Jeśli twoja klawiatura nie daje łatwego sposobu wprowadzania znaków spoza ASCII, to

> `

>             (load-library "iso-transl")

> `

uczyni dwuznakową sekwencję ^X8 znakiem składania [Compose], tak że czteroznakowa sekwencja ^X8,c daje c-cedilla. Bardzo niewygodne.

Komenda

> `

>             (iso-accents-mode)

> `

włączy lub wyłączy tryb akcentów ISO-8859-1, w którym sześc klawiszy: `, ', ", ^, , / są klawiszami diakrytyk które modyfikują następujący po nich symbol. Kombinacje specjalne: c daje c z cedillą, d daje islandzkie eth, t daje islandzkie thorn, "s daje niemieckie scharfes-s, /a daje a z kółeczkiem, /e daje ligaturę ae, < i > dają guillemoty, ! daje odwrócony wykrzyknik, ? odwrócony pytajnik. '' daje akcent acute. Jest to układ domyślny. Zmienna iso-languages jest listą par (nazwa języka, układ akcentów), a układ niedomyślny wybrać można poprzez

> `

>         (iso-accents-customize LANGUAGE)

> `

Tutaj LANGUAGE może być jednym z "portuguese", "irish", "french", "latin-2", "latin-1".

Ponieważ domyślnym klawiszem Compose w Linuxie jest Ctrl-., może być wygodniej używać tego wszędzie. Spróbuj

> `

>        (load-library "iso-insert.el")
>        (define-key global-map [?\C-.] 8859-1-map)

> `

(Ta ostatnia linia nie będzie działać pod `xterm`, jeśli używasz `emacs -nw`, ale w tym wypadku możesz wstawić)

> `

>             XTerm*VT100.Translations:       #override\n\
>             Ctrl <KeyPress> . : string("\0308")

> `

do swojego `.Xresources`.)

B. Dla `less`, ustaw zmienną środowiskową `LESSCHARSET=latin1` Zrób to również jeśli widzisz <255> lub <AD> w tym co wypisuje `man`; niektóre wersje `less` będą oddawać "miękki" myślnik (ósemkowo 0255, szesnastkowo 0xAD) w ten sposób, jeśli nie pozwoli im się wypisywać Latin-1.

[jeśli to nie pomoże, wywołuj `less` z opcją -r, bądź ustaw alias. Jeśli nawet to nie pomoże, albo masz powłokę która nie obsługuje aliasów, ustaw zmienną LESSCHARDEF na wartość 32.224c - przyp. tłum.]

C. Dla `ls`, podaj opcję `-N` (być może zechcesz ustawić alias)

D. Dla `bash` (wersja 1.13.*), wstaw

> `

>             set meta-flag on
>             set convert-meta off

> `

i, według Danish HOWTO,

> `

>             set output-meta on

> `

do swojego `$HOME/.inputrc`.

E. dla `tcsh`, użyj

> `

>             setenv LANG     US_en
>             setenv LC_CTYPE iso_8859_1

> `

Jeśli masz w swoim systemie `nls`, używane są odpowiednie algorytmy. W przeciwnym razie `tcsh` założy iso_8859_1, niezależnie od wartości podanych w zmiennych LANG i LC_TYPE. Patrz sekcja NATIVE LANGUAGE SYSTEM w tcsh(1). Danish HOWTO twierdzi: `setenv LC_CTYPE ISO-8859-1; stty pass8`)

F. Dla `flex`, podaj opcję `-8`, jeśli program przetwarzający który ono tworzy ma operować na ośmiobitowych danych wejściowych (oczywiście że ma).

G. Dla `elm`, ustaw `displaycharset` na `ISO-8859-1`. (Danish HOWTO: `LANG=C` i `LC_CTYPE=ISO-8859-1`)

H. Dla programów używających curses (takich jak `lynx` David Sibley donosi: "Zwykły pakiet curses używa ósmego bitu dla odwrócenia kolorów tła i ekranu (patrz flaga _STANDOUT zdefiniowana w `/usr/include/curses.h`). Niemniej `ncurses` zdaje się być czyste ośmiobitowo i wyświetla iso-latin-8859-1 poprawnie.

I. Dla programów używających `groff` (takich jak `man`), upewnij się że używasz `-Tlatin` zamiast `-Tascii`. Stare wersje programu `man` używają również `col`, więc następny punkt stosuje się odpowiednio.

J. Dla `col`, upewnij się że 1) ustawiony jest tak żeby wykonywać `setlocale(LC_CTYPE,"");` i 2) ustawiłeś zmienną środowiskową `LC_CTYPE=ISO-8859-1`.

K. Dla `rlogin`, użyj opcji `-8`.

L. Dla `joe`, `sunsite.unc.edu:/pub/Linux/apps/editors/joe-1.0.8-linux.tar.gz` działa podobno po wyedytowaniu pliku konfiguracyjnego. Ktoś inny powiedział: "`joe`: wstaw opcję `-asis` do `/isr/lib/joerc`, w pierwszej kolumnie.

M. Dla LaTeX: `\documentstyle[isolatin]{article}`. Dla LaTeX2e: `\documentclass{article}\usepackage{isolatin}` gdzie `isolatin.sty` jest dostępny z `ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit`.

Ładna dyskusja na temat ISO-8859-1 i tego jak zarządzać ośmiobitowymi znakami zawarta jest w pliku `grasp.insa-lyon.fr:/pub/faq/fr/accents` (po francusku). Inną ładną dyskusję (po angielsku) można znależć w `rtfm.mit.edu:pub/usenet-by-group/comp.answers/character-sets/iso-8859-1-faq`. A jeszcze jedną (?), w `ftp.vlsivie.tuwien.ac.at:/pub/8bit/FAQ-ISO-8859-1`.

Jeśli chcesz poprawić program który żle zachowuje się ze znakami ośmiobitowymi, musisz pamiętać o tym że jeśli używasz w nim typu "signed char", znaki mogą mieć wartości ujemne, a używanie ich jako indeksu tablicy nie uda się. Niektóre programy można poprawić dodając rozsądnie rzutowania na typ unsigned char.

## 14. Co dokładnie robi XFree86-2.1 podczas inicjalizacji układu klawiatury?

Od wersji 2.1 XFree86 zainicjuje swój układ klawiatury z układu linuxowego, na tyle na ile można. Linux jednak miał 16 pozycji na klawisz (jedna na każdą kombinację modyfikatorów Shift, AltGr, Ctrl, Alt) a obecnie 256 pozycji na klawisz, podczas gdy X ma cztery pozycje na klawisz (jedna na każdą kombinację Shift i Mod), tak więc część informacji musi się zgubić.

`X` najpierw czyta plik `Xconfig`, gdzie można znależć definicje klawiszy LeftAlt, RightAlt, RightCtl, ScrollLock keys takie jak Meta, ModeShift, Compose, ModeLock czy ScrollLock - patrz X386keybd(1), później XFree86kbd(1).

Za Mod przyjmuje się lewy Alt, chyba że prawy Ctrl zdefiniowano jako ModeShift lub ModeLock, w którym to przypadku przyjmuje się prawy Ctrl, lub chyba że tak zdefiniowano prawy Alt, w którym to przypadku przyjmuje się prawy Alt. Ustala to w jaki sposób cztery znaczenia klawisza pod XFree86 są wybierane z szesnastu znaczeń linuxowych. Zauważ że dzisiaj Linux domyślnie nie rozróżnia pomiędzy dwoma klawiszami Ctrl i Shift. X jednak rozróżnia.

Następnie czytany jest układ klawiatury z jądra i poczynione zostają oczywiste odpowiednie przypisania pod X. Przypisania "klawiszy czynnościowych" - Show_Memory, Show_State, Show_Registers, Last_Console, Console_n, Scroll_Backward, Scroll_Forward, Caps_On and Boot są ignorowane, tak samo jak klawisze diakrytyk i klawisze blokujące klawiaturę w określonym trybie [locks] (z wyjątkiem ShiftLock), oraz klawisze "ASCII-x"

Później używane są definicje z pliku `Xconfig`. Tak więc definicja klawisza Compose z `Xconfig` weźmie górę nad wartością znajdującą się w układzie klawiatury Linuxa.

Co dzieje się z ciągami znaków skojarzonymi z klawiszami funkcyjnymi? Nic. X nie posiada takiej koncepcji (ale możliwe jest zdefiniowanie łańcuchów znaków dla klawiszy funkcyjnych w `xterm` - zauważ jednak że najpierw otrzymuje te klawisze program zarządzający oknami).

Nie wiem jak przekonać `xterm` że powinien używać układu klawiatury X w czasie naciskania Alt; wydaje się że po prostu patrzy na swój zasób `eightBitInput`, i zależnie od tego jaką ma wartość logiczną albo ustawia ósmy bit znaku, albo wypisuje dodatkowy znak Escape (tak jak setmetamode(1) robi na konsoli).

## 15. Niecodzienne klawisze i klawiatury

Dwa klawisze: PrintScrn/SysRq i Pause/Break są szczególne w tym że mają one dwa kody klawiszy: pierwszy ma kody 84 z naciśniętym równocześnie Alt, i kod 99 w przeciwnym razie; drugi ma kod klawisza 101 z naciśniętym równocześnie Ctrl i kod 119 w przeciwnym razie. Tak więc nie ma sensu przypisywać funkcji Alt-kod 99 lub Ctrl-kod 119.

Jeśli masz dziwne klawisze które nie wypisują pod Linuxem żadnego kodu lub wysyłają komunikaty takie jak "unrecognized scancode"), a twoje jądro to 1.1.63 lub późniejsze, możesz użyć setkeycodes(1) by powiedzieć o nich [kodach] jądru. Nie będą one jednak działać pod X. Gdy przypisano im kod klawisza za pomocą `setkeycodes`, można im przypisać funkcję za pomocą `loadkeys`.

## 16. Przykłady użycia loadkeys i xmodmap

Zamiana Caps Lock i Control na klawiaturze (zakładając że używasz układów klawiatur 0-15; sprawdź przez `dumpkeys | head -1`)

> `

>       % loadkeys
>       keymaps 0-15
>       keycode 58 = Control
>       keycode 29 = Caps_Lock
>       %

> `

Powyższa zamiana tylko pod X:

> `

>       % xmodmap .xmodmaprc

> `

gdzie `.xmodmaprc` zawiera linie

> `

>       remove Lock = Caps_Lock
>       remove Control =  Control_L
>       keysym  Control_L  =  Caps_Lock
>       keysym  Caps_Lock  = Control_L
>       add Lock = Caps_Lock
>       add Control = Control_L

> `

O co chodzi z tymi numerami klawiszy? Backspace ma 14 pod Linuxem, a 22 pod X? No cóż, numery najlepiej uważać za przydzielone dowolnie; linuxowy numer klawisza znaleźć można używając showkey(1), a numer Xowy przez xev(1). Często numer Xowy będzie o 8 większy niż linuxowy.

Coś co ludzie chcą zmieniać to przypisania klawiszy funkcyjnych. Załóżmy że chcesz aby F12 wypisywał ciąg znaków "emacs". Wtedy

> `

>     % loadkeys
>     keycode 88 = F12
>     string F12 = "emacs "
>     %

> `

zrobi to. Ściślej, procedura wygląda mniej więcej tak: (i) znajdź kody klawiszy które mają mieć zmienione przypisania, za pomocą showkey(1), (ii) zachowaj bieżący układ klawiatury, zrób kopię i ją edytuj.

> `

>     % dumpkeys > my_keymap
>     % cp my_keymap trial_keymap
>     % emacs trial_keymap
>     % loadkeys trial_keymap
>     %

> `

Format tablicy zgadnąć można patrząc na wynik `dumpkeys`, a opisuje go keytables(5). Gdy nowy układ klawiatury działa tak jak tego chcemy, możesz wstawić wywołanie

> `

>                    loadkeys my_new_keymap

> `

do `/etc/rc.local` czy coś takiego, żeby wykonywać je automatycznie w czasie ładowania. Zauważ że zmiana klawiszy modyfikujących jest zawiła, a nowicjusz może łatwo wplątać się w sytuację z której wydostać się może tylko ekspert.

Domyślnym katalogiem układów klawiatur jest `/usr/lib/kbd/keytables`. Domyślnym rozszerzeniem plików układów jest .map. Tak więc `loadkeys uk` załaduje prawdopodobnie `/usr/lib/kbd/keytables/uk.map`.

(Na moim komputerze) `/dev/console` jest odnośnikiem symbolicznym do `/dev/tty0`, a jądro uważa `/dev/tty0` za synonim bieżącej WK. XFree86 zmienia właściciela `/dev/tty0`, ale nie przywraca stanu poprzedniego po zakończeniu. Tak więc polecenie dumpkeys może się nie powieść, ponieważ ktoś inny jest właścicielem `/dev/tty0`; w takim przypadku możesz wpierw uruchomić X.

## 16.1 "Mogę używać tylko jednego palca do pisania"

Czy klawisze Shift, Ctrl i Alt mogą się zachowywać jak przełączniki?

Tak, po napisaniu:

> `

>     % loadkeys
>     keycode 29 = Control_Lock
>     keycode 42 = Shift_Lock
>     keycode 56 = Alt_Lock
>     %

> `

klawisze lewy Control, Shift i Alt będą działać jako przełączniki. Odpowiednie numery podaje showkey (zwykle są to 29, 97, 42, 54, 56, 100 dla lewego i prawego Control, Shift i Alt odpowiednio), a funkcje to Control_Lock, Shift_Lock, Alt_Lock, ALtGr_Lock.

Co z klawiszami "sticky" [zachowywanymi w buforze do naciśnięcia następnego klawisza(y) - przyp. tłum.] ?

Od wersji 1.3.33, jądro wie o modyfikatorach "sticky". Działają one na następny naciśnięty klawisz. Tak więc, tam gdzie wcześniej trzeba było trzysymbolowej sekwencji Shift_Lock-a-Shift_Lock można teraz używać dwusymbolowej sekwencji SShift_Lock-a.

Bieżąca wersja pakietu `kbd` nie zawiera jeszcze kodu dla "stickies", tak więc trzeba je wywoływać używając ich kodów szesnastkowych. Na przykład:

> `

>     % loadkeys
>     keymaps 0-15
>     keycode 54 = 0x0c00
>     keycode 97 = 0x0c02
>     keycode 100 = 0x0c03
>     %

> `

uczyni prawe Shift, Ctrl i Alt wersjami "sticky" klawiszy lewych.

Od wersji 0.93 można napisać

> `

>        % loadkeys
>        keymaps 0-15
>        keycode 54 = SShift
>        keycode 97 = SCtrl
>        keycode 100 = SAlt
>        %

> `

by otrzymać ten sam rezultat. Pozwoli to napisać ci Ctrl-Alt-Del trzema naciśnięciami klawiszy, używając jednej ręki to obtain the same result.

## 17. Zmiana trybu ekranowego

Jak dotąd wiem o sześciu sposobach zmiany rozdzielczości:

1. W czasie kompilacji zmień linię

> `

>             SVGA_MODE=      -DSVGA_MODE=NORMAL_VGA

> `

w `/usr/src/linux/Makefile`.

1A. Po kompilacji użyj `rdev -v` - okropna łata, ale istnieje.

2. W czasie ładowania systemu: wstaw `vga=ask` do pliku konfiguracyjnego lilo [zwykle /etc/lilo.conf - przyp. tłum.], a lilo spyta się jakiego trybu ekranowego użyć. Kiedy już wiesz, wstaw tam `vga=mypreference`.

3.W czasie uruchamiania: A. Użyj komendy `resizecons` (jest to bardzo prymitywne opakowanie ioctl VT_RESIZE). B. Użyj komendy `SVGATextMode` (jest to mniej prymitywne opakowanie ioctl VT_RESIZE).

4. Nie "na konsoli":

Pod `dosemu`, bądź używając svgalib itd. możesz zmienić sprzętowy tryb ekranowy bez powiadamiania o tym konsoli. Czasami jest to użyteczne w ustawianiu `resizecons` lub `SVGATextMode` set up: użyj `dosemu` i jakiegoś programu DOSowego by przełączyć się na pożądany tryb ekranowy, zrzuć (powiedzmy z innej WK) zawartość wszystkich rejestrów sprzętowych karty graficznej, i użyj ich w inicjalizacji której wymagają `resizecons` i `SVGATextMode`. W niektórych przypadkach gdy tryb ekranowy przełączył się na jakiś stan nie do użytku, odpalenie `dosemu`, poleganie na BIOSie co do ustawienia trybu ekranowego i "zabicie" `dosemu` używając kill -9 jest najprostszą metodą przywrócenia porządku.

## 17.1 Instrukcje co do używania resizecons

Zdobądź svgalib i skompiluj program `restoretextmode`. Wystartuj komputer we wszystkich możliwych trybach ekranowych (używając `vga=ask`) w pliku konfiguracyjnym lilo i zapisz zawartość rejestrów sprzętowych karty graficznej do plików KxW (K=kolumny, W=wiersze), np. 80x25, 132x44 itd. Wstaw te pliki do `/usr/lib/kbd/videomodes`. Teraz `resizecons 132x44` zmieni tryb ekranowy za ciebie (i wyśle SIGWINCH do wszystkich procesów które o tym wiedzą, oraz załaduje inną czcionkę jeśli to konieczne).

Obecnie wykonanie `resizecons` kończy się sukcesem wtedy tylko gdy jest dość pamięci na starą i nową konsolę równocześnie.

## 18. Zmiana częstości powtarzania klawiszy

Przy starcie jądro Linuxa ustawia częstość powtarzania na wartość maksymalną. Dla większości klawiatur jest to rozsądne, ale dla niektórych oznacza że nie możesz dotknąć klawisza żeby nie otrzymać trzech kopii odpowiadającego mu symbolu. Użyj programu kbdrate(8) by zmienić częstość powtarzania lub, jeśli to nie pomoże, zmodyfikuj lub usuń sekcję

         ! ustaw częstość powtarzania klawiatury na maximum

             mov     ax,#0x0305
             xor     bx,bx           ! clear bx
             int     0x16

w `/usr/src/linux/[arch/i386/]boot/setup.S`.

## 19. Przewijanie

Istnieją dwa sposoby zmuszenia ekranu do przewinięcia się. Pierwsza, zwana "twardym przewijaniem" to pozostawienie tekstu w pamięci ekranu w bieżącej postaci, ale zmienienie punktu oglądania. Jest to bardzo szybkie. Druga, zwana "miękkim przewijaniem" polega na przesuwaniu całego ekranu tekstowego w górę lub dół. Jest to o wiele wolniejsze. Sterownik konsoli jądra wypisze tekst zaczynający się u górnej granicy pamięci ekranu, kontynuując aż do dołu, potem znów skopiuje część dolną na górną, i tak dalej, cały czas używając twardego przewijania by pokazać właściwą część ekranu. Możesz przewijać w tył aż do górnej granicy pamięci ekranu używając Shift-PageUp (szary PageUp) i z powrotem w dół używając Shift-PageDown (szary PageDown), zakładając domyślny układ klawiatury. Ile można przewinąć w tył wyznacza więc ilość pamięci ekranu którą masz, i nie możesz jej zwiększyć. Jeśli potrzebujesz przewinąć więcej, użyj jakiegoś programu który buforuje tekst, jak less czy screen - używając bufora na dysku możesz wrócić do tego co robiłeś tydzień temu. (dla `xterm` można ustawić możliwe przewijanie w tył dodając linię w rodzaju XTerm*saveLines: 2500 do .Xresources.)

Przy zmianie wirtualnych konsol zawartość ekranu starej WK jest kopiowana do pamięci jądra, a zawartość ekranu nowej WK jest kopiowana z pamięci jądra do pamięci ekranu. Tylko ekran widzialny jest kopiowany, nie całość pamięci ekranu, tak więc zmiana konsoli powoduje utratę całej informacji o przewijaniu.

Czasami twarde przewijanie nie jest pożądane, na przykład gdy sprzęt nie posiada możliwości zmiany punktu oglądania ekranu. Pierwszym przykładem byłą maszyna braillowska, która oddaje zawartość górnej części pamięci ekranu w braille'u. Istnieje opcja używana w czasie ładowania jądra (no-scroll, która mówi sterownikowi konsoli by nie używał twardego przewijania. Patrz bootparam(7)).

## 20. Wygaszanie ekranu

`setterm -blank` nn nakaże sterownikowi konsoli wygasić ekran po nn minutach bezczynności. Używając nn równego 0, wygaszanie można wyłączyć. W niektórych starszych jądrach nabierało to efektu dopiero po pierwszym przerwaniu klawiatury.

Opcja `s` xset(1) ustawi parametry wygaszacza pod X.

Sprzętowe tryby ekranowe oszczędzające energię można włączyć/wyłączyć używając programu `setvesablank` podanego w komentarzu na początku `/usr/src/linux/drivers/char/vesa_blank.c`.

## 21. Zrzuty ekranu

`setterm -dump N` zrzuci zawartość eranu /dev/ttyN do pliku `screen.dump` w bieżącym katalogu. Patrz setterm(1).

Prawidłową zawartość ekranu `/dev/ttyN` odczytać można używając urządzenia `/dev/vcsN` (gdzie "vcs" oznacza "virtual console screen"). Na przykład, mógłbyś uruchomiony zegar który wyświetla bieżący czas w górnym prawym rogu konsoli (patrz program vcstime w `kbd-0.92.tar.gz`). Samo zrzucenie zawartości następuje po `cat /dev/vcsN`. Owe urządzenia /dev/vcsN nie zawierają znaków LF (nowej linii), ani atrybutów (jak kolory). We wnętrzu programu lepiej jest zapewne zamiast tego użyć /dev/vcsaN ("virtual console screen w/ attributes") - zaczyna się ono nagłówkiem podającym liczbę wierszy i kolumn oraz położenie kursora. Patrz vcs(4).

## 22. Niektóre właściwości vt100 - tryb klawiszy aplikacji

: Czasami moje klawisze kursora dają dziwne kody.

Gdy terminal znajduje się w trybie klawiszy aplikacji klawisze kursora wypisują Esc O x, a w przeciwnym razie Esc [ x, gdzie x = A, B, C, D. Niektóre programy ustawiają terminal w tryb klawiszy aplikacji; jeśli przerwiesz je przez `kill -9`, albo jeśli padną, tryb nie zostanie przestawiony.

            % echo -e '\033c'

Kasuje wszystkie właściwości bieżącej WK do domyślnych. Zmiany tylko trybu klawiszy aplikacji dokonuje się przez:

            % echo -e '\033[?1h'

(ustawia) i

            % echo -e '\033[?1l'

(kasuje).

## 23. Niekompatybilość sprzętowa

Niektóre osoby zauważyły że tracą wpisywane znaki gdy aktywny jest napęd stacji dysków. Wygląda na to że może to być problem z płytami głównymi Uni-486WB.

(proszę napisać do mnie żeby potwierdzić: "tak, mam ten sam problem"; zaprzeczyć "nie, wszystko w porządku z moim Uni-486WB; zmienić: "mój komputer Xyz ma ten sam problem").

Tjalling Tjalkens (tjalling@ei.ele.tue.nl) donosi o bardzo podobnych problemach z "niemarkową płytą główną GMB-486 UNP VESA z procesorem AMD 486DX2-66" - w czasie pracy stacji dyskietek niektóre naciśnięcia klawiszy gubią się, w czasie pracy streamera (Conner C 250 MQ) traci się wiele naciśnięć.

Niektóre osoby doświadcząją sporadycznych zawieszeń - czasami związanych z pracą twardego dysku lub innego urządzenia I/O.

ulf@rio70.bln.sni.de (Ulf Tietz) pisze: "Miałem te same problemy gdy dostroiłem swoją płytę główną na zbyt dużą szybkość. Ustawiłem więc wszystkie czasy oczekiwania (CLK, wait statements) na bardziej konwencjonalne wartości, i problemy zniknęły".

bhogan@crl.com (Bill Hogan) pisze: "Jeśli masz AMI BIOS, możesz spróbować ustawić emulację Gate A20 na "chipset" (jeśli masz taką opcję). Za każdym razem gdy miałem ten parametr ustawiony na jakąś inną opcję ("fast", "both", "disabled"), miałem częste zawieszenia się klawiatury".

--------------------------------------------------------------------

Uprasza się o dodatki i poprawki Andries Brouwer - aeb@cwi.nl