Sie benötigen zwei Befehlssequenzen, um das Chaos zu beseitigen:
Führen Sie dies zunächst im verstümmelten Fenster aus (dies funktioniert auch, wenn Sie sich in befinden ssh):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Führen Sie dies dann auf dem Computer aus, der ausgeführt wird tmux(es funktioniert innerhalb und außerhalb von tmux):
Der folgende Befehl wirkt sich auf alle tmuxInstanzen aus, die den linken Status von mehr als dem aktuellen Fenster ändern können. Wenn Sie diese Funktion nicht benötigen, lassen Sie sie weg.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Im Detail erklärt
Dies wurde zusammengestellt, um alle Bits zu adressieren, die in anderen Antworten und Kommentaren gefunden wurden. Derzeit scheint nur noch ein kleines bisschen mit dem zweiten Befehl übrig zu sein. (Siehe im "fehlenden Bit" unten).
Um zu verstehen, wie dies funktioniert, töten wir zuerst die Statuszeile von tmuxund tty. Danach korrigieren wir es erneut mit einer Methode, die immer verfügbar sein sollte (im Gegensatz zum Befehl reset).
Wie man ein tmuxTerminal UTF-8unbrauchbar macht
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Warnung: Nachdem der Befehl ausgeführt wurde, sieht die Shell blind und taub aus und scheint nur Bullshit in einer unbekannten Fremdsprache zu sprechen. Informationen zur Reparatur finden Sie weiter unten.
Erklärt:
stty -echo bricht die Terminal-Antwort ab
printf '\016'Tut ein SO, so dass Sie auf dem alternativen Zeichensatz sind
printf '\033]2;%s\007' 'right status text'setzt den richtigen Status, in diesem Fall $'\355', der einen Präsentationsfehler aufdeckt
printf '\033k%2000s\033\\' $'\302\217' Legt den Fenstertitelnamen fest
Dies ist möglicherweise die Kombination, die auf dem Terminal angezeigt wird, nachdem ein interaktiver Befehl abgestürzt ist und wieder in der Shell abgelegt wurde. (Mit können /bin/catSie stty -echoIMHO nicht provozieren , aber interaktive Befehle wie vimgewohnt setzen dies.)
Räumen Sie jetzt dieses Durcheinander auf
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Hinweis: Wenn Sie Kopieren und Einfügen verwenden (Sie müssen wahrscheinlich Shiftbeim Einfügen gedrückt halten), wird Ihre Einfügung möglicherweise nicht angezeigt, wenn Sie den oben genannten Befehl verwendet haben, um Ihr Problem zu beheben tty. Drücken Sie daher einfach blind die Eingabetaste, nachdem Sie diese eingefügt haben.
Erklärt:
stty sane Setzt "vernünftige" Terminalparameter, damit Sie beim Tippen Ihr Echo zurückbekommen
printf '\033k%s\033\\' "$(basename "$SHELL")"Setzt den Fenstertitel auf Normal zurück. Sie können tmux rename-window "$(basename "$SHELL")"alternativ verwenden, ist jedoch darauf tmux rename-windowbeschränkt, tmuxwo die Escape-Sequenz immer funktioniert.
printf '\033]2;%s\007' "$(uname -n)"Setzt das Status-Recht zurück, um als Standard angezeigt zu werden. (Beachten Sie, dass Sie diese Option nicht verwenden sollten tmux set status-right "something", da sie nur die beschädigten ausgibt pane title, sodass status-rightnur ein Präsentationsfehler auftritt. Beachten Sie auch, dass ich keinen tmuxBefehl zum direkten Festlegen des Fenstertitels gefunden habe.)
tput reset Setzt das Terminal zurück, falls dies durcheinander gebracht wurde
tmux refresh Aktualisiert den Bildschirm, um andere möglicherweise aufgetauchte Fremdkörper zu entfernen
Fehlendes bisschen
Das printf '\033k%s\033\\' "$(basename "$SHELL")"verliert die Standardfähigkeit tmux, den aktuellen Befehl im linken Statusbereich darzustellen. Nachdem printf '\033k%s\033\\' "something"diese Fähigkeit ausgeführt wurde, geht sie verloren und ich habe noch keinen guten Weg gefunden, wie ich sie wieder zurückbringen kann.
Wie in den Kommentaren unten erwähnt, können Sie eine ähnliche Funktion tmuxals Ersatz mit der folgenden tmuxEinstellung aktivieren :
set-window-option automatic-rename on
Tun Sie dies entweder in der tmuxBefehlszeile, die im aktuellen Fenster mit "Escape" :(wobei "Escape" Ihre tmuxBefehlstaste ist) erreichbar ist, und geben Sie dann den Befehl ein.
Oder tmux set-window-option automatic-rename onin Ihrem aktuellen Terminal ausführen , aber dies schlägt fehl, wenn Sie nicht direkt auf der richtigen Shell-Ebene sind, z. B. funktioniert es nicht in sudooder ssh.
Oder öffnen Sie ein anderes Fenster in der aktuellen tmuxSitzung und führen Sie den folgenden Befehl aus:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
Oder öffnen Sie eine andere Shell für den Computer, der ausgeführt wird, tmuxund führen Sie den folgenden Befehl aus (außerhalb von 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: Vielen Dank an alle, die diese Lösung mit aufgebaut haben.