Grave todo o tmux scrollback em um arquivo

194

Como gravar todo o scrollback de uma sessão tmux em um arquivo?

capture-panel pode pegar a tela atual, mas não o scrollback inteiro.

David Wolever
fonte

Respostas:

52

Isso depende do valor history-limitque você definiu no seu .tmux.conf- o padrão é 2000; se você deseja capturar mais, precisará definir explicitamente o número de linhas.

Para capturar o scrollback inteiro, entre no modo de cópia, selecione o scrollback inteiro e puxe-o no buffer e cole-o no seu arquivo.

Como você conseguirá isso dependerá da mode-keysopção que você preferir, vi ou emacs. man tmuxpossui uma tabela útil que descreve as respectivas chaves.

Tenho o seguinte no meu .tmux.confpara simplificar isso:

unbind [
bind Escape copy-mode
unbind p
bind p paste-buffer
bind-key -t vi-copy 'v' begin-selection
bind-key -t vi-copy 'y' copy-selection

O processo para capturar o scrollback completo é então:

PrefixEsc : para entrar no modo de cópia

v : para iniciar a seleção visual (supondo que você já esteja na parte inferior da tela)

gg : para capturar tudo na rolagem

y : para puxá-lo para o buffer

Prefixc : abrir outra janela do tmux

vim scrollback.txt

i : entre no modo de inserção no vim

Prefixp : colar no arquivo

Também há uma resposta aqui descrevendo como copiar o buffer para um arquivo temporário usandoxsel isso pode ser útil.

jasonwryan
fonte
2
Isso é problemático na melhor das hipóteses ... colar no modo de inserção no Vim tem todos os tipos de problemas, por exemplo, quando você tem o recuo automático ativado. Eu nunca fiz isso funcionar para minha satisfação.
precisa saber é o seguinte
13
Se você usar o :set pastevim, o vim ignorará a adição de indentações automáticas ou qualquer combinação de teclas baseada em inserção.
tlunter
@tlunter nice tip!
precisa saber é o seguinte
Isso pode ser feito com ligações de teclas padrão?
Daveloyall
@daveloyall Claro, só não use as opções de keybinds I incluídos do meu .tmux.conf...
jasonwryan
224

Para quem procura uma resposta simples, basta usar prefix+ :e digite capture-pane -S -3000+ return(Substitua 3000por quantas linhas você desejar salvar.) Isso copia essas linhas em um buffer.

Em seguida, para salvar o buffer em um arquivo, basta usar prefix+ :novamente e digite save-buffer filename.txt+ return, substituindo o filenameque desejar.

(Por padrão, prefixé ctrl + b.)

Molho McBoss
fonte
14
save-buffer filename.txtparece salvar o arquivo /, não no pwd(diretório atual). Em vez disso, eu forneci um caminho de arquivo absoluto e funcionou como um encanto
MohamedEzz
15
e não se esqueça de que o sinal de menos na frente do <<quantidade> de linhas de buffer - você quer salvar>>
Yordan Georgiev
9
Esta é a melhor resposta aqui. Muito obrigado.
Jesse Atkinson
7
Sim, você venceu. Essa deve ser a resposta principal.
wordsforthewise
1
+ n> 1 Depois de fazer o login para votar, parece que esta é pelo menos a segunda vez que essa resposta foi útil para mim. XD
L0j1k 28/03
159

Com o tmux 1.5, o capture-panecomando aceita -Se -Eespecifica as linhas inicial e final da captura; valores negativos podem ser usados ​​para especificar linhas do histórico. Depois de ter os dados em um buffer, você pode salvá-los com save-buffer.

Aqui está um exemplo de ligação (adequado para .tmux.conf) que encerra tudo com um prompt para o nome do arquivo:

bind-key P command-prompt -p 'save history to filename:' -I '~/tmux.history' 'capture-pane -S -32768 ; save-buffer %1 ; delete-buffer'

Isso captura (até) 32768 linhas do histórico mais as linhas exibidas no momento. A partir do tmux 1.6, você pode usar números até INT_MIN se o seu painel tiver um histórico mais profundo que as linhas de 32Ki (geralmente até 2Gi). A partir do tmux 2.0, você pode usar capture-pane -S -para significar "iniciar no início do histórico" (ou seja, nenhum número negativo grande e codificado).


Nota: O número de linhas no arquivo salvo nem sempre será igual ao limite do histórico do painel mais sua altura.

Quando o buffer de histórico de um painel está cheio, o tmux descarta os 10% mais antigos das linhas em vez de descartar apenas uma linha. Isso significa que a profundidade efetiva do histórico de um painel às vezes será tão baixa quanto 90% do seu limite configurado.

Chris Johnsen
fonte
1
Você provavelmente está executando o tmux 1.3; você provavelmente pode usar tmux server-info | head -1para ver sua versão. tmux -Vfunciona no tmux * 1.4 e posterior.
Chris Johnsen
1
Este é de longe um dos comandos tmux mais úteis que encontrei.
Kenny
1
E se você já está na sua janela do tmux e não deseja reiniciar, basta fazer a [PrefixKey] : para chegar à linha de comando do tmux e colar a linha inteira, basta fazer [Prefix] P o P maiúsculo e pronto .
Ali
1
@BradenBest Um prefixo de SI precisa ser anexado a uma unidade. Nem "32Ki" nem "32K" são válidos. Não se esqueça que K maiúsculo não é um prefixo de SI. Bom trabalho estar do lado de pedestres que semeiam confusão e errar.
Aleksandr Dubinsky
1
@BradenBest Os prefixos binários geram confusão porque 1 MB costumava ter um significado exato, mas agora tem dois significados. Pior, o significado decimal é inútil para o setor de TI, exceto para os fabricantes de armazenamento que o usam para marketing falso. Essa confusão foi iniciada por pedantes que se recusaram a ser práticos. Se você não é um pedante, peço desculpas pelo meu tom e peço que reconsidere seu entusiasmo por prefixos binários.
Aleksandr Dubinsky
19

Eu tinha ligações de teclas padrão que pareciam ser um pouco diferentes da resposta de @ jasonwryan e não mudaram nada na configuração.

Abaixo está a receita que funcionou para mim. Talvez você ache isso útil se não quiser fazer alterações na configuração do tmux e apenas desejar copiar rapidamente algumas das rolagens.

Prefix== Ctrl+bno meu tmux (tmux 1.6, debian 7).

  1. Entre no modo de seleção: Prefix+ [.
  2. Comece seleção: Space.
  3. Destaque o texto necessário usando a navegação vim (por exemplo, use as setas ou pressione ggpara chegar ao início do histórico de saída).
  4. Na verdade, copie na área de transferência interna usando Enter. Você sairá do modo de cópia.
  5. Abra qualquer arquivo usando o vim (provavelmente na nova guia tmux) e cole o conteúdo que você copiou antes de usar Prefix+ ].
  6. Então você pode criar um arquivo desse arquivo ou usar a saída conforme necessário.
Alex
fonte
O man tmux me ajudou a entender que meu tmux estava no modo emacs, portanto, nenhuma das combinações de teclas acima funcionou. man tmux, novamente, me ajudou a descobrir o que usar. Mas o maior erro que eu fiz foi que o host que eu salvo o conteúdo de não foi o host que eu estava correndo tmux partir, então eu ficava olhando para o arquivo salvo no host errado ...
Cognitiaclaeves
16

Se você quiser algo que possa ser executado a partir da linha de comando (em vez de usar suas chaves de prefixo tmux), tente executar:

tmux capture-pane -pS -1000000

Se você executá-lo e parece que não faz nada, é porque está exibindo exatamente o que estava na tela e fica com a mesma aparência.

Obviamente, você também pode canalizá-lo para um arquivo:

tmux capture-pane -pS -1000000 > file.out

Consulte a tmuxpágina de manual e procure por capture-panemais coisas que você pode fazer (como capturar seqüências de escape no caso de preservar a cor ou especificar se deseja unir várias linhas visuais quando elas não contiverem uma nova linha)

Christopher Shroba
fonte
1
Isso é muito útil, principalmente porque a resposta aceita não funciona mais.
piojo 16/01
4

Isso é realmente muito fácil. Entre no modo de comando, pressione prefix keyentão :. Então faça capture-pane -S -<line number you want to dump> Entãosave-buffer <filepath>

Esse arquivo contém toda a saída de rolagem. Você deve excluir o buffer posteriormente por motivos de segurança.

Wang
fonte
1

Como gravar todo o scrollback de uma sessão tmux em um arquivo?

Eu uso isso no meu ~ / .tmux.conf e agora, quando saio do shell em execução, a saída do painel é salva em um arquivo de log exclusivo:

set -g remain-on-exit
set-hook pane-died 'capture-pane -S - -E - ; save-buffer "$HOME/logs/tmux/tmux-saved.#{host_short}-#{session_id}:#{window_id}:#{pane_id}-#{pane_pid}-#{client_activity}.log"; delete-buffer; kill-pane'                        
user2688272
fonte