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.

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

# #

Hosting by: Hurra Communications Sp. z o.o.
Generated: 2007-01-26 18:02:23