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 tmux
Instanzen 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 tmux
und tty
. Danach korrigieren wir es erneut mit einer Methode, die immer verfügbar sein sollte (im Gegensatz zum Befehl reset
).
Wie man ein tmux
Terminal UTF-8
unbrauchbar 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/cat
Sie stty -echo
IMHO nicht provozieren , aber interaktive Befehle wie vim
gewohnt 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 Shift
beim 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-window
beschränkt, tmux
wo 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-right
nur ein Präsentationsfehler auftritt. Beachten Sie auch, dass ich keinen tmux
Befehl 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 tmux
als Ersatz mit der folgenden tmux
Einstellung aktivieren :
set-window-option automatic-rename on
Tun Sie dies entweder in der tmux
Befehlszeile, die im aktuellen Fenster mit "Escape" :
(wobei "Escape" Ihre tmux
Befehlstaste ist) erreichbar ist, und geben Sie dann den Befehl ein.
Oder tmux set-window-option automatic-rename on
in 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 sudo
oder ssh
.
Oder öffnen Sie ein anderes Fenster in der aktuellen tmux
Sitzung 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, tmux
und 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.