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:


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.


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'"

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

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


+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.


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.


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.


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.


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


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 :.

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.