The Linux Keyboard HOWTO Andries Brouwer, aeb@cwi.nl 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 (stormy@Ghost.Net) 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\ osfDelete: delete-previous-character() *XmTextField.translations: #override\n\ 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 (Par defaut CapsLock est un va-et-vient, Caps_Shift 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 (pfnguyen@netcom22.netcom.com) 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 . : 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 . Une belle discussion sur le theme de l'ISO-8859-1 et sur comment manipuler les caracteres 8-bits est disponible dans (en francais). Une autre, en anglais, peut etre trouvee a . Encore une autre(?): . 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. ulf@rio70.bln.sni.de (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.' bhogan@crl.com (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 - aeb@cwi.nl (Bruno Viaris - Viaris@Yoko.ENS-Cachan.Fr pour la traduction)