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 tmux
instâ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 tmux
e tty
. Depois, corrigimos novamente, usando um método que deve estar sempre disponível (ao contrário do comando reset
).
Como tornar um tmux
terminal (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/cat
você não pode provocar o stty -echo
IMHO, mas comandos interativos como vim
geralmente 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 Shift
e 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 tmux
onde 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 title
que foi corrompido, portanto, status-right
apenas expõe alguns erros de apresentação. Observe também que não encontrei um tmux
comando 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 tmux
apresentar 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 tmux
como substituto pela seguinte tmux
configuração:
set-window-option automatic-rename on
Faça isso na tmux
linha de comando, que pode ser acessada na janela atual com "Escape" :
(onde "Escape" é sua tmux
chave de comando) e, em seguida, insira o comando.
Ou faça uma multa tmux set-window-option automatic-rename on
no 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 sudo
ou ssh
.
Ou abra outra janela na tmux
sessã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 tmux
e 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.