Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Du clavier à emacs : que devient Mode_shift ?

9 réponses
Avatar
rixed
Bonjour !

J'utilise un clavier qwerty modèle réduit très pratique, avec touche
control et meta bien placées. J'ai un fichier modmap qui défini
correctement toutes ces touches. Pour écrire des textes avec des
caractères accentués j'ai pris l'habitude d'utiliser le modificateur
Mode_shift (que j'attribue à la touche Meta_L). Voici un exemple de la
configuration de xmodmap :

! Mode_shift + e donne "é" par exemple
keycode 26 = e E egrave Egrave
...
! Meta_L est la touche diamand de gauche
keycode 131 = Meta_L
...
! Mode_shift est sur la même touche
keysym Meta_L = Mode_switch Meta_L
...
! OpenBox utilise mod1, utiliser Alt_L pour cela
add mod1 = Alt_L


Bref, mon clavier et moi vivions heureux comme ça depuis des années,
lorsque soudain l'envie me pris d'installer emacs pour apprendre le lisp
(j'utilise vi comme éditeur d'habitude).

Première surprise : la touche meta ne fonctionne pas. Lorsque j'appuis
sur Alt_L et 'a', je m'attend à faire un [M-a], mais emacs affiche
sobrement 'a' (si je vérifie avec [C-h l], j'ai bien seulement 'a').
Bon, c'est pas grave, j'ai bien tapper sur Esc.

Plus grave : lorsque j'envoie Mode_shift+e, je m'attends à ce qu'il
affiche 'é', mais non : il me fait quelquechose d'équivalent à [M-h]
(selon [C-h l]).

Je n'y comprend rien ! J'ai essayé pendant des heures de changer ma
configuration clavier sous X mais rien n'y fait. Quelqu'un peut-il
m'aider à comprendre ce qui se passe entre mon clavier et emacs ?

Informations complémentaires : emacs est la version 21, compilée sans
X11, sous debian Etch, tournant dans un screen (TERM=screen, mais j'ai
essayé avec "xterm" et ça ne change rien), dans un xterm, dans un X-org,
avec la configuration de xmodmap décrite ci-dessus, en locales C.

Toute information est bienvenue !

9 réponses

Avatar
Pascal Bourguignon
writes:

Bonjour !

J'utilise un clavier qwerty modèle réduit très pratique, avec touche
control et meta bien placées. J'ai un fichier modmap qui défini
correctement toutes ces touches. Pour écrire des textes avec des
caractères accentués j'ai pris l'habitude d'utiliser le modificateur
Mode_shift (que j'attribue à la touche Meta_L). Voici un exemple de la
configuration de xmodmap :

! Mode_shift + e donne "é" par exemple
keycode 26 = e E egrave Egrave
...
! Meta_L est la touche diamand de gauche
keycode 131 = Meta_L
...
! Mode_shift est sur la même touche
keysym Meta_L = Mode_switch Meta_L
...
! OpenBox utilise mod1, utiliser Alt_L pour cela
add mod1 = Alt_L


Bref, mon clavier et moi vivions heureux comme ça depuis des années,
lorsque soudain l'envie me pris d'installer emacs pour apprendre le lisp
(j'utilise vi comme éditeur d'habitude).

Première surprise : la touche meta ne fonctionne pas. Lorsque j'appuis
sur Alt_L et 'a', je m'attend à faire un [M-a], mais emacs affiche
sobrement 'a' (si je vérifie avec [C-h l], j'ai bien seulement 'a').
Bon, c'est pas grave, j'ai bien tapper sur Esc.

Plus grave : lorsque j'envoie Mode_shift+e, je m'attends à ce qu'il
affiche 'é', mais non : il me fait quelquechose d'équivalent à [M-h]
(selon [C-h l]).

Je n'y comprend rien ! J'ai essayé pendant des heures de changer ma
configuration clavier sous X mais rien n'y fait. Quelqu'un peut-il
m'aider à comprendre ce qui se passe entre mon clavier et emacs ?

Informations complémentaires : emacs est la version 21, compilée sans
X11, sous debian Etch, tournant dans un screen (TERM=screen, mais j'ai
essayé avec "xterm" et ça ne change rien), dans un xterm, dans un X-org,
avec la configuration de xmodmap décrite ci-dessus, en locales C.

Toute information est bienvenue !


Je crois que les applications peuvent utiliser soit les bits shift,
lock, control, mod1, ..., mod5, soit les keysyms comme Meta_L ou
Alt_R. Le problème étant que si il n'y a pas synchronization entre
les deux, deux applications peuvent sembler avoir un point de vue
différent. Tu devrais pouvoir mêtre en concordance les applications
qui utilisent les bits avec les applications qui utilisent le keysym
en bidouillant ~/.Xmodmap. Tu peux aussi t'aider de xev(1) qui te
permet de vérifier les keysyms et bits envoyés avec chaque évènement.

Sinon la correspondance entre les keycodes et les keysyms (lignes
keycode) devrait être totalement indépendante de ce problème, pour ce
que j'en sais.

Voici ce que j'ai à la fin de mon ~/.Xmodmap:

clear shift
clear lock
clear control
clear mod1
clear mod2
clear mod3
clear mod4
clear mod5

! Leave Num_Lock on mod2, because this version of WMaker hardwires it...

add shift = Shift_L Shift_R
add lock = Caps_Lock
add control = Control_L Control_R
add mod1 = Alt_L Alt_R
add mod2 = Num_Lock
add mod3 = Meta_L Meta_R
add mod4 = Super_L Super_R
add mod5 = Mode_switch ISO_Level3_Shift



--
__Pascal Bourguignon__
http://www.informatimago.com
http://pjb.ogamita.org

Avatar
rixed
Merci.

Je viens de me rendre compte que le problème n'a rien à voir avec
Mode_switch, puisque si je mappe un keysym accentué sur une touche
quelconque sans modifier, ou si je copie-colle dans emacs un caractère
accentué le comportement d'emacs est le même.

Il s'agit donc d'une question spécifique emacs.

Désolé pour le bruit.

Ceci dit, si quelqu'un connait un bon article ou livre dans lequel le
traitement des touches est bien expliqué, je suis prenneur (entre les
terminaux, X11, les différents encodages et les bibliothèques style
termios...)
Avatar
talon
wrote:
Merci.

Je viens de me rendre compte que le problème n'a rien à voir avec
Mode_switch, puisque si je mappe un keysym accentué sur une touche
quelconque sans modifier, ou si je copie-colle dans emacs un caractère
accentué le comportement d'emacs est le même.

Il s'agit donc d'une question spécifique emacs.

Désolé pour le bruit.

Ceci dit, si quelqu'un connait un bon article ou livre dans lequel le
traitement des touches est bien expliqué, je suis prenneur (entre les
terminaux, X11, les différents encodages et les bibliothèques style
termios...)



Le clavier produit des "scancodes". Le driver du clavier (Linux, etc. )
convertit ces scancodes en keycodes. Xwindow utilise des "keycode", et
les convertit en "keysym", c'est là que xmodmap intervient.
Sous Linux, la commande loadkeys permet d'accéder aux scancodes et de
modifier l'association aux keycodes. Sous FreeBSD il faut carrément
hacker le driver.
Tu trouveras de l'information sur les scancodes ici:
http://www.win.tue.nl/~aeb/linux/kbd/scancodes.html#toc1
et sur le driver Linux ici:
http://www.win.tue.nl/~aeb/linux/kbd/
http://www.linuxjournal.com/article/1080
Pour ce qui est de Xwinow c'est trivial, il suffit de jouer avec
xmodmap. Sauf qu'il peut être nécessaire de jouer avec les fichiers de
définition de clavier
/usr/X11R6/lib/X11/xkb/keycodes/xfree86
/usr/X11R6/lib/X11/xkb/symbols/fr
par exemple.

--

Michel TALON

Avatar
Paul Gaborit
À (at) 11 Apr 2007 11:53:24 GMT,
écrivait (wrote):
[... plein de choses sur la configuration X11...]
Informations complémentaires : emacs est la version 21, compilée sans
X11, sous debian Etch, tournant dans un screen (TERM=screen, mais j'ai
essayé avec "xterm" et ça ne change rien), dans un xterm, dans un X-org,
avec la configuration de xmodmap décrite ci-dessus, en locales C.


Là, j'ai un doute. Comment tourne emacs ? En mode X11 ou dans un
terminal ? Les manières de configurer ces deux modes n'ont strictement
rien à voir l'une avec l'autre.

Or vous indiquez « emacs 21 compilé *sans* X11 » ! Dans ce cas, vous
utilisez emacs en mode terminal et vos règlages X11 importent peu.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>

Avatar
Pascal Bourguignon
Paul Gaborit writes:

À (at) 11 Apr 2007 11:53:24 GMT,
écrivait (wrote):
[... plein de choses sur la configuration X11...]
Informations complémentaires : emacs est la version 21, compilée sans
X11, sous debian Etch, tournant dans un screen (TERM=screen, mais j'ai
essayé avec "xterm" et ça ne change rien), dans un xterm, dans un X-org,
avec la configuration de xmodmap décrite ci-dessus, en locales C.


Là, j'ai un doute. Comment tourne emacs ? En mode X11 ou dans un
terminal ? Les manières de configurer ces deux modes n'ont strictement
rien à voir l'une avec l'autre.

Or vous indiquez « emacs 21 compilé *sans* X11 » ! Dans ce cas, vous
utilisez emacs en mode terminal et vos règlages X11 importent peu.


Sauf qu'en général, le terminal utilisé est xterm...

--
__Pascal Bourguignon__
http://www.informatimago.com
http://pjb.ogamita.org


Avatar
lhabert
[Je redirige sur fr.comp.applications.emacs qui me parait plus adapté]

:

J'utilise un clavier qwerty modèle réduit très pratique, avec touche
control et meta bien placées. J'ai un fichier modmap qui défini
correctement toutes ces touches. Pour écrire des textes avec des
caractères accentués j'ai pris l'habitude d'utiliser le modificateur
Mode_shift (que j'attribue à la touche Meta_L). Voici un exemple de la
configuration de xmodmap :

! Mode_shift + e donne "é" par exemple
keycode 26 = e E egrave Egrave
...
! Meta_L est la touche diamand de gauche
keycode 131 = Meta_L
...
! Mode_shift est sur la même touche
keysym Meta_L = Mode_switch Meta_L


Mon dieu quelle horreur!

...
! OpenBox utilise mod1, utiliser Alt_L pour cela
add mod1 = Alt_L


Mouarf. La convention habituelle est plutôt de considérer que Mod1=Meta et
Mod2=Alt. Normalement, ça ne devrait avoir aucune importance, mais les
programmes modernes hardcodent cette correspondance

Première surprise : la touche meta ne fonctionne pas. Lorsque j'appuis
sur Alt_L et 'a', je m'attend à faire un [M-a], mais emacs affiche
sobrement 'a' (si je vérifie avec [C-h l], j'ai bien seulement 'a').


C'est parfaitement normal. Ton xterm reçoit le Alt-a, et il le traduit en a
tout court. Ce qu'il te faut, c'est que le keysym Meta_L ou Meta_R soit
associée à un modificateur, et appuyer sur une touche générant le keysym en
question en même temps que « a ». Là, xterm devrait le traduire en « ^[ a »,
que emacs comprendra comme M-a. (Enfin, encore faut-il que ton xterm soit
configuré pour ça, parce qu'il peut aussi être configuré pour traduire le
meta en +8. Assure-toi d'avoir « XTerm*eightBitInput:false » dans ton
.Xresources.)


Bon, c'est pas grave, j'ai bien tapper sur Esc.


Ça devient vite insupportable quand tu dois le faire plein de fois d'affilée
(une série de M-f par exemple).

Plus grave : lorsque j'envoie Mode_shift+e, je m'attends à ce qu'il
affiche 'é', mais non : il me fait quelquechose d'équivalent à [M-h]
(selon [C-h l]).


Par défaut, emacs traduit un caractère supérieur à 128 comme le -8
métaifié. Il faut mettre « (set-input-mode nil nil 1) » dans le .emacs pour
le calmer.

Avatar
Paul Gaborit
À (at) Thu, 12 Apr 2007 18:07:30 +0200,
Pascal Bourguignon écrivait (wrote):
Or vous indiquez « emacs 21 compilé *sans* X11 » ! Dans ce cas, vous
utilisez emacs en mode terminal et vos règlages X11 importent peu.


Sauf qu'en général, le terminal utilisé est xterm...


Dans ce cas, si c'est les paramètres X11 influent, ce n'est plus un
problème de configuration de emacs mais un problème de configuration
de xterm avec X11...

Petite question : connaissez-vous beaucoup de programmes tournant dans
un terminal qui sachent distinguer la touche control gauche de la
touche control droite ? ou qui connaisse la touche meta ? etc.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>


Avatar
Matthieu Moy
Paul Gaborit writes:

Petite question : connaissez-vous beaucoup de programmes tournant dans
un terminal qui sachent distinguer la touche control gauche de la
touche control droite ? ou qui connaisse la touche meta ? etc.


D'ailleurs, y'a jamais eu de projet pour faire des terminaux (et des
applies) qui pourraient justement faire ce genre de distinction ?

--
Matthieu

Avatar
rixed
On 2007-04-12, Luc Habert wrote:
configuration de xmodmap :

! Mode_shift + e donne "é" par exemple
keycode 26 = e E egrave Egrave
...
! Meta_L est la touche diamand de gauche
keycode 131 = Meta_L
...
! Mode_shift est sur la même touche
keysym Meta_L = Mode_switch Meta_L


Mon dieu quelle horreur!


Pourquoi ? C'est plus rapide que d'utiliser la touche compose pour avoir
des caractères accentués, et je m'y suis habitué.

...
! OpenBox utilise mod1, utiliser Alt_L pour cela
add mod1 = Alt_L


Mouarf. La convention habituelle est plutôt de considérer que Mod1=Meta et
Mod2=Alt. Normalement, ça ne devrait avoir aucune importance, mais les
programmes modernes hardcodent cette correspondance


Ça n'a aucune importance, et en plus c'est faut : openbox utilise en
fait mod1 ou mod3 ou mod4. Juste pour corriger, mais c'est HS.

Première surprise : la touche meta ne fonctionne pas. Lorsque j'appuis
sur Alt_L et 'a', je m'attend à faire un [M-a], mais emacs affiche
sobrement 'a' (si je vérifie avec [C-h l], j'ai bien seulement 'a').


C'est parfaitement normal. Ton xterm reçoit le Alt-a, et il le traduit en a
tout court. Ce qu'il te faut, c'est que le keysym Meta_L ou Meta_R soit
associée à un modificateur, et appuyer sur une touche générant le keysym en
question en même temps que « a ». Là, xterm devrait le traduire en « ^[ a »,
que emacs comprendra comme M-a. (Enfin, encore faut-il que ton xterm soit
configuré pour ça, parce qu'il peut aussi être configuré pour traduire le
meta en +8. Assure-toi d'avoir « XTerm*eightBitInput:false » dans ton
.Xresources.)


OK, je comprend. Mais si je configure Xterm pour qu'il transforme les
code > 128 en séquence escape+lettre je crains qu'alors je ne puisse
plus afficher de caractères accentués dans xterm (ni dans vi, mutt,
slrn, et tout les outils habituels), à moins peut être d'avoir recours à
de la magie noire spécifique à chacun de ces programmes ? Il n'y a pas
moyen pour xterm de passer le meta à emacs tout en autorisant les inputs
sur 8bits ? Genre demander à xterm de ne convertir que les modifieurs en
séquence escape, mais d'accepter par ailleurs les caractères 8bits ?

Actuellement lorsque j'envoie des Meta+lettres à xterm il m'affiche des
tas de caractères exotiques genre lettres accentuées nordiques ou
espagnoles. Comme je ne parle aucune de ces langues ça ne me sert à
rien :-)

Gagné, ca existe et apparement ça s'appelle 'metaSendsEscape'.

Je viens de tester : sous le terminal, je peut toujours écrire des
caractères accentués grace à Mode_switch, et la touche Meta fait biper
xterm. L'ennuis c'est que ça fait aussi biper emacs. :-/ Et si j'utilise
[C-h l] après un M-x par exemple, je vois que mon M-x à donné "ESC ø"
(esc suivit d'un o barré). Je sens que ça brule...

Par défaut, emacs traduit un caractère supérieur à 128 comme le -8
métaifié. Il faut mettre « (set-input-mode nil nil 1) » dans le .emacs pour
le calmer.


Oui c'était exactement ça le problème comme Google avait fini par me le
dire.