Você precisa de duas seqüências de comandos para limpar a bagunça:
Primeiro, execute isso na janela ilegível (isso funciona mesmo quando você está ssh):
stty sane; printf '\033k%s\033\\\033]2;%s\007' "`basename "$SHELL"`" "`uname -n`"; tput reset; tmux refresh
Em seguida, execute isso no computador que é executado tmux(funciona dentro e fora de tmux):
O comando a seguir afeta todas as tmuxinstâncias, o que pode alterar o status esquerdo de mais do que a janela atual. Se você não precisar desse recurso, deixe-o de lado.
tmux list-windows -a | while IFS=: read -r a b c; do tmux set-window-option -t "$a:$b" automatic-rename on; done
Explicado em detalhes
Isso foi montado para resolver todos os bits encontrados em outras respostas e comentários. Atualmente, parece apenas um pouquinho menor com o segundo comando. (Veja no "bit ausente" abaixo).
Para entender como isso funciona, vamos primeiro matar a linha de status de tmuxe tty. Depois, corrigimos novamente, usando um método que deve estar sempre disponível (ao contrário do comando reset).
Como tornar um tmuxterminal (assume UTF-8) inutilizável
stty -echo; printf '\016\033k%2000s\\\033\033]2;\355\007' $'\302\217'
Aviso: Após executar o comando acima, o shell parece cego e surdo e parece apenas falar besteira em algum idioma alienígena desconhecido. Veja abaixo como reparar isso.
Explicado:
stty -echo mata a resposta do tipo terminal
printf '\016'faz a SO, então você está no conjunto de caracteres alternativo
printf '\033]2;%s\007' 'right status text'define o status correto, neste caso $'\355', que expõe um erro de apresentação
printf '\033k%2000s\033\\' $'\302\217' define o nome do título da janela
Essa pode ser a combinação que você pode ver no terminal depois que algum comando interativo travou e caiu de volta no shell. (Com /bin/catvocê não pode provocar o stty -echoIMHO, mas comandos interativos como vimgeralmente definem isso.)
Agora limpe essa bagunça
stty sane; printf '\033k%s\033\\\033]2;%s\007' "$(basename "$SHELL")" "$(uname -n)"; tput reset; tmux refresh
Nota: Se você usar copiar e colar (provavelmente precisará pressionar Shifte colar), provavelmente não poderá vê-lo se tiver usado o comando acima para atrapalhar o seu tty. Portanto, basta pressionar cegamente a tecla Enter depois de colar.
Explicado:
stty sane define parâmetros de terminal "sãos", para que você retorne seu eco ao digitar
printf '\033k%s\033\\' "$(basename "$SHELL")"define o título da janela de volta ao normal. Você pode usar como tmux rename-window "$(basename "$SHELL")"alternativa, no entanto, tmux rename-windowé limitado a tmuxonde a sequência de escape sempre funciona.
printf '\033]2;%s\007' "$(uname -n)"redefine o status direito para ser mostrado como padrão. (Observe que você não deve usá- tmux set status-right "something"lo, porque ele gera apenas o pane titleque foi corrompido, portanto, status-rightapenas expõe alguns erros de apresentação. Observe também que não encontrei um tmuxcomando para definir o título do painel diretamente.)
tput reset redefine o terminal, caso isso tenha sido prejudicado
tmux refresh atualiza a tela para se livrar de outros detritos que possam ter aparecido
Bit ausente
Ele printf '\033k%s\033\\' "$(basename "$SHELL")"perde a capacidade padrão de tmuxapresentar o comando atual na área de status esquerda. Depois que printf '\033k%s\033\\' "something"foi executada, essa habilidade está perdida e eu não encontrei um bom caminho, ainda, como trazê-la de volta como era antes.
Mas, conforme observado nos comentários abaixo, você pode ativar um recurso semelhante tmuxcomo substituto pela seguinte tmuxconfiguração:
set-window-option automatic-rename on
Faça isso na tmuxlinha de comando, que pode ser acessada na janela atual com "Escape" :(onde "Escape" é sua tmuxchave de comando) e, em seguida, insira o comando.
Ou faça uma multa tmux set-window-option automatic-rename onno seu terminal atual, mas isso falhará caso você não esteja diretamente no nível do shell certo, por exemplo, ele não funciona em sudoou ssh.
Ou abra outra janela na tmuxsessão atual e execute o seguinte comando:
for a in `tmux list-windows | sed 's/:.*//'; do tmux set-window-option -t "$a" automatic-rename on; done`
Ou abra outro shell no computador que está executando tmuxe execute o seguinte comando (isso está fora do 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: Obrigado a todos que ajudaram a montar esta solução.