Saída do shell de rolagem com o mouse no tmux

252

A rolagem do mouse não funciona no tmux da maneira que funciona quando executo o shell sem o tmux (no Gnome Terminal). Parece que o tmux envia eventos de rolagem do mouse como se eu tivesse pressionado as teclas Para cima / Para baixo. Mas eu quero que ele role pelo histórico de saída do shell . Existe uma maneira de fazer o tmux funcionar assim?

Nota: Eu sei como rolar com o teclado (graças a outra pergunta aqui).

Tentei rolar o mouse em duas versões do tmux:

user31494
fonte
1
Acho que a resposta do bukzor resolve o seu problema para o tmux 1.5 e mais recente.
Kynan

Respostas:

249

Para rolar no histórico da saída Você usaria ^b+ [ Você pode usar M + V para subir e ^ V para descer. Eu não sei se você pode usar o real PgUpe no PgDownentanto. Meu terminal não envia essas chaves para o tmux. Em vez disso, ele se desloca e não a história do tmux.

Para sair do modo de cópia, pressione ESC

Para usar o mouse neste modo (chamado modo de cópia), pressione ^b+ : e digite o seguinte:

setw -g mouse on

Nota: No tmux <2.1, a opção foi nomeada mode-mouse, e nãomouse

Agora, quando você muda para o modo de cópia, pode usar o mouse para rolar através dele. Você pode colocar este comando no seu ~ / .tmux.conf se desejar, para que ele seja carregado toda vez que você executar o tmux.

Atualização: A partir do tmux 1.5, essa opção faz com que a roda de rolagem mude automaticamente para o modo de cópia e role novamente o buffer de rolagem do tmux. Não é necessário primeiro pressionar Ctrl-B+ [mais. Rolar de volta para o prompt também encerra o modo de cópia automaticamente.

Pavlo
fonte
1
Note que você pode ter que recarregar o arquivo de configuração se você já possui um servidor tmux em execução. blog.sanctum.geek.nz/reloading-tmux-config -arquivo de origem tmux ~ / .tmux.conf
Allan Nienhuis
7
Não funciona para mim no OS X.
Ain
2
@Ain - Agora existem 11 versões principais do OS X. De qual versão estamos falando exatamente?
Ramhound
10
Para tmux> = 2.1, consulte a resposta de @ DannyRe (atualmente bastante distante).
Joelostblom
3
set -g mouse ontrabalhou para mim no macOS tmux 2.1
Miguel Mota
123

Existem algumas alterações para o Tmux 2.1

  • O modo do mouse foi reescrito. Agora não há mais opções para:

    • painel de redimensionamento do mouse
    • painel de seleção do mouse
    • janela de seleção do mouse
    • modo-mouse

    Em vez disso, existe apenas uma opção: 'mouse', que ativa totalmente o suporte ao mouse.

Isso seria

set -g mouse on
# to enable mouse scroll, see https://github.com/tmux/tmux/issues/145#issuecomment-150736967
bind -n WheelUpPane if-shell -F -t = "#{mouse_any_flag}" "send-keys -M" "if -Ft= '#{pane_in_mode}' 'send-keys -M' 'copy-mode -e'"
DannyRe
fonte
6
Obrigado, agora a seleção de painéis, etc. funciona, mas a rolagem não. A fim de fazer a rolagem trabalho novamente, use o seguinte: github.com/NHDaly/tmux-scroll-copy-mode
Mahdi
1
impressionante - isso funciona mesmo no cygwin - tmux no WINDOWS 7
GWD
@ Mahdi Isso parece não funcionar no osx. Alguma dica?
DiTTiD
2
bindnão parece mais ser necessário no tmux 2.3 #
Theron Luhn
2
+1 para set -g mouse on. O comentário anterior está correto. A ligação não é mais necessária.
Dakusan
63

A versão atual do tmux (1.5) permite que você simplesmente ative a opção mode-mouse e permita que você role com a roda do mouse.

         mode-mouse [on | off]
                 Mouse state in modes.  If on, the mouse may be used to
                 enter copy mode and copy a selection by dragging, to
                 enter copy mode and scroll with the mouse wheel, or to
                 select an option in choice mode.

No meu .tmux.conf:

set-window-option -g mode-mouse on
Bukzor
fonte
Esse é o comportamento que você realmente deseja! Rolagem do mouse ativando o modo de cópia, não apenas rolando o buffer alternativo do shell. Esse foi finalmente o incentivo para mudar de tela para tmux para mim. Existe uma opção para obter o mesmo comportamento também com Shift + PgUp?
Kynan
1
@kynan: Pessoalmente, apenas pressiono C-A PgUppara fazer isso. Você pode vincular a chave de paginação diretamente com tmux bind-key -n PPage copy-mode -u. O thign semelhante deve funcionar para shift + pageup se você o desassociar do terminal local.
bukzor
1
Isso resulta em um comportamento estranho, quando, quando eu volto para a linha de comando, obtenho um caractere extra inserido na CLI, o que geralmente resulta em meu primeiro comando ser malformado. É muito chato.
Chris R
Observe que, no entanto, isso funciona bem para acionar a rolagem com o mouse, causando um comportamento estranho ao selecionar o texto a ser colado com o clique do meio. Acabei preferindo Cb pg-up / down (o padrão), pois a troca não era aceitável.
h7r 14/05
@ Chrishr Eu também recebo isso um pouco e não é muito consistente. É um tipo de seqüência de caracteres [M [M # [M [M # [M [M # [M [M # [M]]?
Elijah Lynn
53

Tente isso em seu arquivo .tmux.conf

# Make mouse useful in copy mode
setw -g mode-mouse on

# Allow mouse to select which pane to use
set -g mouse-select-pane on

# Allow xterm titles in terminal window, terminal scrolling with scrollbar, and setting overrides of C-Up, C-Down, C-Left, C-Right
set -g terminal-overrides "xterm*:XT:smcup@:rmcup@:kUP5=\eOA:kDN5=\eOB:kLFT5=\eOD:kRIT5=\eOC"

# Scroll History
set -g history-limit 30000

# Set ability to capture on start and restore on exit window data when running an application
setw -g alternate-screen on

# Lower escape timing from 500ms to 50ms for quicker response to scroll-buffer access.
set -s escape-time 50

Retirado de http://brainscraps.wikia.com/wiki/Extreme_Multitasking_with_tmux_and_PuTTY

John L. Jegutanis
fonte
+1 para escape-timeconfiguração
Dakusan
Para quem quiser saber, o arquivo .tmux.conf é colocado no seu diretório pessoal.
user2647513
15

Alguém (de uma fonte que perdi) sugeriu adicionar o seguinte a ~.tmux.conf:

set -g terminal-overrides 'xterm*:smcup@:rmcup@'

Não tenho idéia de como ele funciona ou o que faz, mas isso agora me permite rolar com a roda do mouse dentro de uma sessão do tmux sem precisar entrar no modo de cópia do tmux; Eu apenas giro a roda e BAM! funciona. Observe que estou usando o terminal.app, mas lembro que o OP deu a resposta especificamente para uso com gnome-terminal.

Jed Daniels
fonte
1
Jed, obrigado! Seu conselho também funciona no terminal gnome. Vou tentar usar essa configuração por algum tempo. Mas tem uma desvantagem: a rolagem do mouse agora não funciona conforme o esperado less. Se eu carregar lessdentro tmux, a rolagem do mouse não rolará o arquivo aberto less. Rola o terminal inteiro. Estranhamente, vimcomporta-se como esperado dentro de tmuxsua configuração.
user31494
2
Observe que, a partir do tmux 1.5, isso é substituído pela setw -g mode-mouse onopção, que faz a rolagem do modo de cópia usando a roda do mouse.
K9an
3
A explicação é que essa opção desativa o bloqueio de rolagem na tela alternativa do terminal, o que é desejável na maioria dos casos, pois os aplicativos que solicitam o buffer de tela alternativo (vi, less, tmux etc.) fornecem seus próprios recursos de rolagem. A substituição desse bloqueio no tmux permite rolar o buffer de tela alternativo do terminal, o que não fornece o resultado desejado em todos os casos, exceto em alguns. Consulte esta resposta para obter uma cotação de man xtermexplicação da tela alternativa.
Kynan
Infelizmente, isso não funciona no iTerm
Suan
Eu tive resultados positivos com este em iTerm 2
Keith Smiley
5

O tmux 2.1 introduz novos vínculos de mouse.

Eu escrevi essas ligações agora mesmo hoje. Ele liga perfeitamente a roda do mouse às setas quando não estiver no Vim, porque o Vim é capaz de interpretar os códigos brutos da roda do mouse (para fins como escolher qual janela do Vim será rolada para você, dependendo de qual o mouse está sobre).

Isso significa que podemos finalmente usar o mouse apenas para visualizar várias páginas do manual e qualquer outra coisa que aceite teclas de seta. Você pode estender e encadear a iflógica conforme necessário para implementar mais lógica para seus aplicativos.

bind -n WheelUpPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Up"
bind -n WheelDownPane if "[[ #{pane_current_command} =~ vim ]]" "select-pane -t = ; send-keys -M" "select-pane -t = ; send-keys Down"

Com esse novo recurso de ligação de roda, é possível criar um script na roda do mouse para executar qualquer comportamento sensível ao contexto que você desejar.

Steven Lu
fonte
Agora estou apenas brincando com a idéia de fazer a roda do mouse na borda do painel fazer algo interessante. Provavelmente, o que farei não é mapear a roda na borda, mas mapeá-la para percorrer as janelas do tmux quando terminar sobre a linha de status.
Steven Lu
Qual é o link para o seu Github? Eu gostaria de acompanhar seus esforços! Outro recurso que estou procurando é clicar duas vezes em copiar a palavra para a área de transferência do X, como acontece fora do Tmux.
joeytwiddle
@joeytwiddle Eu recomendo o github.com/NHDaly/tmux-better-mouse-mode , veja minha outra resposta
Steven Lu
3

O Gnome-terminal faz alguns truques, traduzindo eventos de rolagem do mouse para as teclas de seta Para cima e Para baixo em condições de rolagem "usual" restrita. Por exemplo, quando você ver algum texto usando less(isso acontece em particular quando você está lendo um homem), você pode rolar o conteúdo usando j, ke teclas de seta. Mas também com isso gnome-terminalvocê pode fazer isso com a rolagem do mouse, graças ao truque mencionado.

Então eu acho que tmuxfaz algumas "capturas" do terminal da mesma forma less- e o mesmo mecanismo gnome-terminalentra em ação: a rolagem do mouse se traduz em pressionamentos das teclas de seta Para cima / Para baixo.

Você pode desativar esse recurso nas configurações de perfil e obter a rolagem regular em qualquer circunstância. Apenas desmarcar a última caixa de seleção na guia "rolagem": a caixa de seleção.

ulidtko
fonte
Obrigado pela explicação, uldtko! Mas isso não ajuda no problema de rolagem do mouse. Sim, com a opção desativada, gnome-terminalpara o envio triplo ^[[Ae ^[[Ba rolagem do mouse. É melhor tmux(não é feio ^[[A^[[A^[[Aem alguns programas, não é feio comando-histórico-rolagem), mas agora lesspára de rolar no rolagem do mouse.
user31494
1
Ucraniano? (supondo pelos icaracteres)
dotancohen
1

https://github.com/NHDaly/tmux-better-mouse-mode

Implementação configurável e rica em recursos do controle do mouse para tmuxes mais recentes. altamente recomendado.

Você provavelmente deseja usar

set -g @emulate-scroll-for-no-mouse-alternate-buffer "on"

com ele também.

Steven Lu
fonte
Eu instalei isso, mas não consigo mais destacar e copiar texto com o mouse. Você é capaz de fazer isso?
jonathanking
Sim, você provavelmente tem outra configuração tmux relacionada ao mouse que esteja em conflito com ela.
Steven Lu
0

Você pode combinar as idéias de encadernação das outras respostas para obter um comportamento de rolagem bastante satisfatório: funciona no vim muda para o modo de cópia automaticamente no terminal e sai quando você chega ao fundo; ainda assim, você pode usar o botão do mouse em man, less e journalctl.

Meu código:

bind -n WheelUpPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Up Up Up Up"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"
bind -n WheelDownPane if -t = "test $(echo #{pane_current_command} |grep -e 'man' -e 'less' -e 'journalctl')" "select-pane -t = ; send-keys Down Down Down Down"  "if-shell -F -t = '#{?mouse_any_flag,1,#{pane_in_mode}}' 'send-keys -M' 'select-pane -t = ; copy-mode -e; send-keys -M'"

você pode adicionar outros comandos que requerem teclas de seta para rolar na parte grep -e 'man'

eu adicionei as chaves de envio várias vezes, para que um tique no volante do mouse role 4 linhas por vez

stealz
fonte
0

Se você já estiver em uma sessão do tmux, poderá executar o comando

set mouse on

Lembrete: para executar comandos, use seu prefixo :.

Robert
fonte