Interaction fine entre un terminal Cygwin et un Vim distant

Le
Olivier Miakinen
[diapublication entre fcou et fcolc, suivi vers fcolc seul]

Bonjour,

Suite à l'insistance amicale de Lucas, je pose ici une question qui
n'a pas trouvé de réponse sur fr.comp.applications.editeurs-de-texte.
Il s'agit de comprendre comment fonctionne une interaction étroite
entre un terminal Cygwin (ensemble de logiciels libres, essentiellement
GNU, sur Windows) et un éditeur de texte Vim sur GNU/Linux.

J'explique. Désolé si c'est un peu long.

Avec Cygwin sur Windows, je peux lancer une ou plusieurs fenêtres
de type « Terminal » dans lesquelles s'exécute un shell bash. Ces
fenêtres se comportent en gros comme des xterm, sauf qu'elles n'ont
pas besoin qu'un serveur X soit lancé sur le Windows. Pour fixer
les idées bien que ce ne soit pas le réglage d'origine, chez moi
par défaut ces fenêtres affichent 78 lignes de 80 colonnes, et il
y a un ascenseur vertical d'au plus 10 000 lignes. Cet ascenseur
est contrôlable à la souris, y compris avec la molette qui sert
de bouton du milieu.

Si j'appelle l'éditeur vim dans un tel terminal, il prend la tota-
lité de l'espace visible (78 lignes de 80 colonnes), et l'ascenseur
disparaît. La molette de la souris agit alors sur le contenu du
fichier édité dans vim, soit en faisant défiler ce contenu dans
l'espace visible, soit en déplaçant le curseur dans le contenu.
L'un ou l'autre comportement est choisi en priorité selon que dans
vim on a l'option 'set mouse=a' ou bien 'set mouse='. Pour plus
de détails, voir <news:oi8kmq$56n$1@cabale.usenet-fr.net>.

Lorsque je quitte vim, je retrouve la fenêtre dans l'état où je
l'avais laissée au moment d'appeler vim, avec son ascenseur et
toutes les lignes de commandes passées précédemment.

Je trouve ce comportement déjà assez malin, mais il y a mieux.

Si depuis le terminal je fais un ssh vers une machine GNU/Linux,
je retrouve exactement le même comportement quand je lance vim
depuis cette nouvelle machine, que j'utilise la molette de la
souris, et que je quitte vim.

Mais il y a encore plus fort.

Si au lieu de faire un ssh vers un GNU/Linux je le fais vers un
AIX, quand je lance vim sur cet AIX ça ne fonctionne pas aussi
bien : l'ascenseur reste sur la fenêtre, et si j'ai le malheur
de tourner la molette de la souris ça fait défiler toute la
fenêtre au milieu des commandes précédentes. Bon. Mais si à
partir de l'AIX (où ça ne fonctionne pas, donc), je refais un
ssh vers un GNU/Linux, là je retrouve le comportement magique
du début !


Un petit schéma pour illustrer les connexions :

Cygwin (Windows) --(ssh)--> AIX --(ssh)--> Linux --> Vim
| ^
+--+



Ma question : mais bon sang, comment font-ils ?


P.-S. : je viens de remarquer que j'ai exactement la même chose
avec les commandes 'man' et 'less' qu'avec la commande 'vim'.

--
Olivier Miakinen
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Nicolas George
Le #26436705
Olivier Miakinen , dans le message a écrit :
Ma question : mais bon sang, comment font-ils ?

Comme tout ce qui se passe dans un terminal, avec des séquences
d'échappement.
Pour afficher du texte en rouge, une application écrit sur son terminal
les octets 0x1b 0x5b 0x33 0x31 0x6d, ce qui se traduit en « <esc>[31m »,
pour positionner le curseur à un endroit de l'écran, il y a une autre
séquence d'échappement, avec les coordonnées écrites au milieu, pour
effacer idem, etc.
Il y a une séquence d'échappement qui dit au terminal que l'application
veut la souris pour elle-même. Quand elle est émise, et jusqu'à ce que
son contraire le soit, le terminal émet des codes (comportant l'octet
0x1b aussi) à chaque événement souris, au même titre que lors d'appuis
sur des touches spéciales.
Ces séquences d'échappement sont documentées dans la base de données
terminfo. Si la base de données contient les informations pour le
terminal que tu utilises, ça marche, même s'il y a cinquante SSH ou
autre sur le chemin. Si elle ne les contient pas, ça ne marche pas et tu
retrouves le comportement par défaut, empiré par le fait qu'il est
adapté à une application qui affiche du texte au kilomètre, pas qui
occupe tout l'écran en 2D.
AIX est un bon suspect pour avoir une vieille base de données terminfo
incomplète.
Marc SCHAEFER
Le #26436754
Hello,
In fr.comp.os.unix Olivier Miakinen
Ma question : mais bon sang, comment font-ils ?

Vraisemblablement en appelant des fonctions curses(3), ce
qui via termcap ou termios produit des séquences de caractères
dépendantes du terminal qui sont transmises à travers ton
tuyau réseau.
Ca pourrait être un simple:
http://www.paulgriffiths.net/program/c/srcs/curhellosrc.html
exemple:
$ gcc a.c -lncurses
$ echo $TERM
xterm
$ ./a.out | tee /tmp/bla
$ hexdump -C /tmp/bla
00000000 1b 5b 3f 31 30 34 39 68 1b 5b 31 3b 32 34 72 1b |.[?1049h.[1;24r.|
00000010 28 42 1b 5b 6d 1b 5b 34 6c 1b 5b 3f 37 68 1b 5b |(B.[m.[4l.[?7h.[|
00000020 48 1b 5b 32 4a 1b 5b 31 34 3b 33 34 48 48 65 6c |H.[2J.[14;34HHel|
00000030 6c 6f 2c 20 77 6f 72 6c 64 21 |lo, world!|
Les 1b (ESC) [ etc sont des séquences d'échappement que l'on trouvait également
sur certaines imprimantes pour changer le style par exemple.
Le terminal termcap/termio xterm ne doit pas être très éloigné d'un
VT100. La variable $TERM passe à travers ssh.
Références
https://www.xfree86.org/4.8.0/ctlseqs.html
http://hackipedia.org/Protocols/Terminal,%20DEC%20VT100/html/VT100%20Escape%20Codes.html
https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes
Marc SCHAEFER
Le #26436753
Hello,
In fr.comp.os.unix Olivier Miakinen
Ma question : mais bon sang, comment font-ils ?

Vraisemblablement en appelant des fonctions curses(3), ce
qui via terminfo[1] (anciennement termcap) produit des séquences de caractères
dépendantes du terminal qui sont transmises à travers ton
tuyau réseau.
Ca pourrait être un simple:
http://www.paulgriffiths.net/program/c/srcs/curhellosrc.html
exemple:
$ gcc a.c -lncurses
$ echo $TERM
xterm
$ ./a.out | tee /tmp/bla
$ hexdump -C /tmp/bla
00000000 1b 5b 3f 31 30 34 39 68 1b 5b 31 3b 32 34 72 1b |.[?1049h.[1;24r.|
00000010 28 42 1b 5b 6d 1b 5b 34 6c 1b 5b 3f 37 68 1b 5b |(B.[m.[4l.[?7h.[|
00000020 48 1b 5b 32 4a 1b 5b 31 34 3b 33 34 48 48 65 6c |H.[2J.[14;34HHel|
00000030 6c 6f 2c 20 77 6f 72 6c 64 21 |lo, world!|
Les 1b (ESC) [ etc sont des séquences d'échappement que l'on trouvait également
sur certaines imprimantes pour changer le style par exemple.
Le terminal termcap/termio xterm ne doit pas être très éloigné d'un
VT100. La variable $TERM passe à travers ssh.
Références
https://www.xfree86.org/4.8.0/ctlseqs.html
http://hackipedia.org/Protocols/Terminal,%20DEC%20VT100/html/VT100%20Escape%20Codes.html
https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes
[1] dans la première version de ce post j'avais écrit "termios", j'ai trop dû
faire d'I/O séries dans une autre vie.
Doug713705
Le #26436760
[En-tête "Followup-To:" positionné à fr.comp.os.unix.]
Le 26-06-2017, Olivier Miakinen nous expliquait dans
fr.comp.os.unix
( [ SNIP les explications sur les comportements des différents terminaux ]
Un petit schéma pour illustrer les connexions :
Cygwin (Windows) --(ssh)--> AIX --(ssh)--> Linux --> Vim
| ^
+--------------------------------------------------+

Ma question : mais bon sang, comment font-ils ?
P.-S. : je viens de remarquer que j'ai exactement la même chose
avec les commandes 'man' et 'less' qu'avec la commande 'vim'.


Du coup, la réponse se trouve probablement coté terminal.
Sur chacun des environnements (linux, AIX, Windows), que donne:
echo ${TERM}
--
Je ne connaîtrai rien de tes habitudes
Il se peut même que tu sois décédée
Mais j'demanderai ta main pour la couper
-- H.F. Thiéfaine, L'ascenceur de 22H43
Olivier Miakinen
Le #26436912
Bonjour,
Le 26/06/2017 17:50, Nicolas George m'a répondu :
Comme tout ce qui se passe dans un terminal, avec des séquences
d'échappement.
[... explications avec exemple à l'appui ...]
Ces séquences d'échappement sont documentées dans la base de données
terminfo. Si la base de données contient les informations pour le
terminal que tu utilises, ça marche, même s'il y a cinquante SSH ou
autre sur le chemin. Si elle ne les contient pas, ça ne marche pas et tu
retrouves le comportement par défaut, empiré par le fait qu'il est
adapté à une application qui affiche du texte au kilomètre, pas qui
occupe tout l'écran en 2D.

C'est lumineux, un grand merci pour tes explications. Merci aussi à Marc
et aux liens qu'il a ajoutés, et merci à Doug à qui je vais répondre sur
fr.comp.os.unix.
AIX est un bon suspect pour avoir une vieille base de données terminfo
incomplète.

C'est très vrai, d'autant qu'il s'agit d'une version vieille de plus de
dix ans (de mémoire, la 5.3).
--
Olivier Miakinen
Olivier Miakinen
Le #26436911
Le 27/06/2017 10:23, Doug713705 m'a répondu :
[En-tête "Followup-To:" positionné à fr.comp.os.unix.]

De fait, je suis d'accord que ce n'est probablement pas une GNUserie
et que le suivi vers fco.unix est approprié.
P.-S. : je viens de remarquer que j'ai exactement la même chose
avec les commandes 'man' et 'less' qu'avec la commande 'vim'.

Du coup, la réponse se trouve probablement coté terminal.
Sur chacun des environnements (linux, AIX, Windows), que donne:
echo ${TERM}

Sur le terminal Cygwin, je l'avais vérifié, c'est xterm. Je pense que
c'est le cas aussi pour les autres, mais je dois encore m'en assurer.
J'essaye d'y penser demain.
--
Olivier Miakinen
Publicité
Poster une réponse
Anonyme