Como posso limpar o buffer de rolagem no Tmux?

185

Para sua informação, estou usando o Tmux através do aplicativo Mac OS X Terminal.

Daya Sharma
fonte
1
Isso funcionou para mim: notes.jerzygangi.com/…
Mike

Respostas:

211

Essa mesma pergunta me atormenta há algum tempo. Aqui está o melhor que eu propus. Coloque isso no seu arquivo .tmux.conf:

bind -n C-k clear-history

Isso liga ctrl-k ao comando tmux clear-history. O -n after bind faz com que você não precise emitir o prefixo do comando tmux (ctrl-b por padrão). Eu uso o bash, então ctrl-l já faz o equivalente a digitar "clear" na linha de comando. Com essas duas teclas, recebo uma boa combinação de ctrl-l, ctrl-k, que move todo o buffer de rolagem da tela (o "clear") e exclui todo esse histórico (o comando "clear-history" do tmux).

Não é tão bom quanto os combos de 1 tecla do Terminal, do iTerm ou do Konsole para limpá-lo, mas é um mundo melhor do que digitar o histórico claro o tempo todo.

juanpaco
fonte
15
Agradável. Venho fazendo bind k send-keys "clear"\; send-keys "Enter"a parte de limpeza, mas usar o built-in ctrl+lé mais simples, e clear-historylivrar-me do histórico de rolagem é uma boa adição.
21412 Henrik N
1
essa ligação aparafusa meus painéis, removendo todo o texto de todos os painéis e remove as bordas ao redor deles! Alguma idéia sobre o que há com isso?
Ian Vaughan
Caramba. Qual programa shell você usa? Por acaso, já possui algum comportamento definido para ctrl + k?
juanpaco
iTerm2. Acabei de ver que o ctrl + k já faz isso sem o conjunto de ligações tmux, portanto deve ser um mapeamento do iTerm2.
Ian Vaughan
Esquisito. Eu uso o iTerm2 também. Não o atualizo há algum tempo, portanto pode haver uma diferença de versão. Também não uso mais o Ck, porque isso causou problemas com minhas ligações ao vim. Eu uso o Cn agora.
juanpaco
58

Como @juanpaco afirmou corretamente, clear-historyé o comando para limpar o buffer de rolagem.
Vou acrescentar que também gosto de limpar o que está na tela no mesmo comando. Emitir um send-keys -Rredefine (limpa) a tela, então eu uso o seguinte no meu.tmux.conf

bind-key b send-keys -R \; clear-history

Isso limpa a tela E o buffer de rolagem.

z5h
fonte
1
Diretamente da documentação do tmux em send-keys: "O sinalizador -R faz com que o estado do terminal seja redefinido." Você provavelmente só precisa atualizar.
Z5h 13/10/12
20
A desvantagem de usar -R é que sua linha de entrada atual fica oculta, diferentemente de quando você limpa seu terminal com Ctrl + l. O que eu fiz ébind -n C-l send-keys C-l \; clear-history
volpato 26/03
6
Para aqueles de vocês que não sabem (como eu não sabia), para chegar ao estado para inserir o clear-historycomando, pressione Ctrl+Be inicie o comando com dois pontos ( :).
Palswim 19/05
1
@ volpato Gosto da sua abordagem, mas acho que ainda deixa uma 'tela' do buffer na rolagem de volta. Não faço ideia do porquê. -R apaga o prompt, mas eu o 'resolvi' adicionando um Cm extra no final (mas isso o coloca na segunda linha).
Gdogg
2
Você pode condensar isso para send-keys -R C-l \; clear-history.
ivan
35

Cada resposta aqui fala sobre a adição de novas associações de teclas.

Se você só quer fazê-lo ocasionalmente, não precisa de nenhum mapeamento ...

O prefixo é padronizado como <Ctrl-b>

Basta digitar <prefix>:no painel relevante, digite clear-historye pressione enter.

Uma das coisas legais sobre o tmux é que você pode simplesmente executar qualquer um desses comandos ... ou executá-los em um shell / script como tmux command... ou criar um atalho de teclado para eles.

JonnyRaa
fonte
8
É possível digitar os três primeiros caracteres clee, em seguida, preencher automaticamente com <tab>a primeira vez e, na segunda vez, usar <up arrow>para acessar a entrada anterior. Desta forma, é bastante rápido.
BCT
1
Isso não funciona para mim, porque quando começo a digitar após pressionar a <Ctrl-b> the tecla c` é definido para criar uma nova janela.
fraxture 01/04
@fraxture Eu acho que você entendeu errado - depois de pressionar <Ctrl-b> e depois pressionar, :ele fornece um prompt interativo - é aí que você digita 'c'
JonnyRaa
21

Se você deseja combinar CTRL-Lmais histórico claro, adicione isso ao seu ~/.tmux.conf:

bind u send-keys C-l \; run-shell "sleep .3s" \; clear-history

Isso funciona mesmo se você estiver em um shell MySQL, por exemplo.

plu
fonte
1
Isso não parece funcionar durante, digamos tail -f some.log, certo? Existe uma maneira de combinar ctrl-Zcom isso? Pode parecer acertar.
Aaron Gibralter
19

Achei que o uso send-keys -Rera um pouco lento - aqui está outra maneira de limpar a tela e o histórico com um único comando

bind-key C send-keys "clear && tmux clear-history" \; send-keys "Enter"  

Uma chamada tmux aninhada é usada como a mais óbvia

bind-key C send-keys "clear" \; send-keys "Enter" \; clear-history

falha ao limpar o texto atual da tela do histórico - o comando limpar histórico parece ser executado em um encadeamento separado para enviar chaves.

cage433
fonte
5
há uma ressalva nessa abordagem e é que ela funciona apenas em shells locais, porque envia o histórico claro do tmux como string para ser gravado no painel ativo. Eu o adaptei para:bind-key E send-keys "C-k" \; send-keys "C-u" \; send-keys "clear" \; send-keys "Enter" \; run-shell "sleep .3s; tmux clear-history"
Santi P.
12

Muito mais simples que a maioria, eu apenas criei um script de shell chamado clse o executo sempre que quiser limpar minha tela e o buffer de rolagem.

Tudo o que é é isso:

cls

clear;
tmux clear-history;
Brad Parks
fonte
3
Mas e se você não tiver acesso à linha de comando. Por exemplo, quando um servidor está em execução e você está assistindo os logs.
Zudduz 27/10/16
de onde você estaria assistindo os logs? Sobre um servidor web? Se sim, então eu não entendo por que o tmux está envolvido?
Brad Parks
1
É bom poder assistir os logs do servidor e o seu editor vim simultaneamente.
Zudduz 28/10/16
Você usa divisões tmux? Caso contrário, apenas divida sua janela em 2 e visualize seus logs em um, e use o vim no outro, executando o `tmux split" dentro da sua sessão do tmux ... Mas talvez eu não esteja entendendo o que você está fazendo?
Brad Parks
10

Concluiu que isso funciona melhor no TMUX 2.6, limpando a tela, rolando, mas mantendo o prompt exibido depois.

Usa Ctrl-L

bind-key -n C-l send-keys C-l \; send-keys -R \; clear-history
ideasman42
fonte
6

Ctrl-L é usado em aplicativos de console para redesenhar a tela. Eu descobri que, quando ligado a send-keys -Rele, faria com que as teclas de seta deixassem de funcionar corretamente em alguns aplicativos (por exemplo, vim, mc).

Para manter a funcionalidade de redesenho em aplicativos de console, usei:

bind-key -n C-l if-shell -F '#{alternate_on}' 'send-keys C-l' 'send-keys -R C-l; clear-history'

Isso requer que a opção tmux alternate-screenesteja ativada (que é por padrão).

Phil
fonte
3

Eu usei algumas das opções acima e outras fontes para criar:

bind k send-keys C-u \; send-keys C-k \; send-keys " clear && tmux clear-history" \; send-keys "Enter" \; run-shell "sleep .3s" \; send-keys "Up" \; send-keys C-u 

O espaço inicial em "clear && tmux clear-history" impede que o comando seja gravado no arquivo de histórico (desde que você tenha sua configuração de shell para tratar os espaços iniciais desta maneira; google "hist ignore space" + o nome do seu shell para mais info). Eu gostaria que esse comando não aparecesse no meu histórico, pois isso está mais alinhado com o ctrl-k no Terminal.

As primeiras chaves de envio Cu e Ck de chaves de envio limparão o que está digitado no momento no prompt para garantir que o "histórico claro do clear && tmux" seja bem-sucedido (por exemplo, se você digitou "ABCDEFG" no prompt e tiver seu cursor entre o D e o E, isso garante que "ABCD clear && tmux clear-historyEFG" não seja enviado ao shell, o que falharia).

As chaves de envio "Para cima" e as últimas chaves de envio Cu limpam os últimos itens do histórico interno de seus shells. Mesmo com o espaço à direita mencionado acima, o histórico interno do shell incluirá a linha "clear ...". Enviar e Ctrl-u se livra disso.

Por fim, no iTerm, defino ctrl-k para mapear para ctrl-a k (tenho meu prefixo tmux definido como ctrl-a), para que eu possa digitar ctrl-k, que é o que minhas mãos querem fazer com tantos anos de trabalho tão. Eu faço isso acessando o iTerm> Preferências> Perfis> Chaves e adicionando um atalho para enviar o código hexadecimal "0x01 0x6B". Há um ótimo artigo aqui, que fornece mais informações sobre o uso de códigos hexadecimais com tmux e iTerm: http://tangledhelix.com/blog/2012/04/28/iterm2-keymaps-for-tmux/

Isso praticamente me dá o ctrl-k com o tmux. A única coisa que ainda me incomoda é que o verdadeiro ctrl-k sem tmux não terá problemas se você tiver algo digitado no prompt e preservará o que você digitou ao limpar a tela. Como mencionado, essa abordagem precisa limpar o que está digitado para que o comando "clear ..." não falhe. Mas é bem perto!

Brett
fonte
2

Por que não? bind -n C-l send-keys C-l

klebervirgilio
fonte
Gostaria de saber também se há um motivo para não recomendar isso.
Gaston Sanchez
2
Primeiro de tudo, isso não é necessário: -n C-lbasicamente diz 'pegue isso', e então você passa imediatamente a mesma coisa. (isto é, não é uma operação.)… Segundo, sua intenção está desativada, porque ⌃Llimpa a tela , não a rolagem para trás: se você pressionar ⌃B [e rolar para cima, verá que toda a rolagem ainda está gravada; o objetivo desta pergunta é esclarecer que o scrollback (tmux), não o terminal visível.
ELLIOTTCABLE
2

Depois de muita pesquisa e tempo gasto. Encontrei o melhor caminho para mim no zsh e no terminal.app

Estou usando prefix-cpara limpar a tela e prefix-Climpar o histórico e o buffer de rolagem, sem deixar linhas acima porque acho isso irritante.

Sem Vim

# clear screen
bind c send-keys 'C-l'
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys

Com o Vim

# check if the pane is running vim
is_vim="ps -o state= -o comm= -t '#{pane_tty}' \ | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"

# clear screen
bind c if-shell "$is_vim" "send-keys c" "send-keys 'C-l'"
# clear screen and history
bind C send-keys -R \; send-keys C-l \; clear-history \; send-keys
Rahul Katariya
fonte
2

Para uma solução rápida para limpar painéis tmux individuais, você pode configurar um alias ...

# Tmux Clear pane
alias tc='clear; tmux clear-history; clear'
Paul Hale
fonte
1

Então, eu uso a abordagem de plu por um bom tempo há um tempo, mas fiquei cansado das limitações (basicamente, a passagem não tem sentido a menos que seja direcionada a um programa que a entenda).⌃L

Então, eu aprimorei as várias abordagens em respostas diferentes para esse segmento; Embora complexa, essa abordagem funciona com shells e outros comandos :

# ⌃K: Clears the current pane (from <https://stackoverflow.com/a/34162098>)
bind-key -n C-k \
   if-shell "test \"$(printf '#{pane_current_command}' | tail -c 2)\" = sh" \
      "send-keys C-l ; run-shell 'sleep .3s' ; clear-history" \
      "split-window -vp 100 ; clear-history -t ! ; kill-pane"

Experimente tail -f /private/var/log/system.logou algo assim!


Ressalvas:

Há uma observação importante aqui: isso é redimensionar invisivelmente o painel que está sendo limpo, se não for um shell. Isso pode desencadear o comportamento de redimensionamento em alguns aplicativos de linha de comando que estão ouvindo SIGWINCHes; mas meu raciocínio é que esse não é um grande problema, porque esses são programas que você provavelmente não tentará "limpar" de qualquer maneira .

Além disso, a situação de citação de shell já é uma bagunça e pode facilmente se tornar mais uma ao incorporar #{pane_current_command}; portanto, tenha cuidado, talvez seja necessário modificá-lo com base na sua default-commandconfiguração.

O mesmo se aplica ao meu teste do final dessa correspondência de comando "sh"; se você tem default-commandalgo parecido /bin/bash --loginou complicado exec, o comando real pode não terminar com "sh"; use ⌃B :para executar display-message '#{pane_current_command}'se você quiser ver o que está sendo testado.

ELLIOTTCABLE
fonte