The Linux Keyboard HOWTO
Andries Brouwer,
[email protected]
v2.1, 8 Novembre 1995 - version francaise Bruno Viaris
Ce document traite de l'utilisation du clavier, de la console et de
caracteres non ASCII sous Linux.
11.. PPrrooggrraammmmeess uuttiilleess
Les paquetages suivants contiennent des programmes en rapport avec le
clavier ou la console.
kbd-0.90.tar.gz contient loadkeys, dumpkeys, showkey, setmetamode,
setleds, setfont, showfont, mapscrn, kbd_mode, chvt, resizecons,
disalloc, getkeycodes, setkeycodes.
util-linux-2.5 contient setterm, kbdrate.
shellutils-1.8 (ou stty.tar.gz) contient stty.
open-1.1.tgz contient open. (Voir aussi dynamic-vc-1.1.tar.gz.)
SVGATextMode-0.9.tar.gz contient SVGATextMode.
La distribution standard de X contient xmodmap, xset, kbd_mode. (Voir
aussi X386keybd(1).)
22.. LLee ccllaavviieerr -- ggeenneerraalliitteess
Quand on appuie sur une touche, le controleur clavier envoie des
scancodes au pilote clavier du noyau. Certains claviers sont
programmables, mais en general les scancodes sont fixes. Quand le
pilote clavier est en _m_o_d_e _s_c_a_n_c_o_d_e (dit aussi _m_o_d_e _r_a_w), le noyau se
contente de transmettre les codes tels quels a l'application, c'est ce
qui se passe sous X. Sinon le flux de scancodes est decompose en
keycodes correspondant a l'appui ou au relachement d'une touche. (Le
simple fait d'appuyer sur une touche peut produire jusqu'a 6
scancodes, reduits ici en un seul keycode.) Si le pilote clavier est
en _m_o_d_e _k_e_y_c_o_d_e (ou _m_o_d_e _m_e_d_i_u_m_r_a_w), l'application recoit les keycodes
(ce mode est utilise, par exemple, par showkey). Sinon, les keycodes
sont traduits d'apres une table (keymap), ensuite, soit un caractere
(ou un chaine) est envoye a l'application, soit une action est
declenchee. (Exemple: si on appuie et relache la touche q, le clavier
envoie les scancodes 0x1E et 0x9E, ce qui est converti en keycodes 30
et 158, puis en la valeur 113, qui est le code ASCII ou Latin-1 de q
(avec un clavier Azerty et une keymap adaptee). Si on appuie et
relache la touche Suppr, le clavier envoie les scancodes 0xE0 0x53
0xE0 0xD3, convertis en keycodes 111 et 239, ce qui donne finalement
la sequence ESC [ 3 ~. Ctrl-Alt-Suppr est une combinaison de touches
qui declenche une action.)
La conversion de scancodes exotiques en keycodes peut etre programmee
avec l'utilitaire setkeycodes, mais peu de gens ont besoin. La table
de traduction des keycodes en caracteres, chaines ou actions, i.e. la
keymap, se manipule grace a loadkeys. Pour plus de details, voir
getkeycodes(8), setkeycodes(8), dumpkeys(1), loadkeys(1).
Dans ce paragraphe, le terme `envoye a l'application' signifie en fait
`transmis au pilote du terminal'. Le texte est ensuite traite de la
meme facon que s'il venait d'une ligne serie. Les details de ce
traitement sont ajustes par le programme stty.
33.. LLaa ccoonnssoollee -- ggeenneerraalliitteess
A l'inverse, quand on envoie des caracteres a la console, ils
subissent un traitement standard (regle par stty), puis sont envoyes
au pilote de la console. Le pilote de la console emule un terminal
VT100, et scrute les donnees recues pour intercepter les sequences
escape (du genre deplacement du curseur, effacement de l'ecran, etc.).
Les autres octets sont, apres une eventuelle conversion par la table
de conversion de la console, ecrits dans la memoire video. La carte
video affiche ces caracters en utilisant une police stockee dans sa
memoire. On peut changer cette police en utilisant setfont, et la
table de conversion de la console peut etre modifiee avec mapscrn.
Pour plus de details, voir plus bas.
44.. RReeiinniittiiaalliisseerr llee tteerrmmiinnaall
L'ecran est plein de cochonneries, tout ce qu'on tape apparait sous
forme de petits dessins. Que faire ?
De nombreux programmes retracent l'ecran quand on tape ^L, ce qui peut
etre utile en cas de modem bruite ou de messages intempestifs a
l'ecran. La commande clear efface l'ecran.
La commande reset reinitialise le pilote de la console. Elle est bien
utile quand l'ecran est plein de ces jolis caracteres graphiques
illisibles, ou quand l'affichage est reduit a la ligne du bas. Si
vous ne disposez pas de cette commande, ou si elle fait autre chose,
voici le remede: mettez ces deux lignes dans un fichier executable
reset quelque part dans votre PATH:
#!/bin/sh
echo -e \\033c
ce qui envoie la sequence ESC c a la console. Si vous avez charge une
police bizarre et que vous voulez revenir a la police par defaut,
% setfont
fera l'affaire (a condition que la police par defaut soit a sa place).
Sur de vieux terminaux, l'utilisation de tabs peut demander un delai,
executer alors
% stty tab3
(voir stty(1)). Pour changer de mode video, utiliser resizecons ou
SVGATextMode. Ceci regle generalement la partie affichage. Cote
clavier, il peut y avoir encore pas mal de problemes. Si X, DOOM ou
tout autre programme travaillant en mode raw (ou mediumraw) se plante,
le clavier peut rester dans ce mode et il est alors difficile d'exe-
cuter la moindre commande. (Voir "Comment sortir du mode raw" plus
loin.)
44..11.. KKeeyybbooaarrdd hhaarrddwwaarree rreesseett
Le probleme peut parfois se situer a un niveau encore plus bas. Il y
a au moins deux niveaux (le clavier et le controleur clavier) ou l'on
peut envoyer la commande "desactiver le clavier" au materiel. De plus
les claviers ont souvent trois tables de scancodes utilisables au
choix.
Je n'ai cependant jamais entendu parler de cas ou cela ait pose un
probleme.
Certains claviers ont une fonction de reprogrammation des touches.
Stormy Henderson (
[email protected]) ecrit:
`Si votre clavier a ete accidentellement reprogramme, vous
pouvez (avec un clavier Gateway AnyKey) appuyer sur control-
alt-suspend_macro pour remettre les choses en place.'
55.. DDeelleettee eett BBaacckkssppaaccee
55..11.. CCoommmmeenntt cchhooiissiirr llee ccaarraacctteerree aa uuttiilliisseerr ppoouurr eeffffaacceerr llee ddeerrnniieerr
ccaarraacctteerree ttaappee
% stty erase ^?
Si le caractere est efface, mais d'une maniere bizarre, c'est que les
parametres du terminal sont mauvais. Si echoprt est active, les carac-
teres effaces s'affichent entre \ et /. Si echoe est desactive, les
caracteres ne sont plus effaces a l'ecran, mais leur effacement est
signale par l'affichage du caractere d'effacement, exemple:
Libux###nux (avec # comme caractere d'effacement).
On utilisera donc generalement stty echoe -echoprt. La commande stty
sane activera ces parametres et bien d'autres. La commande stty -a
affiche les parametres actuels. Pourquoi ces parametres ne sont pas
actives par defaut ? Il suffit d'utiliser le bon getty.
Il est a noter que beaucoup de programmes (comme bash, emacs etc.) ont
leur propres assignations de touches (definis dans ~/.inputrc,
~/.emacs, etc.) et ne tiennent pas compte de ces parametres de
terminal.
55..11..11.. ``GGeettttyy ccoommpprreennaaiitt bbiieenn DDEELL eett BBSS,, mmaaiiss pplluuss mmaaiinntteennaanntt ??''
Jadis, la console traduisait DEL (\177) en BS Espace BS
(\010\040\010).
Les DEL sont desormais ignores (comme le devrait toute emulation vt100
fidele). Choisissez un meilleur getty, i.e., qui n'affiche pas les
DEL.
55..11..22.. ``LLooggiinn nnee ffaaiitt ppaass llaa mmeemmee cchhoossee aauu pprreemmiieerr eett aauu ddeeuuxxiieemmee
eessssaaii??''
Au premier essai, on parle a getty, au deuxieme a login, deux
programmes distincts qui peuvent se comporter differemment.
55..22.. CCoommmmeenntt ddiirree aa LLiinnuuxx qquueell ccooddee ggeenneerreerr aa ll''aappppuuii ssuurr uunnee ttoouucchhee
Quand on utilise la console, ou plus precisement, quand le clavier
n'est pas en mode (medium)raw, il faut utiliser:
% loadkeys monclavier.map
Sous X, utiliser:
% xmodmap monclavier.xmap
Remarque: depuis XFree86-2.1, X initialise son clavier a partir de la
configuration du clavier de la console. Bien que les deux systemes ne
soient pas 100% compatibles, cette technique rend generalement l'util-
isation de xmodmap superflue.
Si, par exemple, si vous voulez que la touche Backspace genere le code
BackSpace (^H), au lieu du code par defaut (Delete), faites:
% loadkeys
keycode 14 = BackSpace
%
55..22..11.. ``PPoouurrqquuooii llaa ttoouucchhee BBaacckkSSppaaccee nnee ggeenneerree ppaass BBaacckkSSppaaccee ppaarr
ddeeffaauutt ??''
(i) Parce que les terminaux VT100 ont une touche Delete au dessus de
la touche Entree.
(ii) Parce que Linus en a decide ainsi.
55..33.. CCoommmmeenntt ddiirree aa XX dd''eecchhaannggeerr DDeelleettee eett BBaacckkssppaaccee
% xmodmap -e "keysym BackSpace = Delete" -e "keysym Delete = BackSpace"
Ou, si vous voulez juste que Backspace genere le code BackSpace:
% xmodmap -e "keycode 22 = BackSpace"
Ou, si vous voulez juste que Delete genere le code Delete:
% xmodmap -e "keycode 107 = Delete"
(mais generalement c'est deja la disposition par defaut).
55..44.. CCoommmmeenntt ddiirree aa eemmaaccss ccee qquu''iill ddooiitt ffaaiirree ddeess ccooddeess DDeelleettee eett
BBaacckkssppaaccee
Mettez dans votre .emacs les lignes:
(global-set-key "\?" 'delete-backward-char)
(global-set-key "\C-h" 'help-command)
Bien sur, vous pouvez associer d'autres commandes a d'autres touches
de la meme maniere.
55..55.. CCoommmmeenntt ddiirree aa eemmaaccss ddee ppeerrmmuutteerr DDeelleettee eett BBaacckkssppaaccee
Mettez dans votre .emacs les lignes:
(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)
55..66.. CCoommmmeenntt ddiirree aa kkeerrmmiitt dd''eecchhaannggeerr DDeelleettee eett BBaacckkssppaaccee
Mettez dans votre .kermrc les lignes:
set key \127 \8
set key \8 \127
55..77.. CCoommmmeenntt rreegglleerr xxtteerrmm sseelloonn vvooss mmooddeess ddee tteerrmmiinnaall pprreeffeerreess
Normalement xterm herite des modes de terminal du processus qui
l'appelle. Pour xdm, les caracteres erase et kill sont # et @, comme
sur les bons vieux Unix Version 6. Si ca ne vous plait pas, vous
pouvez mettre
XTerm*ttymodes: erase ^? kill ^U intr ^C quit ^\ eof ^D susp ^Z start ^Q stop ^S eol ^@
dans /usr/lib/X11/app-defaults/XTerm ou dans $HOME/.Xresources, a con-
dition d'executer la commande
xrdb $HOME/.Xresources
dans votre $HOME/.xinitrc.
55..88.. CCoommmmeenntt ddiirree aa xxmmoossaaiicc qquuee llaa ttoouucchhee BBaacckkssppaaccee ggeenneerree uunnee DDEELL
Mettre
*XmText.translations: #override\n\
<Key>osfDelete: delete-previous-character()
*XmTextField.translations: #override\n\
<Key>osfDelete: delete-previous-character()
dans votre $HOME/.Xresources devrait faire l'affaire.
Cependant, la FAQ de netscape dit:
Pourquoi ma touche Backspace ne marche pas dans les boites texte ?
Par defaut, Linux et XFree86 ont leur touches Backspace et Delete
mal configurees. Tous les programmes Motif (y compris Netscape
Navigator) auront les memes problemes.
Les specifications Motif disent que Backspace doit effacer le
caractere precedent et Delete le caractere suivant. Par defaut sous
Linux et XFree86 Backspace et Delete generent le code DEL.
Le probleme peut etre resolu en utilisant un programme tel que
xmodmap, xkeycaps, ou loadkeys pour que la touche Backspace
genere le code BackSpace au lieu de Delete.
Une autre solution consiste a avoir un fichier .motifbind;
voir la page de manuel de VirtualBindings(3).
Note: n'utilisez pas les ressources *XmText.translations ou
*XmTextField.translations pour essayer de resoudre ce probleme.
Si vous le faites, vous annulez toutes les autres programmations
de touches dans les boites textes de Netscape Navigator.
55..99.. EEtt lleess ffiicchhiieerr tteerrmmccaapp eett tteerrmmiinnffoo??
Les gens qui ont des problemes avec backspace ont tendance a aller
voir dans leur fichier termcap (ou terminfo), et effectivement la
ressource kb (ou kbs) decrit le code genere par la touche Backspace.
Cependant peu de programmes utilisent ces bases de donnees pour
rechercher le code envoye par backspace, donc, a moins de n'avoir des
problemes qu'avec certains programmes, il faut en general chercher
ailleurs. Cela dit, il vaut mieux de toute facon avoir un termcap (ou
terminfo) correct. Voir aussi "La variable TERM" plus loin.
66.. LLeess ttaabblleess ddee ccaarraacctteerreess ddee llaa ccoonnssoollee
Le noyau a quatre tables de conversion des octets en symboles ecran:
a) Latin1 -> PC, b) VT100 graphique -> PC, c) PC -> PC, d)
utilisateur.
Il y a deux tables de caracteres, appelees G0 et G1, dont l'une est la
table courante. (Initialement G0.) Taper ^N fait passer a la table
G1, ^O a la table G0.
Ces variables G0 et G1 pointent sur des tables de conversion et
peuvent etres changees par l'utilisateur. Initialement, elles pointent
respectivement sur les tables a) et b). Les sequences ESC ( B , ESC (
0 , ESC ( U et ESC ( K font respectivement pointer G0 sur les tables
de conversion a), b), c) et d). Les sequences ESC ) B , ESC ) 0 , ESC
) U et ESC ) K font respectivement pointer G0 sur les tables de
conversion a), b), c) et d).
La sequence ESC c provoque une reinitialisation complete du terminal,
ce qui peut etre necessaire si l'ecran est tout brouille. La commande
echo ^V^O, souvent conseillee, ne fera que rappeler la table G0, mais
rien ne garantit que G0 pointe sur la table a). Certaines
distributions ont un programme reset(1) qui fait juste un echo ^[c.
Si votre termcap pour la console est correcte (et a une entree
:rs=\Ec:), alors vous pouvez utiliser setterm -reset.
La table de conversion d) peut etre definie par mapscrn(8). Le
resultat est que si un symbole c est affiche, c'est le symbole s =
map[c] qui est mis dans la memoire video. L'image du caractere s se
trouve dans la memoire de la carte video et peut etre modifiee avec
setfont(8).
77.. CChhaannggeerr ddee ccoonnssoollee
Par defaut, le changement de console se fait par Alt-Fn ou Ctrl-Alt-
Fn. Sous X (ou les versions recentes de dosemu), seule la combinaison
Ctrl-Alt-Fn marche.
XFree86 1.3 ne sait pas que la touche Alt est enfoncee quand on
rappelle la fenetre X. Il faut donc relacher Alt avant de pouvoir
rechanger de console. Pourtant, ca pourrait marcher: le noyau
memorise toujours l'etat appuye/relache des touches. (Autant que faire
se peut: certains clavier n'emettent pas de scancode quand on appuie
dessus (ex: les touches PFn d'un FOCUS 9000) ou quand on les relache
(ex: la touche Pause de la plupart des claviers).)
XFree86 1.3 sauve les polices chargees sur la carte video quand il est
demarre, et les restaure lors d'un changement de console. Donc le
resultat d'un setfont sur une console virtuelle est annule par un
aller retour dans la fenetre X. L'utilisation de setfont sous X donne
des resultats bizarres...
Le changement de console par programme est possible grace a la
commande chvt.
77..11.. CChhaannggeerr llee nnoommbbrree ddee CCoonnssoolleess VViirrttuueelllleess
Cette question est toujours posee de temps en temps, mais la reponse
est: il y en a deja suffisament. Depuis la version 1.1.54 du noyau,
il y a entre 1 et 63 consoles virtuelles. Une nouvelle console est
creee des qu'elle est ouverte. Elle peut etre supprimee avec disalloc
(mais il faut que plus aucun processus ne lui soit associe).
Pour les vieux noyaux, changer la ligne
#define NR_CONSOLES 8
dans include/linux/tty.h (ne pas depasser 63), et recompiler. Il est
possible que vous ayez a creer le peripherique correspondant avec
MAKEDEV ou mknod ttyN c 4 N ou N est le numero du terminal. Si vous
voulez avoir des getty sur ces nouvelles consoles, ajoutez des lignes
dans /etc/inittab.
Quand les consoles sont allouees dynamiquement, il est generalement
plus simple de n'avoir qu'un ou deux getty. D'autres consoles sont
ouvertes par open -l -s bash. Les consoles inutilisees (sans processus
associe) sont desallouees par disalloc.
Si vous disposez de spawn_login (inclus dans kbd-0.90.tar.gz) et que
vous mettez
loadkeys << EOF
alt keycode 103 = Spawn_Console
EOF
spawn_login &
dans /etc/rc.local, taper Alt-FlecheHaute creera (et affichera) une
nouvelle console avec un login. Voir aussi open-1.3.tgz.
Vous ne pouvez vous loger sous "root" que sur les terminaux listes
dans /etc/securetty.
88.. CCttrrll--AAlltt--DDeell eett aauuttrreess ccoommbbiinnaaiissoonnss ssppeecciiaalleess
88..11.. CCttrrll--AAlltt--DDeell ((BBoooott))
Quand on appuie sur Ctrl-Alt-Del (ou toute autre combinaison a
laquelle loadkeys associe le keycode Boot), soit la machine reboote
immediatement (sans sync), soit le signal SIGINT est envoye a init (ce
qui est le comportement par defaut, changeable par l'appel systeme
reboot(), voir ctrlaltdel(8)). Certains init changent le defaut. Ce
qui se produit quand init recoit SIGINT depend de la version du init
utilisee et est souvent determine par le ligne pf du fichier
/etc/inittab (on peut dans ce cas lancer n'importe quel programme).
Dans les versions actuelles du noyau Ctrl-AltGr-Del n'est plus assigne
par defaut a Boot.
88..22.. AAuuttrreess ccoommbbiinnaaiissoonnss
Combinaisons par defaut avant utilisation de loadkeys, donc en qwerty.
Nom du keycode Combinaison
-------------------------------
Show_Memory Shift-Scrollock
Show_Registers AltGr-ScrollLock
Show_State Ctrl-ScrollLock
Console_n Alt-Fn and Ctrl-Alt-Fn (1 <= n <= 12)
Console_{n+12} AltGr-Fn (1 <= n <= 12)
Incr_Console Alt-FlecheDroite
Decr_Console Alt-FlecheGauche
Last_Console Alt[Gr]-ImprEcran
Scroll_Backward Shift-PgPrec
Scroll_Forward Shift-PgSuiv
Compose Ctrl-. (Ctrl-: sur clavier azerty)
Caps_On <pas defini> (Par defaut CapsLock est un va-et-vient,
Caps_Shift <pas defini> ces Keycodes servent a recreer le desagreable
comportement MS-Keyb Fr)
88..33.. CCoommbbiinnaaiissoonnss ssoouuss XX
Ctrl-Alt-Fn Affiche la console virtuelle n
Ctrl-Alt-KP+ Resolution suivante
Ctrl-Alt-KP- Resolution precedente
Ctrl-Alt-Backspace Tue le serveur X
Sur certaines cartes-meres, Ctrl-Alt-KP- et Ctrl-Alt-KP+ emulent le
bouton Turbo. Ces sequences produisent les scancodes 1d 38 4a ca b8 9d
et 1d 38 4e ce b8 9d, et toutes deux changent la vitesse de Turbo (>=
25MHz) a non-Turbo (8 or 12 MHz) et vice-versa. (souvent ce comporte-
ment peut etre desactive par un cavalier sur la carte-mere.)
Perry F Nguyen (
[email protected]) ecrit:
Les BIOS AMI permettent de bloquer le clavier et de faire
clignoter les LEDs quand on appuie sur Ctrl-Alt-Backspace et
qu'un mot de passe BIOS est defini, et ce jusqu'a ce que
celui-ci soit tape.
88..44.. CCoommbbiinnaaiissoonnss ssoouuss DDoosseemmuu
Ctrl-Alt-Fn Rappelle la console n (versions >0.50; avant Alt-Fn)
Ctrl-Alt-PgDn Tue dosemu (quand le calvier est en mode RAW)
(et bien d'autres, voir la documentation de dosemu)
88..55.. CCoommppoossiittiioonn ddee ssyymmbboolleess
Un symbole peut etre construit en utilisant plusieurs frappes.
+o En mode Ascii, taper un code Ascii en decimal sur le pave
numerique, tout en maintenant la touche Alt enfoncee, produit le
caractere en question quand on relache Alt. (En mode Unicode, il
faut taper le code hexadecimal a 4 chiffres du symbole)
+o L'appui sur un accent mort puis sur une lettre produit cette lettre
accentuee (si possible, sinon l'accent suivi de la lettre). Les
touche mortes sont definissables par l'utilisateur (grace a
loadkeys(1)). Il y a cinq possibilites:
accent keycode mort keycode normal
------------------------------------------------------
accent grave dead_grave grave
accent aigu dead_acute apostrophe
accent circonflexe dead_circumflex asciicircum
tilde dead_tilde asciitilde
trema dead_diaeresis diaeresis
Par defaut aucune touche du clavier n'est morte. Le resultat est
celui de Compose + accent + lettre (et est donc redefinissable, cf
plus bas).
NDT: pour des francophones utilisant un clavier Azerty, il
vaut generalement mieux se contenter de definir comme
touches mortes l'accent circonflexe et le trema de la touche
a droite du `P'. Il est sinon fastidieux voire parfois
impossible (en particulier sous X) de taper les symboles
tilde et apostrophe, bien utiles sous Unix. Or les tables
standard pour clavier Latin-1 activent en general toutes les
touches mortes possibles. Il faut donc pour ressusciter ces
touches, remplacer le keycode mort par le keycode normal
dans la table chargee au demarrage par loadkeys.
+o Compose suivi de deux symboles produit une combinaison des deux.
Cette combinaison est redefinissable. Il y a a ce jour 68
combinaisons par defaut qui peuvent etre affichees par dumpkeys |
grep compose.
+o Depuis la version 1.3.33 du noyau, il est possible d'avoir des
touches "collantes" (plus ou moins comme Escape) grace aux codes
SControl et SAlt. Par exemple, on peut taper ^C par Scontrol puis C
et Ctrl-Alt-BackSpace par SControl puis SAlt puis BackSpace.
Il est a noter qu'il existe au moins trois mecanismes de composition
distincts:
1. Le pilote clavier de Linux, configure par loadkeys.
2. Le mecanisme de X - voir X386keybd(1), ou XFree86kbd(1).
Sous X11R6 : editer /usr/X11R6/lib/X11/locale/iso8859-1/Compose.
3. Le mecanisme d'emacs, active en chargeant iso-insert.el.
Pour X, l'ordre des deux symboles n'a pas d'importance: Compose-,-c
et Compose-c-, donnent tous deux un c-cedille; pour Linux et emacs,
seule la premiere combinaison est correcte. Les combinaisons de X
sont fixes, celles de Linux et emacs sont reconfigurables. Les
trois listes par defaut sont assez similaires, mais il y a quelques
differences.
99.. DDiivveerrsseess pprroopprriieetteess ddee llaa ccoonnssoollee
Voir loadkeys(1), setleds(1), setmetamode(1) pour les codes generes
par les diverses touches et l'utilisation des leds quand on n'est pas
sous X. Sous X, voir xmodmap(1).
Voir setterm(1), kbdrate(8) pour les proprietes telles que les
couleurs de l'ecriture et du fond, l'economiseur d'ecran et la vitesse
de repetition des touches quand on n'est pas sous X. Sous X, voir
xset(1), qui s'occupe aussi du clic des touches et du volume des bips.
Le fichier /etc/termcap definit les sequences escape utilisees par de
nombreux programmes utilisant la console (ou tout autre terminal). Une
version plus moderne se trouve dans /usr/lib/terminfo. (voir
terminfo(5). Les fichiers terminfo sont crees par le compilateur
terminfo /usr/lib/terminfo/tic, voir tic(1).)
(Sur ma machine) /dev/console est lien symbolique sur /dev/tty0, et le
noyau considere /dev/tty0 comme un synonyme de la console virtuelle
courante. XFree86 1.3 change le proprietaire de /dev/tty0, mais ne le
restaure qu'a la sortie. Or dumpkeys risque de ne pas marcher si
quelqu'un d'autre est proprietaire de /dev/console; dans ce cas,
lancer X et en sortir peut arranger les choses.
1100.. CCoommmmeenntt ssoorrttiirr dduu mmooddee RRAAWW
Si un programme utilisant le mode K_RAW du clavier se termine sans
remettre le calvier en mode K_XLATE, alors il est tres difficile de
faire quoi que ce soit - meme Ctrl-Alt-Del. Cependant il est parfois
possible d'eviter d'appuyer sur Reset (et meme souhaitable: vos
utilisateurs risquent de ne pas apprecier qu'on leur tue leur Nethack,
et surtout il est possible d'endommager le systeme de fichiers). Les
solutions simples consistent a se loger a partir d'un autre terminal
ou une autre machine et faire kbd_mode -a. La procedure suivante
suppose que X ne tourne pas, que l'ecran est en mode texte, que vous
etes a un prompt shell, que Ctrl-C est le caractere d'interruption et
que vous n'avez pas un clavier trop exotique (i.e. la touche `=' est 2
touches a droite de `0').
1ere etape: Lancer X. Appuyez sur la combinaison 2-F12-= : appuyez
sur 2 puis F12 (sans lacher 2) et puis = (sans lacher les deux
autres), le tout assez rapidement! Ca lance X. (Explication: si
l'appui sur une touche produit le keycode K, alors son relachement
produit K+128. Votre shell risque de na pas apprecier ces caracteres,
donc on evite de les lui envoyer en ne lachant pas les touches. `2'
produit un ^C qui annule tout ce qui a ete tape avant. F12 produit un
X et `=' le code entree. Et tout ca vite fait avant que la repetition
des touches ne commence...)
Votre ecran est alors probablement gris, puisqu'aucun .xinitrc n'a ete
specifie. Cependant Ctrl-Alt-Fn marche, et vous pouvez appeler une
autre console. (Ctrl-Alt-Backspace marche aussi, mais ca restaure
l'etat initial du clavier qui justement n'est pas bon.)
2eme etape: Programmer le changement de mode du clavier. (Par
exemple, avec sleep 5; kbd_mode -a.)
3eme etape: Quitter X. Alt-Fx (souvent Alt-F7) retourne sous X,
ensuite Ctrl-Alt-Backspace tue X. Dans les 5 secondes le clavier
redevient utilisable.
Si vous voulez vous preparer pour cette occasion, faites de \215A\301
(3 symboles) un alias de kbd_mode -a. Desormais, l'appui sur F7 en
mode RAW remettra tout en ordre.
1111.. LLaa vvaarriiaabbllee TTEERRMM
De nombreux programmes utilisent la variable TERM et la base de
donnees /etc/termcap ou /usr/lib/terminfo/* pour trouver quelle chaine
de commande efface l'ecran, deplace le curseur, etc., et parfois pour
savoir quelle chaine est envoyee par la touche backspace, ou les
touches de fonction, etc. Cette variable est d'abord definie par le
noyau (pour la console). Generalement elle est redefinie par getty, en
utilisant /etc/ttytype ou l'argument specifie dans /etc/inittab.
Parfois elle est encore changee par /etc/profile.
Les anciens systemes utilisent TERM=console ou TERM=con80x25. Les plus
recents (avec ncurses 1.8.6) utilisent la valeur plus specifique
TERM=linux ou TERM=linux-80x25. Cependant, les vieilles versions de
setterm cherchent une valeur du type TERM=con* et ne marchent donc pas
avec TERM=linux.
Depuis la version 1.3.2 du noyau, la valeur par defaut est TERM=linux.
Si votre termcap n'a pas d'entree `linux', il suffit d'ajouter l'alias
linux dans la description de `console':
console|con80x25|linux:\
et de copier (ou faire un lien symbolique) /usr/lib/terminfo/c/console
en /usr/lib/terminfo/l/linux.
1111..11.. TTeerrmmiinnffoo
Il manque, dans le fichier terminfo de la console linux fourni avec
ncurses 1.8.6, la ligne: kich1=\E[2~, necessaire a certains
programmes. Editez ce fichier et compilez-le avec tic.
1122.. CCoommmmeenntt ffaaiirree ppoouurr qquuee dd''aauuttrreess pprrooggrraammmmeess aacccceepptteenntt lleess ccaarraacc--
tteerreess nnoonn--AASSCCIIII
C'etait jadis un veritable calvaire. Il fallait convaincre
individuellement chaque programme de travailler en 8 bits. Les choses
ne sont pas encore ideales, mais recemment de nombreux utilitaires GNU
ont appris a reconnaitre les variables LC_CTYPE=iso_8859_1 ou
LC_CTYPE=iso-8859-1. Essayez d'abord ca, et si ca ne suffit pas
essayez les trucs ci-dessous.
Tout d'abord, le huitieme bit doit survivre au processus d'entree du
noyau, assurez-vous-en donc avec stty cs8 -istrip -parenb.
A. Pour emacs, mettez les lignes
(standard-display-european t)
(set-input-mode nil nil 1)
(require 'iso-syntax)
et peut-etre aussi
(load-library "iso-insert.el")
(define-key global-map [?\C-.] 8859-1-map)
dans votre $HOME/.emacs. (Cette derniere ligne marche dans un xterm,
en utilisant emacs -nw, mais il faut alors mettre
XTerm*VT100.Translations: #override\n\
Ctrl <KeyPress> . : string("\0308")
dans votre .Xresources.) NDT: fichiers pour clavier Qwerty, a veri-
fier pour azerty.
B. Pour less, mettez LESSCHARSET=latin1 dans l'environment.
C. Pour ls, mettez l'option -N. (A priori en faisant un alias.)
D. Pour bash (version 1.13.*), mettez
set meta-flag on
set convert-meta off
et, selon le Danish-HOWTO,
set output-meta on
dans votre $HOME/.inputrc.
E. Pour tcsh, definissez les variables:
setenv LANG fr_FR (ou fr_CA, fr_CH, fr_BE...)
setenv LC_CTYPE iso_8859_1
Si nls est installe, les routines correspondantes sont utilisees.
Sinon tcsh agit en iso_8859_1, quelle que soit les valeurs donnees a
LANG et LC_CTYPE. voir la section NATIVE LANGUAGE SYSTEM de tcsh(1).
(d'apres le Danish-HOWTO: setenv LC_CTYPE ISO-8859-1; stty pass8)
F. Pour flex, donnez l'option -8 si l'analyseur genere doit accepter
les entrees 8-bits. (Bien sur qu'il doit le faire !)
G. Pour elm, mettez displaycharset a ISO-8859-1. (Danish HOWTO:
LANG=C et LC_CTYPE=ISO-8859-1)
H. Pour les programmes utilisant curses (comme lynx) David Sibley dit:
La version standard de curses utilise le huitieme bit pour
la video inversee (voir le flag _STANDOUT defini dans
/usr/include/curses.h). Cependant ncurses semble fonction-
ner en 8-bits et affiche le iso-latin-8859-1 correctement.
I. Pour les programmes utilisant groff (comme man), utilisez le
-Tlatin1 au lieu de -Tascii. Les vieilles versions de man utilisent
aussi col, et le point suivant s'applique aussi.
J. Pout col, assurez-vous 1) qu'il a ete corrige et fait un
setlocale(LC_CTYPE,""); et 2) de definir LC_CTYPE=ISO-8859-1 dans
l'environment.
K. Pour rlogin, utilisez l'option -8.
L. Pour joe,
sunsite.unc.edu:/pub/Linux/apps/editors/joe-1.0.8-linux.tar.gz devrait
marcher apres edition du fichier de configuration. J'ai aussi lu: joe:
mettez l'option -asis dans /usr/lib/joerc en premiere colonne.
M. Pour LaTeX: \documentstyle[isolatin]{article}.
Pour LaTeX2e: \documentclass{article}\usepackage{isolatin} ou
isolatin.sty est disponible a
<
ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit>.
Une belle discussion sur le theme de l'ISO-8859-1 et sur comment
manipuler les caracteres 8-bits est disponible dans
<
ftp://grasp.insa-lyon.fr/pub/faq/fr/accents> (en francais). Une
autre, en anglais, peut etre trouvee a
<
ftp://rtfm.mit.edu/pub/usenet-by-group/comp.answers/character-
sets/iso-8859-1-faq>. Encore une autre(?):
<
ftp://ftp.vlsivie.tuwien.ac.at/pub/8bit/FAQ-ISO-8859-1>.
1133.. QQuuee ffaaiitt eexxaacctteemmeenntt XXFFrreeee8866--22..11 aa ll''iinniittiiaalliissaattiioonn ddee ssaa kkeeyymmaapp??
Depuis la version 2.1, XFree86 initialise sa keymap d'apres celle de
Linux, dans les limites du possible. Linux a 16 entrees par touches
(une pour chaque combinaison de Shift, AltGr, Ctrl, Alt; en fait il en
a meme 256), alors que X n'en a que 4 (une pour chaque combinaison de
Shift et Mod), il y a donc forcement des informations perdues.
D'abord X lit le fichier Xconfig, ou il trouve les correspondances
entre les touches Control, Alt et ScrollLock avec les codes X Meta,
ModeShift, Compose, ModeLock et ScrollLock - voir X386keybd(1), ou
XFree86kbd(1).
Par defaut, c'est la colonne LeftAlt qui sert pour Mod, sauf si
CtlDroit est defini comme ModeShift ou ModeLock, dans ce cas ce sont
les entrees RightCtl qui servent pour Mod. (Sauf si AltGr est defini
comme Mod dans Xconfig, auquel cas c'est la colonne RightAlt qui
sert.) Ceci determine comment les 4 entrees de XFree86 sont choisies
parmi les 16 de Linux. Notons que par defaut Linux ne fait pas la
difference entre les deux touche Control ou Shift. X fait la
dufference.
Les touches "action" Show_Memory, Show_State, Show_Registers,
Last_Console, Console_n, Scroll_Backward, Scroll_Forward, Caps_On et
Boot sont ignorees, de meme pour les touches mortes, NumLock,
ScrollLock et Alt+code-ASCII.
Ensuite, les definitions de Xconfig sont utilisees. (Donc une
definition de Compose dans Xconfig annulera celle trouvee dans la
keymap du noyau.)
Que deviennent les chaines associees aux touches des fonctions ? Rien,
ce concept n'existe pas sous X. (Mais il est possible de definir des
chaines associees aux touches de fonction dans xterm - mais elles ne
doivent pas etre interceptees par le gestionnaire de fenetres.)
Je ne sais pas comment convaincre xterm qu'il devrait utiliser la
keymap de X quand Alt est enfonce. Il semble qu'il ne reagisse qu'en
fonction de sa ressource eightBitInput, et selon qu'elle est a vrai ou
faux, soit il met a 1 le huitieme bit, soit il genere un caractere
escape devant le caractere (comme le fait setmetamode(1) pour la
console).
1144.. TToouucchheess eett ccllaavviieerrss ppaarrttiiccuulliieerrss
Les deux touches ImprEcran/Syst et Pause/Attn sont speciales car elles
ont deux keycodes: la premiere produit le keycode 84 quand Alt est
enfonce et 99 sinon; la seconde 101 si Ctrl est enfonce, 119 sinon.
(Il est donc inutile d'assigner des fonctions a Alt-Keycode99 ou Ctrl-
Keycode119.)
Si votre clavier a des touches etranges qui ne generent aucun code
sous Linux (ou generent des messages du genre "unrecognized
scancode"), vous pouvez, a partir du noyau 1.1.63, utiliser
setkeycodes(1) pour dire au noyau quel keycode assigner a ces touches.
(Leur utilisation sous X sera cependant impossible.) Une fois
qu'elles ont un keycode grace a setkeycodes, on peut leur associer une
fonction avec loadkeys.
1155.. EExxeemmpplleess dd''uuttiilliissaattiioonn ddee llooaaddkkeeyyss aanndd xxmmooddmmaapp
Permuter ScrollLock et Control (en suposant que vous utilisez les
keymaps 0-15; verifiez avec dumpkeys | head -1)
% loadkeys
keymaps 0-15
keycode 58 = Control
keycode 29 = Caps_Lock
%
Les permuter sous X seulement:
% xmodmap .xmodmaprc
ou .xmodmaprc contient les lignes
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
Qu'en est-il de la numerotation des touches? Backspace a le numero 14
sous Linux et 22 sous X... En fait, la numerotation est plus ou moins
arbitraire. Le numero sous Linux peut etre visualise avec showkey(1),
et le numero sous X avec xev(1). Souvent le numero sous X est 8 de
plus que le numero sous Linux.
1155..11.. ``JJee nnee ppeeuuxx ttaappeerr qquu''aavveecc uunn sseeuull ddooiiggtt''
Les touches Shift, Ctrl et Alt peuvent-elles etre des commutateurs
stables ? Oui, en faisant:
% loadkeys
keycode 29 = Control_Lock
keycode 42 = Shift_Lock
keycode 56 = Alt_Lock
%
les Control, Shift et Alt de gauche deviennent stables. Les numeros a
utiliser sont donnes par showkey (et sont generalement 29 et 97 (Con-
trol), 42 et 54 (Shift), 56 et 100 (Alt)) et les fonctions possibles
sont Control_Lock, Shift_Lock, Alt_Lock, ALtGr_Lock.
Et le touches `collantes'? Il n'y a pas encore eu de nouvelle version
du paquetage kbd depuis leur introduction dans le noyau 1.3.33, il
faut donc utiliser leurs codes hexa, par example:
% loadkeys
keymaps 0-15
keycode 54 = 0x0c00
keycode 97 = 0x0c02
keycode 100 = 0x0c03
%
rend les Shift, Ctrl et Alt de droite collantes.
1166.. CChhaannggeerr llee mmooddee vviiddeeoo
Pour autant que je sache, il y a 6 manieres de changer de mode
resolution:
1. A la compilation: changer la ligne
SVGA_MODE= -DSVGA_MODE=NORMAL_VGA
dans /usr/src/linux/Makefile.
1A. Apres la compilation: utiliser rdev -v - une affreuse magouille,
mais bon, ca marche.
2. Au demarrage: mettre vga=ask dans le fichier de config de lilo, qui
demandera au boot le mode voulu. Une fois decide, remplacer par
vga=LePlusJoliMode.
3. En cours de route: A. Utiliser la commande resizecons. (C'est un
programme tres primitif utilisant l'ioctl VT_RESIZE.) B. Utiliser
SVGATextMode. (C'est une version moins primitive)
4. Pas "sur la console": Sous dosemu, ou avec svgalib etc. on peut
changer le mode video de la carte ecran sans que le pilote de la
console s'en apercoive. C'est parfois utile pour configurer resizecons
ou SVGATextMode:sous dosemu se mettre dans le mode video voulu grace a
un programme DOS utilisant ce mode, puis dans une autre console,
recuperer les parametres de ce mode. Il ne reste plus qu'a utiliser
ces donnees pour l'initialisation de resizecons et SVGATextMode. Dans
certains cas la carte video se retrouve dans un mode inutilisable, le
moyen le plus simple pour se sortir de la est de lancer dosemu,
laisser le BIOS mettre un mode video correct, puis tuer dosemu (avec
kill -9).
1166..11.. IInnssttrruuccttiioonnss ppoouurr ll''uuttiilliissaattiioonn ddee rreessiizzeeccoonnss
Recuperer svgalib et compiler le programme restoretextmode. Booter la
machine dans tous les modes video possibles (en mettant vga=ask dans
le fichier config de lilo), et sauvegarder les registres video dans
des fichiers CxL (C=Colonnes, L=Lignes), par exemple 80x25, 132x44,
etc. Placer ces fichiers dans /usr/lib/kbd/videomodes. Desormais
resizecons 132x44 changera le mode video (et enverra le signal
SIGWINCH a tous les processus qui ont besoin de savoir que la
resolution a change, et chargera une nouvelle police si necessaire).
A present, resizecons ne change de mode que s'il y a assez de memoire
pour contenir a la fois l'ancienne et la nouvelle console.
1177.. CChhaannggeerr llaa vviitteessssee ddee rreeppeettiittiioonn dduu ccllaavviieerr
Au demarrage, le noyau met la vitesse de repetition a sa valeur
maximale. Pour la plupart des claviers c'est raisonnable, mais sur
certains il devient quasiment impossible d'effleurer une touche sans
avoir trois fois le meme caractere. Dans ce cas utiliser le programme
kbdrate(8) pour changer la vitesse de repetition ou si ca ne suffit
pas supprimer la section:
______________________________________________________________________
! set the keyboard repeat rate to the max
mov ax,#0x0305
xor bx,bx ! clear bx
int 0x16
______________________________________________________________________
de /usr/src/linux/[arch/i386/]boot/setup.S.
1188.. EEccoonnoommiisseeuurr dd''eeccrraann
setterm -blank _n_n regle le delai d'extinction de l'ecran a _n_n minutes
d'inactivite. (Avec _n_n = 0, l'economiseur d'ecran est desactive.)
L'option s de xset(1) regle les parametres de l'economiseur d'ecran de
X.
Les modes d'economie d'energie du moniteur peuvent etre
actives/desactives par le programme setvesablank donne dans les
commentaires au debut du fichier
/usr/src/linux/drivers/char/vesa_blank.c.
1199.. QQuueellqquueess pprroopprriieetteess dduu VVTT110000 -- mmooddee aapppplliiccaattiioonn
: Parfois les touches de curseur produisent des codes bizarres?
Quand le terminal est en mode application, les touches de curseur
produisent les codes Esc O x et sinon Esc [ x, avec x = A,B,C ou D.
Certains programmes mettent le termnial en mode application et si on
les tue avec un kill -9, ou s'il se plantent, le terminal restera dans
ce mode.
% echo -e '\033c'
reinitialise les proprietes du terminal courant. Si on veut passer en
mode application:
% echo -e '\033[?1h'
et si on veut en sortir:
% echo -e '\033[?1l'
2200.. IInnccoommppaattiibbiilliittee mmaatteerriieellllee
Quelques personnes ont note des pertes de caracteres tapes lors d'un
acces disquette. Il semblerait que ce soit un probleme avec les cartes
meres Uni-486WB. (SVP envoyez moi un mail pour confirmer [Oui, j'ai le
meme probleme], infirmer [Non, tout va bien avec ma carte Uni-486WB],
ou modifier [Ma machine Xyzzy a le meme probleme].)
Certaines personnes ont eu des blocages aleatoires du clavier -
parfois associes a une activite disque dur ou une autre entree/sortie.
[email protected] (Ulf Tietz) ecrit:
`J'avais ce genre de problemes quand ma carte mere avait des
reglages trop rapides. En remettant les delais (CLK, wait-
states, etc.) a des valeurs plus raisonnables, tout est ren-
tre dans l'ordre.'
[email protected] (Bill Hogan) ecrit:
`Si vous avez un BIOS AMI, vous pouvez essayer de mettre le
parametre Gate A20 emulation sur 'chipset' (si cette option
existe). Quand cette option etait sur n'importe quoi d'autre
('fast', 'both', 'disabled') j'avais souvent des blocages du
clavier.'
--------------------------------------------------------------------
Additions et corrections sont les bienvenues.
Andries Brouwer -
[email protected]
(Bruno Viaris -
[email protected] pour la traduction)