web-dev-qa-db-fra.com

tmux status-bar corrompu après avoir attrapé un fichier binaire, comment réinitialiser?

J'ai accidentellement vissé mon terminal tmux après cating un fichier binaire. Maintenant, mon tmux est foiré. Le détachement et la remise en place n'aident pas, pas plus que le redessin (C-b r). L'exécution de reset ne fait que redessiner le volet actif, pas le reste. Fonctionnement ssty sane à l'intérieur ou à l'extérieur tmux n'aide pas non plus.

tmux messed up

Dans chaque volet, j'ai un retour normal de ce que je tape (l'appel initial de reset immédiatement après que le terminal a été gâché a résolu ce problème), mais je n'arrive pas à corriger la barre d'état.

Dans gnome-terminal, chaque mise à jour de la barre d'état entraîne une augmentation de la barre d'état (voir capture d'écran ci-dessus). Par exemple, cela se produit lorsque j'exécute une nouvelle application, lorsque je change de volet ou lorsque je redimensionne un volet. Forcer un nouveau tracé (par C-b r, en exécutant reset ou via le menu gnome-terminal) réduit la barre d'état à une seule ligne, mais elle reste corrompue.

Dans xterm, la barre d'état reste sur une seule ligne, mais elle reste corrompue comme illustré.

J'utilise tmux 1.5.

  • Comment réparer mon tmux- terminal?

Ce rapport de bogue de 2008 semble décrire le même problème, mais il a été marqué comme corrigé. Je ne sais pas dans quelle version il a été corrigé, mais tmux 1.5 devrait inclure un correctif de 2008.

97
gerrit

Essayez de renommer la fenêtre 4

  • Passer à la fenêtre 4: Control+b4
  • Renommer la fenêtre: Control+b,Control+u myNewname

(C'est une virgule au milieu)

Ou: Control+b :rename-window myNewname

86
Rqomey

Vous avez besoin de deux séquences de commandes pour nettoyer le désordre:

Tout d'abord, exécutez ceci dans la fenêtre brouillée (cela fonctionne même lorsque vous êtes dans ssh):

stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$Shell"`" "`uname -n`"; tput reset; tmux refresh

Exécutez ensuite ceci sur l'ordinateur qui exécute tmux (cela fonctionne à l'intérieur et à l'extérieur de tmux):

La commande suivante affecte toutes les instances tmux, ce qui peut modifier l'état de gauche de plus que la fenêtre actuelle. Si vous n'avez pas besoin de cette fonctionnalité, laissez-la de côté.

tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done

Expliqué en détail

Cela a été assemblé pour répondre à tous les bits trouvés dans d'autres réponses et commentaires. Il ne semble actuellement qu'un petit peu avec la deuxième commande. (Voir dans le "bit manquant" ci-dessous).

Pour comprendre comment cela fonctionne, supprimons d'abord la ligne d'état de tmux et tty. Ensuite, nous le corrigeons à nouveau, en utilisant une méthode qui devrait toujours être disponible (contrairement à la commande reset).

Comment rendre un terminal tmux (suppose que UTF-8) Inutilisable

stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'

Attention: Après avoir exécuté la commande ci-dessus, le shell a l'air aveugle et sourd et semble ne parler que de conneries dans une langue étrangère inconnue. Voir ci-dessous comment réparer cela.

Expliqué:

  • stty -echo Tue la réponse du type de terminal

  • printf '\016' Fait un SO, vous êtes donc sur le jeu de caractères alternatif

  • printf '\033]2;%s\007' 'right status text' Définit le bon état, dans ce cas $'\355 ', Ce qui expose un bogue de présentation

  • printf '\033k%2000s\033\\' $'\302\217' Définit le nom du titre de la fenêtre

Cela pourrait être la combinaison que vous pouvez voir sur le terminal après qu'une commande interactive se soit écrasée et replacée dans le shell. (Avec /bin/cat Vous ne pouvez pas provoquer stty -echo À mon humble avis, mais les commandes interactives comme vim définissent généralement cela.)

Maintenant, nettoie ce gâchis

stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$Shell")" "$(uname -n)"; tput reset; tmux refresh

Remarque: Si vous utilisez le copier-coller (vous devez probablement maintenir Shift enfoncé pendant le collage), vous ne pourrez probablement pas voir votre collage si vous avez utilisé la commande ci-dessus pour gâcher votre tty. Par conséquent, appuyez simplement à l'aveugle sur la touche Entrée après l'avoir collé.

Expliqué:

  • stty sane Définit des paramètres de terminal "sains", vous récupérez donc votre écho en tapant

  • printf '\033k%s\033\\' "$(basename "$Shell")" remet le titre de la fenêtre à la normale. Vous pouvez également utiliser tmux rename-window "$(basename "$Shell")", mais tmux rename-window Est limité à tmux où la séquence d'échappement fonctionne toujours.

  • printf '\033]2;%s\007' "$(uname -n)" réinitialise le droit d'état à afficher par défaut. (Notez que vous ne devez pas utiliser tmux set status-right "something", Car il ne produit que le pane title Qui a été corrompu, donc status-right Expose simplement un bogue de présentation. Notez également que je n'ai pas trouvé une commande tmux pour définir directement le titre du volet.)

  • tput reset Réinitialise le terminal, juste au cas où cela aurait été gâché

  • tmux refresh Rafraîchit l'écran pour se débarrasser des autres débris qui auraient pu apparaître

Bit manquant

La fonction printf '\033k%s\033\\' "$(basename "$Shell")" perd la capacité standard de tmux de présenter la commande actuelle dans la zone d'état de gauche. Après que printf '\033k%s\033\\' "something" A été exécuté, cette capacité est perdue et je n'ai pas encore trouvé un bon moyen de la ramener comme avant.

Mais, comme indiqué dans les commentaires ci-dessous, vous pouvez activer une fonctionnalité similaire de tmux en remplacement avec le paramètre tmux suivant:

set-window-option automatic-rename on
  • Soit faites ceci dans la ligne de commande tmux, qui peut être atteinte dans la fenêtre courante avec "Escape" : (Où "Escape" est votre clé de commande tmux), puis entrez la commande.

  • Ou exécutez tmux set-window-option automatic-rename on Dans votre terminal actuel, mais cela échoue si vous n'êtes pas directement au bon niveau du shell, par exemple cela ne fonctionne pas dans Sudo ou ssh.

  • Ou ouvrez une autre fenêtre dans la session tmux en cours et exécutez la commande suivante:

    for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
    
  • Ou ouvrez un autre shell sur l'ordinateur qui exécute tmux et exécutez la commande suivante (en dehors de tmux):

    tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
    

PS: Merci à tous ceux qui ont aidé à assembler cette solution.

61
Tino

Le problème spécifique que vous voyez a à voir avec le nom/titre de la fenêtre 4. Une combinaison d'être trop long (évidemment) et contenant des caractères étranges qui amène tmux à le mesurer comme étant plus court (donc il ne parvient pas à limiter correctement la barre d'état à la largeur de l'écran) Je ne sais pas comment le réinitialiser (sur le mien, il suit le nom du processus de premier plan), vous devrez peut-être fermer la fenêtre.

26
Random832

faites simplement ceci $ reset && tmux rename-window <new_window_name>

5
John Morales
tmux set-option -g status off && tmux set-option -g status on 

corrigé cela pour moi quand quelque chose d'autre que le nom de la fenêtre était corrompu et je ne pouvais pas être dérangé pour comprendre ce que c'était.

5
Harald Wagener

Essayez de recharger votre fichier de configuration?

Ctrlb, puis: :source-file ~/.tmux.conf

2
Not Now

tmux pourrait ne constituer qu'une partie du problème. Vous devrez peut-être invoquer stty sane sur la ligne de commande. Cela réinitialise les pilotes TTY dans le noyau à un ensemble de valeurs par défaut qui vous permettent généralement de continuer. Si les pilotes TTY sont suffisamment gâchés, vous devrez peut-être taper stty sane "aveugle", c'est-à-dire sans rétroaction à l'écran.

2
Bruce Ediger