OVH Cloud OVH Cloud

-nw mais avec l'environnement X

33 réponses
Avatar
Patrice Karatchentzeff
Salut,

J'aimerai bien avoir un Emacs en console (donc -nw) mais qui conserve
quand même toutes les touches qui sont activables sous X (et notamment
la combinaison Ctrl-flèche pour ne pas la citer).

J'ai renoncé à comprendre comment modifier terminfo (et puis, je vois
mal comment modifier cela partout... sauf à créer _enfin_ un termcap
moderne qui émule autre chose qu'une antiquité) mais je creuse la
piste avec X...

En effet, je me connecte à 99,9% des fois avec ssh sous X vers une
machine avec le port forwarding sur X11... En *console*, mon shell
interprète sans soucis la combinaison de touche avec ctrl donc
l'environnement le permet (ENV=xterm en l'occurrence).

Mais c'est en lançant emacs -nw que les choses se gâtent... et je ne
peux pas toujours - à vrai dire presque jamais, à cause du débit -
ouvrir une fenêtre X pour Emacs.

Donc, comment dire à « emacs -nw » de se comporter comme emacs tout
court sous X ?

Merci d'avance,

PK

--
      |\      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:p.karatchentzeff@free.fr
     |,4-  ) )-,_. ,\ (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'\_)       

10 réponses

1 2 3 4
Avatar
Matthieu Moy
Patrice Karatchentzeff writes:

Donc, comment dire à « emacs -nw » de se comporter comme emacs tout
court sous X ?



Moi, je refais les bindings à la main pour les touches qui ne marchent
pas. C-h c <le-truc-qui-merde>, puis (global-set-key ...).

Mais je dois bien reconnaitre qu'une solution plus propre serait
appréciable !!

--
Matthieu
Avatar
Patrice Karatchentzeff
Matthieu Moy writes:

Patrice Karatchentzeff writes:

Donc, comment dire à « emacs -nw » de se comporter comme emacs tout
court sous X ?



Moi, je refais les bindings à la main pour les touches qui ne marchent
pas. C-h c <le-truc-qui-merde>, puis (global-set-key ...).



Je ne suis pas sûr de comprendre...

1) tu le fais à chaque fois que tu lances un Emacs ?
2) C-h c <control> ne donne justement rien :(

Mais je dois bien reconnaitre qu'une solution plus propre serait
appréciable !!



Ça... Je n'arrive pas à comprendre qu'il n'y ait pas encore un termcap
« made in Linux » qui supporte complètement un clavier 105 touches en
console...

Peut-être que plus personne n'utilise la console... mais j'ai des
doutes :)

PK
--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       
Avatar
lhabert
Patrice Karatchentzeff :

J'aimerai bien avoir un Emacs en console (donc -nw) mais qui conserve
quand même toutes les touches qui sont activables sous X (et notamment
la combinaison Ctrl-flèche pour ne pas la citer).

J'ai renoncé à comprendre comment modifier terminfo (et puis, je vois
mal comment modifier cela partout... sauf à créer _enfin_ un termcap
moderne qui émule autre chose qu'une antiquité) mais je creuse la
piste avec X...



Euh, clarifions les choses. Terminfo et termcap sont des bases de données,
qui à un nom de terminal (normalement obtenu via $TERM) associe un ensemble
de caractéristiques, pour la pluspart, des séquences d'echappement servant à
obtenir certains effets, ou les séquences d'echappement qu'envoie le
terminal (enfin, le programme qui nourrie l'entrée du terminal, par exemple
xterm ou le code de gestion de la console du noyau linux) pour encoder des
choses. Que l'entrée terminfo ou termcap correspondant au $TERM décrive
correctement le terminal n'est évidemment pas automatique. Enfin je crois
qu'emacs ne consulte ni terminfo ni termcap. Enfin c'était au moins le cas
il y a quelques années, je n'ai pas trop suivi l'évolution depuis (Qui a dit
qu'emacs n'a pas évolué depuis?). Donc de toutes manières, on oublie
terminfo, et on regarde ce que fait emacs.

Emacs au lancement regarde le $TERM, et cherche un term/$TERM.el. Si il ne
trouve pas, il réessaye en virant les suffixes -* du $TERM (pour avoir un
même xterm.el pour xterm et xterm-color par exemple). Ce fichier est censé
faire des define-key dans la function-key-map, qui est une keymap spéciale
qui sert à réécrire les key events avant qu'ils passent à travers la
global-map. C'est l'endroit canonique pour transformer les séquences
d'echappement en keysyms symboliques. Donc la solution à ton problème
consiste à récupérer le term/xterm.el de ton emacs, et y ajouter les

(define-key function-key-map "e[5D" [C-left])

qui vont bien. Je mets « e[5D » parce que c'est comme ça que l'xterm que
j'ai sous la main traduit controle gauche, je ne sais pas si c'est vraiment
standard, le mieux est que tu regardes ce fait ton xterm (lancer un cat par
exemple).
Avatar
lhabert
Patrice Karatchentzeff :

Ça... Je n'arrive pas à comprendre qu'il n'y ait pas encore un termcap
« made in Linux » qui supporte complètement un clavier 105 touches en
console...



Euh, le truc qui est vraiment foireux, c'est les keymaps standards (la
keymap azerty est un vrai désastre, par exemple, il y a plein de M-foobar
qui ne donnent pas du tout le bon truc). La terminfo standard elle-même,
elle tient plutôt la route, il me semble qu'elle foire juste un peu au
niveau des shift F??, mais c'est tout.
Avatar
lhabert
Patrice Karatchentzeff :

2) C-h c <control> ne donne justement rien :(



C'est normal : le terminal n'envoie aucun caractère lorsque tu appuyes juste
sur control.
Avatar
Matthieu Moy
Patrice Karatchentzeff writes:

Matthieu Moy writes:

Patrice Karatchentzeff writes:

Donc, comment dire à « emacs -nw » de se comporter comme emacs tout
court sous X ?



Moi, je refais les bindings à la main pour les touches qui ne marchent
pas. C-h c <le-truc-qui-merde>, puis (global-set-key ...).



Je ne suis pas sûr de comprendre...

1) tu le fais à chaque fois que tu lances un Emacs ?



Non, non, dans le ~/.emacs.el, éventuellement protégé par un

(cond ((eq window-system ...)
...))

Pour avoir des réglages différents sous X et en -nw (je ne suis
quasiment jamais vraiment en console, mais souvent en ssh qui rame
trop pour une fenêtre X11).

2) C-h c <control> ne donne justement rien :(



Non, mais C-<flèche> doit bien donner quelque chose ...

--
Matthieu
Avatar
Patrice Karatchentzeff
(Luc Habert) writes:

[...]

Emacs au lancement regarde le $TERM, et cherche un term/$TERM.el. Si il ne
trouve pas, il réessaye en virant les suffixes -* du $TERM (pour avoir un
même xterm.el pour xterm et xterm-color par exemple). Ce fichier est censé
faire des define-key dans la function-key-map, qui est une keymap spéciale
qui sert à réécrire les key events avant qu'ils passent à travers la
global-map. C'est l'endroit canonique pour transformer les séquences
d'echappement en keysyms symboliques. Donc la solution à ton problème
consiste à récupérer le term/xterm.el de ton emacs, et y ajouter les

(define-key function-key-map "e[5D" [C-left])

qui vont bien. Je mets « e[5D » parce que c'est comme ça que l'xterm que
j'ai sous la main traduit controle gauche, je ne sais pas si c'est vraiment
standard, le mieux est que tu regardes ce fait ton xterm (lancer un cat par
exemple).



En fait, c'est manifestement qu'une partie du problème ou de la
solution...

J'ai ajouté :

;; enfin un terminal correct
;;
(add-hook 'term-mode-hook
(define-key function-key-map "^[[C" 'forward-word)
(define-key function-key-map "^[[D" 'backward-word))

ce qui me donne, en console (bien sûr), (presque) la solution. Le
terminal n'hurle plus quand je compose « ctrl+-> » mais n'avance pas
pour autant d'un mot.

EN fait, si je fais (en console) :

C-q et Ctrl+->

le résultat est le même que si je n'appuyais pas sur Ctrl.

Je vais essayer dans un xterm, cela devrait être au moins possible
dans ce cas-là.

Merci pour les explications précédentes,

PK

--
      |      _,,,---,,_       Patrice KARATCHENTZEFF
ZZZzz /,`.-'`'    -.  ;-;;,_   mailto:
     |,4-  ) )-,_. , (  `'-'  http://p.karatchentzeff.free.fr
    '---''(_/--'  `-'_)       
Avatar
lhabert
Patrice Karatchentzeff :

(add-hook 'term-mode-hook
(define-key function-key-map "^[[C" 'forward-word)
(define-key function-key-map "^[[D" 'backward-word))



Tu perds l'adaptatabilité au $TERM que te donne la solution du $TERM.el.

EN fait, si je fais (en console) :

C-q et Ctrl+->

le résultat est le même que si je n'appuyais pas sur Ctrl.



Alors il faut jouer du loadkeys...
Avatar
Pascal Bourguignon
Patrice Karatchentzeff writes:
J'aimerai bien avoir un Emacs en console (donc -nw) mais qui conserve
quand même toutes les touches qui sont activables sous X (et notamment
la combinaison Ctrl-flèche pour ne pas la citer).

J'ai renoncé à comprendre comment modifier terminfo (et puis, je vois
mal comment modifier cela partout... sauf à créer _enfin_ un termcap
moderne qui émule autre chose qu'une antiquité) mais je creuse la
piste avec X...

En effet, je me connecte à 99,9% des fois avec ssh sous X vers une
machine avec le port forwarding sur X11... En *console*, mon shell
interprète sans soucis la combinaison de touche avec ctrl donc
l'environnement le permet (ENV=xterm en l'occurrence).

Mais c'est en lançant emacs -nw que les choses se gâtent... et je ne
peux pas toujours - à vrai dire presque jamais, à cause du débit -
ouvrir une fenêtre X pour Emacs.

Donc, comment dire à « emacs -nw » de se comporter comme emacs tout
court sous X ?



En toute généralité, ce n'est pas possible.

Plus exactement, ça dépend de l'émulateur de terminal, des touches et
combinaisons de touches qu'il aura été programmé pour reconnaitre, et
du protocole qu'il utilisera pour communiquer ces combinaisons de
touches au programme.

Quand les terminaux ont fini d'être à la pointe, le top du top c'était
l'ASCII et l'ECMA-048 (= ISO-6429).

Les codes de contrôles ASCII sont les octets entre 0 et 31. On peut
les produire avec un terminal en tapant la touche contrôle, et le
caractère correspondant au code voulu, plus 64.

0 NUL 1 SOH 2 STX 3 ETX 4 EOT 5 ENQ 6 ACK 7 BEL
8 BS 9 TAB 10 LF 11 VT 12 FF 13 CR 14 SO 15 SI
16 DLE 17 DC1 18 DC2 19 DC3 20 DC4 21 NAK 22 SYN 23 ETB
24 CAN 25 EM 26 SUB 27 ESC 28 FS 29 GS 30 RS 31 US
32 SP 33 ! 34 " 35 # 36 $ 37 % 38 & 39 '
40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 /
48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7
56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ?
64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G
72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O
80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W
88 X 89 Y 90 Z 91 [ 92 93 ] 94 ^ 95 _
96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g
104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o
112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w
120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 DEL


Donc pour envoyer un code de contrôle ACK, on peut taper contrôle + F
(6+64p). Mais comme tu peux le constater, il n'y a pas de flêche
parmis les caractères de code ASCII compris entre 64 et 95. Seulement
des lettres majuscules et quelques caractères spéciaux. Donc, pas de
contrôle-flêche, c'est une notion absurde.


Maintenant, avant que les terminaux ne soient à la pointe de la
technologie, il y avait des LispMachines, avec des claviers qui
avaient des touches comme Meta, Super, Hyper, Top, Bottom, etc et que
l'on pouvait utiliser dans n'importe quelle combinaison et avec
n'importe quelle autre touche. Emacs s'en est inspiré. Mais bien
sur, il n'y a pas de touche Meta, (ni Super, Hyper ou quoi que ce soit
d'autre) sur un terminal, et pas plus sur un émulateur de terminal,
dont il n'y a aucun protocole pour encoder de telles touches ou des
combinaisons utilisant de telles touches!

Emacs a inventé une façon de faire pour Meta: au lieu de faire une
combinaison meta-x, on peut envoyer le code de contrôle ASCII 27
(Escape), suivit du caractère x. Une alternative, qui est possible
avec les terminaux les plus modernes (ceux qui travaillent en 8 bits,
n'oublions pas que l'ASCII est un encodage sur 7 bits seulement) qui
possèdent une touche Alt qui provoque la mise à 1 du bit de poids fort
(et donc qui transmet des codes entre 128 et 255), est de considérer
que lorsqu'un code compris entre ces valeurs est reçu, c'est une
combinaison meta-x, avec x = code reçu - 128. Ce n'est pas parfait,
car dans ce cas, on ne peut pas considérer les caractères accentués
des codes ISO-8859, seulement des caractères ASCII. Mais avec emacs,
on peut saisir des caractères accentués avec C-x 8 ' e pour faire é,
etc.

Alors, 15 ans plus tard, il n'y a quasiment plus de terminaux, tous
les postes sont des consoles avec des claviers ayant un protocole
permettant de détecter les pression simultanée de n'importe quelle
combinaison de touches, et un écran bitmap permettant d'afficher
n'importe quelles images, et l'ASCII se fait tout petit face à
l'UNICODE. On peut enfin implémenter ce qu'on avait sur LispMachine.
Mais les émulateurs de terminaux sont toujours restrints aux
protocoles de communication entre terminaux et unités centrales conçus
à une époque plus rudimentaire.

Il ne faut pas comettre l'erreur de croire que parce que ton émulateur
de terminal fonctionne sur X, le programme emacs auquel on se connecte
avec le terminal émulé le sait et qu'il travaille avec X lui aussi! Ça
n'a rien à voir, pour emacs, il n'y a qu'un simple terminal, avec un
protocole plus ou moins rudimentaire, mais fondamentalement limité à
quelques caractères ASCII pour la saisie et quelques codes de contrôle
pour déplacer le curseur, rien de plus (voir /etc/termcap, ou
/usr/share/terminfo !).

Pour pouvoir transmettre des notions comme
control-meta-alt-hyper-fleche-vers-le-haut, il faudrait inventer un
nouveau protocole de communication entre terminal et unité centrale,
implémenter un nouvel émulateur de terminal, et des nouveaux pilotes,
et des nouveaux API pour les applications en mode "terminal", afin de
traduire ce protocole de ligne en "keysym" pour ces applications. Il
faudra bien entendu modifier emacs pour tenir compte de ce nouvel API
quand il travaille avec un tel terminal.

Ça fait beaucoup de travail pour un bénéfice pas vraiment évident:
tous les six mois, sans que je ne demande rien, et continuant à payer
toujours le même abonnement, mon fournisseur ADSL me double la vitesse
de ma connexion à Internet. Alors ssh -X emacs marche trés bien
(c'est encore un peu lent à démarrer, mais une fois lancé, c'est tout
à fait utilisable, en tout cas, ça semble rapide qu'en local sur ma
vieille NeXTstation).




Maintenant, si une combinaison de touche donnée avec l'émulateur de
terminal utilisé produit une séquence de codes distincte, il est
trivial de configurer emacs pour en tenir compte:

taper dans ~/.emacs:
(local-set-key "
ici, taper: C-q controle-fleche-gauche
" (function forward-sexp))
C-x C-e
(local-set-key "
ici, taper: C-q controle-fleche-droite
" (function backward-sexp))
C-x C-e

Par exemple, dans mon xterm, ça donne (^[ est escape):
(local-set-key "^[[1;5C" (function forward-sexp))
(local-set-key "^[[1;5D" (function backward-sexp))

Mais mon xterm n'est pas capable d'encoder C-M-flêche-gauche par
exemple: il faudrait que je tape ESC C-flêche-gauche (évidement,
puisque C-flêche-gauche est encodée avec un ESC, comme Meta! Question
de protocole!)

--
__Pascal Bourguignon__ http://www.informatimago.com/
-----BEGIN GEEK CODE BLOCK-----
Version: 3.12
GCS d? s++:++ a+ C+++ UL++++ P--- L+++ E+++ W++ N+++ o-- K- w---
O- M++ V PS PE++ Y++ PGP t+ 5+ X++ R !tv b+++ DI++++ D++
G e+++ h+ r-- z?
------END GEEK CODE BLOCK------
Avatar
Matthieu Moy
(Luc Habert) writes:

Patrice Karatchentzeff :

(add-hook 'term-mode-hook
(define-key function-key-map "^[[C" 'forward-word)
(define-key function-key-map "^[[D" 'backward-word))



Tu perds l'adaptatabilité au $TERM que te donne la solution du $TERM.el.



Attention, term-mode-hook n'a pas grand chose à voir avec le fait
d'être en console ou non. Il est executé quand tu fais M-x term RET
(en console ou sous X, peu importe).

--
Matthieu
1 2 3 4