tmux status-bar corrompido após catting um arquivo binário, como redefinir?


94

Eu acidentalmente estraguei meu terminal tmux depois de inserir catum arquivo binário. Agora meu tmuxestá bagunçado. Desanexar e reconectar não ajuda, nem um redesenho (Cb r). A execução resetredesenha apenas o painel ativo, não o restante. Executar ssty sanedentro ou fora tmuxtambém não ajuda.

tmux bagunçado

Dentro de cada painel, tenho feedback normal do que digito (a chamada inicial resetimediatamente após o terminal ter atrapalhado resolvido isso), mas não consigo consertar a barra de status.

Em gnome-terminal, todas as atualizações da barra de status levam ao aumento da barra de status (veja a captura de tela acima). Por exemplo, isso acontece quando executo um novo aplicativo, alterno painéis ou redimensiono um painel. Forçar um redesenho (Por C-b r, executando resetou através do menu do terminal gnome) reduz a barra de status para uma única linha, mas permanece corrompida.

Em xterm, a barra de status permanece dentro de uma linha, mas permanece corrompida conforme a figura.

Estou usando o tmux 1.5.

  • Como faço para corrigir meu tmuxterminal?

Este relatório de bug de 2008 parece descrever o mesmo problema, mas foi marcado como corrigido. Não sei em que versão foi corrigida, mas o tmux 1.5 deve incluir uma correção a partir de 2008.


Só tinha esse problema, e "claro" funcionou para mim.
User149818

1
Caso alguém tenha o mesmo problema, depois de fazer tudo isso acima, minha barra de status do tmux ainda estava bagunçada. Definir a opção da janela com o status correto reparou-a.

2
A sugestão acima também corrigiu isso para mim. O comando para fazer isso foi: Control+ b+ :e, em seguida, set -g status-right "#H"defina status-right como o nome do host.
Mayank

Respostas:


85

Tente renomear a janela 4

  • Mudar para a janela 4: Control+b 4
  • Mudar o nome da janela: Control+ b , Control+ umyNewname

(Isso é uma vírgula no meio)

Ou: Control+b :rename-window myNewname


1
Renomear a janela funciona como um encanto
exhuma

4
Você precisa limpar o nome antes de digitar o novo. A maneira mais fácil é com ctrl+u, então a sequência completa éctrl+b , ctrl+u newname
Z0R

1
Sweet - isso funciona byobutambém ( f8, <newname>)
ali_m 18/11/2015

Por que o Control-unecessário? Control-,já está renomeando certo? Embora eu possa confirmar que era necessário no meu caso, é algum tipo de redefinição?
Hbogert

1
Control-u limpa a linha. se cada fatfinger sua senha em um terminal e conhecê-lo, você pode limpar a entrada usando o controle-u, em vez de bater backspace 20 vezes
Rqomey

55

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.


2
Observe o em uname -nvez de hostname -s. hostnameé perigoso no rootcontexto, pois você pode acabar com o host renomeado para -sLinux / Unix mais antigo, onde hostnamenão grok opções.
Tino

Não redefinir o título do painel também me deixa triste; é por isso que estou aqui em primeiro lugar. Obrigado por ser o único na página que ao menos reconhece essa falha!
criar o seu alerta

2
Considere também "tmux setw renomear automaticamente" após corrigir o título da janela
EB.

A stty sanepeça me ajudou quando meu terminal foi ferrado e não mostrou nada. Obrigado!
johnny

Se você deseja o "bit ausente", ou seja, o comando atualmente em execução exibido na área de status esquerda, você pode usar o comando tmux set-window-option automatic-rename.
David Foerster

26

O problema específico que você está vendo tem a ver com o nome / título da janela 4. Uma combinação de ser muito longo (obviamente) e conter caracteres estranhos que fazem com que o tmux o avalie como sendo mais curto (portanto, falha em limitar adequadamente a barra de status para a largura da tela) Não sei como redefini-lo (no meu ele rastreia o nome do processo em primeiro plano), pode ser necessário fechar a janela.


4
o padrão para renomear uma janela é^b - ,
Rob

8
Caso o atalho de teclado no comentário de @ Rob o confunda, é Ctrl- bentão ,.
Doug Paul

Observe que quando você renomeia uma janela, o campo é preenchido previamente com o nome da janela atual (e o cursor está no final desse nome). Como o nome da minha janela era uma longa sequência de lixo, tive que segurar Backspacepor um minuto para limpar o nome atual. Para mim, o feedback visual acabou deixando claro que todo o nome antigo havia sido apagado.
Doug Paul

você também pode usar Ctrl-b :a janela de renomeação <name goes here>; isso usa o sistema de comando tmux em vez do atalho de teclado para esse comando.
Abbafei 31/07/2015

5

simplesmente faça isso $ reset && tmux rename-window <new_window_name>


5
tmux set-option -g status off && tmux set-option -g status on 

corrigi isso para mim quando algo diferente do nome da janela estava corrompido e eu não me incomodei em descobrir o que era.


2

tmuxpode constituir apenas parte do problema. Pode ser necessário chamar stty sanena linha de comando. Isso redefine os drivers TTY no kernel para algum conjunto de valores padrão que geralmente permitem que você prossiga. Se os drivers TTY estiverem confusos o suficiente, talvez seja necessário digitar stty sane"cego", ou seja, sem comentários na tela.


stty sanetambém não resolve o problema. Eu tenho feedback na tela, em cada um dos tmuxpainéis posso digitar e ter feedback normalmente, mas assim que o tmux precisar desenhar algo (por exemplo, executando um novo aplicativo, alternando ou redimensionando painéis), a barra de status se move para os painéis ...
gerrit

2

Tente recarregar seu arquivo de configuração?

Ctrlb, então: :source-file ~/.tmux.conf


melhor solução até agora.
dave

-3

para corrigir o problema para mim:

Acabei de matar o painel de problemas e a janela e criei uma nova janela e painel.

No painel de problemas, CTRL+ AXe CTRL+ AC.


desta forma para mim novamente. há outras maneiras pode ajudar
itech
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.