Passar eventos do mouse pelo tmux

5

Eu notei que a rolagem no tmux é um desafio e queria saber se era possível fazer com que o tmux os passasse para o aplicativo ou terminal.

Eu posso estar entendendo as coisas erradas aqui, mas eu observei que eu posso rolar páginas de manual em Terminologia (meu emulador de terminal), mas não quando o tmux está rodando. A rolagem do mouse nas páginas man não funciona no xterm mesmo quando o tmux não está em execução, o que me faz pensar que o terminal manipula o evento do mouse E ENVIA envia-os para o aplicativo.

Portanto, minha compreensão atual do fluxo de eventos do mouse é esta:

terminal -> tmux

O problema parece ser que o tmux está impedindo que os eventos cheguem ao aplicativo subjacente. O que quer é isto:

terminal -> tmux -> application

Idealmente, eu combinaria a rolagem nativa da Terminologia com o modo de cópia do tmux (o modo de mouse era ativado e entrava e saía do modo de cópia automaticamente), mas não parece ser possível, pois o tmux lida com a rolagem. próprio.

Isso é o mais próximo do que eu quero como eu venho. A rolagem do mouse funciona e entra e sai automaticamente do modo de cópia, mas em aplicativos como man ele rolará para fora do aplicativo para o histórico de terminal antigo. Além disso, a solução inclui um patch não oficial que torna a portabilidade um problema.

Então é possível ter o tmux ignorando completamente os sinais do mouse e enviá-los para o terminal ou aplicativo subjacente?

    
por Lasse Halberg Haarbye 21.10.2015 / 03:15

4 respostas

5

Se você visualizar uma página de manual diretamente na terminologia, ocorrerá o seguinte:

less (o pager manual) alterna o terminal para a chamada tela alternativa, aquela que não tem um buffer de rolagem e a partir da qual, quando você sai do aplicativo, você retorna ao conteúdo anterior. terminal. Esse modo é normalmente usado por aplicativos de tela inteira (visualizadores, editores, gerenciadores de arquivos, etc.).

less não é capaz de manipular o mouse, e terminology está perfeitamente ciente de que o aplicativo em execução não está interessado em eventos de mouse.

Quando terminology (na verdade, a maioria dos emuladores de terminal) percebe que essas duas condições são atendidas (ou seja, tela alternativa, sem interesse no mouse), ele converte eventos de rolagem em pressionamentos de teclas para cima e para baixo. Portanto, less não vê nenhum evento de mouse, ele só vê pressionamentos de tecla.

Agora vamos colocar tmux entre eles.

tmux está em um lado apenas um aplicativo em execução no seu terminal. Dependendo de sua configuração, pode ou não solicitar eventos de mouse; Eu suponho que você tenha ativado, já que é o padrão. Não é necessário que os aplicativos executados em seu interior tenham qualquer suporte ao mouse. tmux também muda para tela alternativa.

tmux , na outra ponta, é em si um emulador de terminal, assim como terminology . Ele rastreia (para cada janela / painel) se o aplicativo em execução está interessado no mouse e se o aplicativo alternou para a tela alternativa. Esses estados não são refletidos em relação a terminology , é o negócio privado de tmux .

Teoricamente, nada impede que o tmux se comporte como os emuladores gráficos, e transforma esses eventos de rolagem do mouse de terminology em pressionamentos de teclas up / down para less em execução, pois tmux está perfeitamente ciente de que o aplicativo rodando dentro está usando a tela alternativa e não está interessado em eventos de mouse.

Este é provavelmente um recurso que está faltando em tmux e eu recomendo que você registre uma solicitação de recurso contra eles.

Vamos tornar mais complicado se você estiver interessado em detalhes suculentos. Vamos tirar tmux por enquanto.

Há um pequeno problema aqui para observar. Com o mouse tradicional, a roda de rolagem geralmente gera mais de um pressionamento de tecla, talvez em torno de 3 a 5, porque, caso contrário, a rolagem seria muito lenta. Touchpads são capazes de reportar coordenadas muito mais suaves, alguns emuladores de terminal (incluindo terminology ) reconhecem estes e, portanto, reportam teclas para cima / baixo um por um (digamos um único pressionamento de tecla após cada 1/3 de unidade de rolagem, unidade significando o roda do mouse faria de uma só vez). (Eu não tenho um mouse agora, então não posso verificar que terminology com um mouse realmente salta por várias linhas, mas eu suponho que sim.)

O relatório de vários pressionamentos de tecla ao mesmo tempo não faz sentido em algumas circunstâncias, por exemplo, no prompt de busca de less ele volta por talvez 3 entradas da história de uma vez, é totalmente inútil e é uma boa demonstração de que isso é de fato o que está acontecendo nos bastidores. Com um emulador de terminal como terminology mais um touchpad, isso não é um problema se um aplicativo não se importar com o mouse, para que você possa rolar linha por linha, por exemplo, %código%. No entanto, se o aplicativo se importar com o mouse, você voltará à experiência de rolagem brusca porque o protocolo do mouse dentro dos terminais não pode reportar granularidade fina, apenas a unidade de rolagem do mouse antiga. Por exemplo. em less você não pode rolar suavemente, apenas por várias linhas por vez.

Vamos colocar mcview de volta no jogo. É um aplicativo que reconhece o mouse na tela alternativa, assim como tmux , por isso só pode receber eventos de rolagem do mouse de unidades grandes antiquadas. Ele deve presumivelmente enviar vários pressionamentos de teclas de uma vez, assim como os emuladores de terminal reais fazem em rolagens de mouse antigas, caso contrário, a rolagem seria insuportavelmente lenta. Portanto, mesmo que mcview desenvolvedores prossigam e implementem esse recurso, você perderá a suavidade da rolagem.

Eu abri o bug link para trabalhar na melhoria disso, mas nenhum trabalho real foi feito até agora.

    
por 23.10.2015 / 17:37
2

Este problema do tmux tem uma solução .tmux.conf que funcionou muito bem para mim (modifiquei-o para enviar três sinais para cima / para baixo em vez de um por evento de rolagem):

# Emulate scrolling by sending up and down keys if these commands are running in the pane
tmux_commands_with_legacy_scroll="nano less more man"

bind-key -T root WheelUpPane \
    if-shell -Ft= '#{?mouse_any_flag,1,#{pane_in_mode}}' \
        'send -Mt=' \
        'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
            "send -t= Up Up Up" "copy-mode -et="'

bind-key -T root WheelDownPane \
    if-shell -Ft = '#{?pane_in_mode,1,#{mouse_any_flag}}' \
        'send -Mt=' \
        'if-shell -t= "#{?alternate_on,true,false} || echo \"#{tmux_commands_with_legacy_scroll}\" | grep -q \"#{pane_current_command}\"" \
            "send -t= Down Down Down" "send -Mt="'

a resposta do egmont está no local e me levou a essa solução alternativa.

Eu abri outro problema do tmux solicitando funcionalidade semelhante a outros emuladores de terminal.

    
por 02.05.2018 / 23:17
0

Se você estiver trabalhando no OS X, instale o MouseTerm com o SIMBL (carregador de plug-in simples).

Em seguida, configure o arquivo .tmux.conf da seguinte maneira (para o Tmux 2.0, as versões mais novas irão variar):

  • definir o modo -g-mouse em
  • defina -g mouse-resize-pane em
  • set -g mouse-select-pane em
  • set -g mouse-selecione-janela em

Descobri que usar a tecla de opção no meu Macbook Pro executando o Yosemite permitirá que o recurso de seleção / colagem de seleção funcione.

Aqui está um bom artigo sobre o processo / armadilhas:

Habilite o suporte a mouse no Tmux no OS X

    
por 03.02.2016 / 16:37
0

Caso alguém venha aqui na tentativa de encontrar uma solução prática para rolagem em aplicativos de console que ignorem o mouse e ignorem o mouse, consulte esta resposta: link

    
por 06.06.2018 / 19:21