L'invite bash Cygwin encapsule des lignes sur la même ligne

56

J'utilise l'invite Cygwin bash et, pour les commandes longues, le texte sera enroulé autour de la même ligne, au lieu de passer à la ligne suivante malgré le réglage «PS» de ma PS1.

Voici une capture d'écran,
capture d'écran

wting
la source
11
Quelle est la valeur de TERMla variable d'environnement? Pour la console Cygwin, cela devrait être cygwin.
Ak2
1
@ ak2 cela corrige le problème pour moi, merci. Cygwin sur Mintty.
Josué

Réponses:

58

J'utilisais déjà MinTTY, et la suppression de la nouvelle ligne dans PS1 ne m'a pas aidé non plus. Un conseil sur cette page a été utile. J'ai exécuté cette commande bash:

kill -WINCH $$

Dans mon cas, le fait d'exécuter ceci une fois a résolu le problème, même après la déconnexion et le retour. Je ne suis pas sûr que ce soit toujours le cas.

jtpereyda
la source
1
À en juger par -WINCH, cela indique au processus Bash que la fenêtre du terminal a été redimensionnée. Donc, cela devrait être fait après chaque redimensionnement de la fenêtre du terminal, je suppose.
ivan_pozdeev
7
@ivan_pozdeev, je viens de constater que vous n'avez qu'à faire ceci: vous redimensionnez alors que vim est ouvert: vim reçoit le signal et se redessine à la nouvelle taille, mais il n'est pas transmis à son processus parent et bash pense donc toujours à la taille du fichier. l'écran est ce qu'il était quand vim ouvert.
akatakritos
cela a également fonctionné pour moi
konqui
Cela a fonctionné pour moi aussi, merci @jtpereyda!
Jason R. Mick
Merci, c’était définitivement le problème pour moi - redimensionner le terminal dans vim. Je pense qu'il devrait être assez facile de résoudre ce problème, mais je ne le sais pas.
Iguananaut
22

Pour moi, la solution a été d’ajouter les lignes suivantes à .bashrc:

PS1='\[\e[32m\]\u@\h:\W> \[\e[0m\]'
TERM=cygwin
export PS1
export TERM

Notez que les caractères non-imprimables dans l'invite doivent être enfermés dans \[... \].

Digory Doo
la source
6
Comme mentionné par @ ak2 dans un commentaire sous la question initiale, l'exportation TERM = cygwin est suffisante pour résoudre le problème.
dregad
1
ce n'était pas suffisant dans mon cas. Si PS1 contient des séquences d'échappement qui ne figurent pas entre \ [... \], le problème d'encapsulation persiste. définir la variable d'environnement TERM peut suffire dans votre cas, mais j'en doute.
digory doo
Pour moi, cela résout le problème que la deuxième ligne écrase la première ligne. Cependant, sauf si j'utilise exactement un terminal d'une largeur de 80, la position du curseur et le décalage du texte sont toujours incorrects (avec cygwin64, menthe 2.3.7)
MM
Ajout de \ [... \] problème résolu pour moi.
Trismegistos
8

J'ai eu le même problème avec MinTTY. Le problème a probablement quelque chose à voir avec l'invite principale (PS1).

La solution pour moi était de supprimer le dernier caractère "nouvelle ligne" de PS1 (juste avant le signe "$"):

user@host ~
$ echo $PS1
\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\n\$

user@host ~
$ export PS1='\[\e]0;\w\a\]\n\[\e[32m\]\u@\h \[\e[33m\]\w\[\e[0m\]\$ '

user@host ~ $

voir http://cygwin.com/ml/cygwin/2001-07/msg00140.html pour référence.

Pour que cette modification soit persistante, ajoutez export PS1 = '[\ e] 0; \ w \ a] \ n [\ e [32m] \ u @ \ h [\ e [33m] \ w [\ e [0m] \ $ 'dans votre fichier ~ / .bashrc.

Yariv
la source
1
Ça
Cela a fonctionné pour moi, mais en plus de supprimer la dernière nouvelle ligne, je devais également redémarrer le terminal Cygwin.
christosc
5

Comme l'ont fait remarquer dregad et ak2 , la configuration export TERM=cygwinde mon ~/.bashrcfichier était suffisante pour résoudre ce problème.

blong
la source
5

La réponse de @ jtpereyda est certainement intéressante . Mais pour une raison quelconque, je ne pouvais pas laisser passer ça et creuser un peu plus profondément.

En développant ce commentaire , si vous redimensionnez le terminal alors que vous êtes dans vim (ou toute autre application plein écran prenant le contrôle du tty loin du shell), le résultat SIGWINCHest souvent non envoyé au shell, donc quand il reprend le contrôle, sais pas que le terminal a été redimensionné.

Lorsque vous redimensionnez votre terminal, il doit appeler un ioctl(..., TIOCSWINSZ, ...)pty principal sur lequel vim s'exécute. Cela aboutit à un killpg(SIGWINCH)groupe de processus sur vim.

Le problème est que vim s'exécute dans son propre groupe de processus, distinct du shell à partir duquel il a été exécuté. Le shell bash ne reçoit pas le SIGWINCHet ne modifie pas ses lignes / colonnes de manière appropriée.

Si vous souhaitez une solution de contournement permanente, ajoutez-la shopt -s checkwinsizeà votre .bashrc. Cela permet à bash de vérifier la taille de la fenêtre ( ioctl(..., TIOCGWINSZ, ..)) après le retour de chaque commande et de mettre à jour ses lignes / colonnes.

Iguananaut
la source
Qu'est-ce que vim va faire avec la question? OP n'utilise pas vim.
DavidPostill
1
Je voulais faire référence à une question différente qui, à mon avis, rendait la connexion plus évidente, mais en résumé, une des causes possibles du problème du PO consiste à ouvrir une application de terminal complète comme vim, à redimensionner le terminal, puis à le quitter. Comme je l'ai expliqué, le shell ne voit pas SIGWINCH. Ainsi, lorsque vous quittez vim, il pense toujours que le terminal a la taille précédente, ce qui entraîne divers problèmes de retour à la ligne.
Iguananaut
2

Quelque chose est cassé dans les paramètres de votre terminal (probablement).
Je suppose que vous auriez déjà essayé de quitter cette session et d’en redémarrer une nouvelle.

Bien que vous n'ayez pas de solution pour le terminal Cygwin, essayez MinTTY (en réalité, c'est mieux).

nik
la source
1
Je vois ce problème dans Cygwin sur plusieurs machines, mais MinTTY a une meilleure apparence et résout le problème d’emballage. Deux oiseaux avec une pierre!
wting
Notez que MinTTY est le terminal par défaut pour Cygwin depuis fin 2011 .
Hugh W
1

Comme l'a commenté akatakritos , vous avez probablement redimensionné votre terminal alors que vim était ouvert.

Lorsque cela se produit, il suffit de redimensionner le terminal une fois de plus et le problème disparaît.

olivieradam666
la source
Merci! Bien que je n'utilise pas cygwin, cela a résolu le problème de "boucler sur la même ligne" à ma bash - il suffit de démaxiser la fenêtre du terminal, puis de la maximiser à nouveau et le problème a disparu :)
Nick Humphrey