Questão Role a saída do shell com o mouse no tmux


Rolagem do mouse não funciona em tmux a maneira como funciona quando eu 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 Acima / Abaixo. Mas eu quero rolar embora o shell saída história. Existe uma maneira de fazer o tmux funcionar assim?

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

Eu tentei mouse rolando em duas versões do tmux:


222


origem


Eu acho que a resposta do bukzor resolve o seu problema para o tmux 1.5 e mais recente. - kynan


Respostas:


Para rolar dentro do histórico da saída Você usaria ^b + [  Você pode então usar M + V para subir de página e ^ V para baixo. Eu não sei se você pode usar o real PgUp e PgDown Apesar. Meu terminal não envia essas chaves para o tmux. Em vez disso, ele se rola e não o histórico 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 insira o seguinte:

setw -g mouse on

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

Agora, quando você mudar para o modo de cópia, você pode usar o mouse para percorrê-lo. Você pode colocar este comando no seu ~ / .tmux.conf se você quiser que ele carregue toda vez que você executar o tmux.

Atualizar: A partir do tmux 1.5, esta opção faz com que o uso da roda de rolagem automaticamente mude para o modo de cópia e role de volta o buffer de rolagem do tmux. Não é necessário primeiro acertar Ctrl-B + [ não mais. Rolando de volta para o prompt também finaliza o modo de cópia automaticamente.


206



Note que você pode ter que recarregar o arquivo de configuração se você já tiver um servidor tmux em execução. blog.sanctum.geek.nz/reloading-tmux-config  arquivo-fonte tmux ~ / .tmux.conf - Allan Nienhuis
Não está funcionando para mim no OS X. - Ain
@Ain - Existem agora 11 versões principais do OS X. De qual versão estamos falando exatamente? - Ramhound
Para tmux> = 2.1, veja a resposta de @ DannyRe (atualmente bem abaixo). - Joel Ostblom
set -g mouse on trabalhei para mim no macOS tmux 2.1 - Miguel Mota


Existem algumas mudanças para o Tmux 2.1

  • O modo de mouse foi reescrito. Não há mais opções para:

    • mouse-redimensionar-painel
    • mouse-selecione-painel
    • janela de seleção de mouse
    • modo-mouse

    Em vez disso, há apenas uma opção: 'mouse' que ativa o suporte do mouse inteiramente.

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

111



Obrigado, agora selecionando painéis, etc trabalho, mas a rolagem não. Para fazer a rolagem funcionar novamente, use isto: github.com/NHDaly/tmux-scroll-copy-mode - Mahdi
incrível - isso ainda funciona no cygwin - tmux no Windows 7 - WD11
@Mahdi Isto parece não funcionar em osx. Alguma dica? - SolidSnake
@SolidSnake: não me lembro de enfrentar problemas usando esse plugin. Funcionou sem problemas, habilitei o modo mouse e instalei-o. Você deve recarregar sua configuração do tmux usando tmux source-file ~/.tmux.conf - Mahdi
bind parece não ser mais necessário no tmux 2.3 - Theron Luhn


A versão atual do tmux (1.5) permite que você simplesmente configure a opção mode-mouse e permite 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 arquivo .tmux.conf:

set-window-option -g mode-mouse on

61



Esse é o comportamento que você realmente quer! 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
@kynan: Eu, pessoalmente, apenas pressione C-A PgUp fazer isso. Você pode vincular a chave de paginação diretamente tmux bind-key -n PPage copy-mode -u. O thign similar deve funcionar para shift + pageup se você desassociá-lo do seu terminal local. - bukzor
Isso resulta em um comportamento estranho onde, quando eu rolar de volta para a linha de comando, recebo um caractere extra inserido na CLI, o que geralmente resulta em meu primeiro comando sendo malformado. É muito chato. - Chris R
Observe que, no entanto, isso funciona bem para acionar a rolagem com o mouse. Isso causa um comportamento estranho ao selecionar o texto a ser colado com o clique do meio. Eu acabei preferindo C-b pg-up / down (o padrão), já que a troca não era aceitável. - h7r
@ Chris Eu recebo isso um pouco demais e não é bem consistente. É um [M [M # [M [M # [M [M # [M [M # [M tipo de corda? - Elijah Lynn


Tente isso no seu .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

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


51



+1 para escape-time configuração - Dakusan


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

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

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


14



Jed, obrigada! Seu conselho também funciona no gnome-terminal. Vou tentar usar essa configuração por algum tempo. Mas tem uma desvantagem: a rolagem do mouse agora não funciona como esperado less. Se eu carregar less dentro tmux, a rolagem do mouse não rola o arquivo aberto less. Ele rola o terminal inteiro. Estranhamente vim se comporta como esperado dentro tmux com sua configuração. - user31494
Note que a partir do tmux 1.5 esta é substituída pela setw -g mode-mouse on opção, que faz o modo de cópia de rolagem usando a roda do mouse. - kynan
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, já que os aplicativos que solicitam o buffer de tela alternativo (vi, less, tmux etc.) fornecem seus próprios recursos de rolagem. Ignorar esse bloqueio no tmux permite rolagem o buffer de tela alternativo do terminal que não dá o resultado desejado em apenas alguns casos. Vejo esta resposta para uma cotação de man xterm explicando a tela alternativa. - kynan
Infelizmente, isso não funciona no iTerm - Suan
Eu tive resultados positivos com isso no iTerm 2 - Keith Smiley


tmux 2.1 introduz novas ligações de mouse.

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

Isso significa que podemos finalmente usar o mouse apenas para visualizar várias páginas de manual e qualquer outra coisa que aceite teclas de seta. Você pode estender e encadear o if ló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 essa nova capacidade de ligação de roda, é possível fazer o script da roda do mouse para fazer qualquer comportamento sensível ao contexto de que você goste.


5



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


O Gnome-terminal faz alguns truques para traduzir os 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ê visualiza algum texto usando less (isso acontece em particular quando você está lendo um homem), você pode rolar o conteúdo usando j, ke as teclas de seta. Mas Além dissocom gnome-terminal, você pode fazer isso com a rolagem do mouse, graças ao truque mencionado.

Então eu acho tmux faz alguma "captura" do terminal como less - e o mesmo mecanismo em gnome-terminal chutes: a rolagem do mouse se traduz em teclas de seta para cima / para baixo.

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


3



Obrigado pela explicação, uldtko! Mas isso não ajuda com o problema de rolagem do mouse. Sim, com a opção desativada, gnome-terminal pára de enviar triplo ^[[A e ^[[B no mouse-scroll. É melhor tmux (sem feio ^[[A^[[A^[[A em alguns programas, nenhum feio de rolagem do histórico de comandos), mas agora less pára de rolar na rolagem do mouse. - user31494
Ucraniano? (adivinhando pelo ipersonagens) - dotancohen


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

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

Você provavelmente quer usar

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

com isso também.


0





Você pode combinar as ideias de ligação das outras respostas para obter um comportamento de rolagem satisfatório: trabalha no vim muda para o modo de cópia automaticamente no terminal e sai quando você alcança o fundo ainda permite que você use o mousewheel 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 exigem teclas de seta para rolagem na parte grep -e 'man'

Eu adicionei as send-keys várias vezes, então um tick na roda do mouse rolará 4 linhas de cada vez


0