Necesita dos secuencias de comandos para limpiar el desorden:
Primero, ejecute esto en la ventana ilegible (esto funciona incluso cuando está dentro ssh
):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Luego ejecute esto en la computadora que funciona tmux
(funciona dentro y fuera de tmux
):
El siguiente comando afecta a todas las tmux
instancias, que pueden cambiar el estado izquierdo de más de la ventana actual. Si no necesita esa función, no la use.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Explicado en detalle
Esto fue ensamblado para abordar todos los bits encontrados en otras respuestas y comentarios. Actualmente parece que solo queda un poco con el segundo comando. (Ver en el "bit faltante" a continuación).
Para entender cómo funciona esto, primero eliminemos la línea de estado de tmux
y el tty
. Luego lo corregimos nuevamente, usando un método que siempre debe estar disponible (a diferencia del comando reset
).
Cómo hacer que un tmux
terminal (se supone UTF-8
) sea inutilizable
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Advertencia: después de ejecutar el comando anterior, el caparazón se ve ciego y sordo y parece hablar tonterías en un idioma extraño desconocido. Vea a continuación cómo reparar esto.
Explicado:
stty -echo
mata la respuesta de tipo terminal
printf '\016'
hace un SO
, así que estás en el conjunto de caracteres alternativo
printf '\033]2;%s\007' 'right status text'
establece el estado correcto, en este caso $'\355
', que expone un error de presentación
printf '\033k%2000s\033\\' $'\302\217'
establece el nombre del título de la ventana
Esta podría ser la combinación que puede ver en el terminal después de que un comando interactivo se bloqueó y volvió a caer en el shell. (Con /bin/cat
usted no puede provocar stty -echo
IMHO, pero los comandos interactivos como por lo vim
general configuran esto).
Ahora limpia este desastre
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Nota: Si usa copiar y pegar (probablemente necesite mantener presionado Shift
mientras pega), probablemente no pueda ver su pegado si ha usado el comando anterior para confundirlo tty
. Por lo tanto, solo presione ciegamente la tecla Enter después de pegar esto.
Explicado:
stty sane
establece parámetros de terminal "sanos" para que recuperes tu eco mientras escribes
printf '\033k%s\033\\' "$(basename "$SHELL")"
configura el título de la ventana de nuevo a la normalidad. Puede usar tmux rename-window "$(basename "$SHELL")"
alternativamente, sin embargo, tmux rename-window
está limitado a tmux
donde la secuencia de escape siempre funciona.
printf '\033]2;%s\007' "$(uname -n)"
restablece el derecho de estado para que se muestre como predeterminado. (Tenga en cuenta que no debe usarlo tmux set status-right "something"
, ya que solo genera el pane title
que se corrompió, por lo que status-right
solo expone algún error de presentación. También tenga en cuenta que no encontré un tmux
comando para establecer el título del panel directamente).
tput reset
restablece el terminal, en caso de que esto se haya estropeado
tmux refresh
actualiza la pantalla para deshacerse de otros desechos que podrían haber aparecido
Pedazo perdido
La printf '\033k%s\033\\' "$(basename "$SHELL")"
pierde la capacidad estándar de tmux
presentar el comando actual en el área de estado de la izquierda. Después de que printf '\033k%s\033\\' "something"
se ejecutó esta habilidad se perdió y no encontré una buena manera, sin embargo, cómo recuperarla como estaba antes.
Pero, como se señala en los comentarios a continuación, puede activar una función similar tmux
como reemplazo con la siguiente tmux
configuración:
set-window-option automatic-rename on
Haga esto en la tmux
línea de comando, que se puede alcanzar en la ventana actual con "Escape" :
(donde "Escape" es su tmux
tecla de comando) y luego ingrese el comando.
O ejecute tmux set-window-option automatic-rename on
en su terminal actual, pero esto falla en caso de que no esté directamente en el nivel de shell correcto, por ejemplo, no funciona dentro de sudo
o ssh
.
O abra otra ventana en la tmux
sesión actual y ejecute el siguiente comando:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
O abra otro shell en la computadora que se está ejecutando tmux
y ejecute el siguiente comando (esto está fuera 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
PD: Gracias a todos los que ayudaron a armar esta solución.