Scrivi tutto tmux scrollback in un file


194

Come posso scrivere tutto lo scrollback in una sessione di tmux su un file?

capture-panel può catturare la schermata corrente, ma non l'intero scorrimento.

Risposte:


52

Questo dipende dal valore history-limitche hai impostato nel tuo .tmux.conf- il valore predefinito è 2000; se desideri acquisire di più, dovrai impostare esplicitamente il numero di linee.

Per acquisire l'intero scorrimento, accedere alla modalità copia, selezionare l'intero scorrimento, quindi trascinarlo nel buffer, quindi incollarlo nel file.

Il modo in cui lo realizzerai dipenderà mode-keysdall'opzione che preferisci, vi o emacs. man tmuxha una tabella utile che descrive le rispettive chiavi.

Ho il seguente nel mio .tmux.confper semplificare questo:

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

Il processo per acquisire lo scrollback completo è quindi:

PrefixEsc : per accedere alla modalità copia

v : per iniziare la selezione visiva (supponendo che tu sia già nella parte inferiore dello schermo)

gg : per catturare tutto nello scrollback

y : per strattonarlo nel buffer

Prefixc : apre un'altra finestra di tmux

vim scrollback.txt

i : entra in modalità inserimento in vim

Prefixp : incolla nel file

C'è anche una risposta qui che descrive come copiare il buffer in un file temporaneo usandoxsel quello che potrebbe essere utile.


2
Nella migliore delle ipotesi questo è problematico ... incollare in modalità insert in Vim ha tutti i tipi di problemi, ad esempio quando hai abilitato il rientro automatico. Non ho mai avuto questo lavoro con mia soddisfazione.
Konrad Rudolph,

13
Se si utilizza :set pastein vim, vim ignorerà l'aggiunta di rientri automatici o eventuali combinazioni di tasti basate sull'inserimento.
martedì

@tlunter bel consiglio!
Jasonwryan,

Questo può essere fatto con le associazioni di tasti predefinite?
daveloyall,

@daveloyall Ovviamente, non usare le opzioni di associazione dei tasti che ho incluso dal mio .tmux.conf...
jasonwryan,

224

Per coloro che cercano una risposta semplice, basta usare prefix+ :, quindi digitare capture-pane -S -3000+ return(Sostituisci 3000con qualsiasi numero di righe desideri salvare). Questo copia quelle righe in un buffer.

Quindi, per salvare il buffer in un file, basta utilizzare nuovamente prefix+ :e digitare save-buffer filename.txt+ return, sostituendolo filenamecon quello che desideri.

(L'impostazione predefinita prefixè ctrl + b.)


14
save-buffer filename.txtsembra salvare il file in /, non in pwd(directory corrente). Invece, ho fornito un percorso file assoluto e ha funzionato come un incantesimo
MohamedEzz l'

15
e non dimenticare che MINUS di fronte al <<importo-del-buffer-lines-you-want-to-save>>
Yordan Georgiev il

9
Questa è la migliore risposta qui. Grazie mille.
Jesse Atkinson,

7
Sì, hai vinto. Questa dovrebbe essere la risposta migliore.
parole per caso,

1
+ n> 1 Dopo aver effettuato l'accesso a upvote, sembra che questa sia almeno la seconda volta che questa risposta mi è stata utile. XD
L0j1k,

159

Con tmux 1.5, il capture-panecomando accetta -Se -Especifica le linee di inizio e fine dell'acquisizione ; valori negativi possono essere utilizzati per specificare righe dalla cronologia. Una volta che hai i dati in un buffer, puoi salvarli con save-buffer.

Ecco un esempio di associazione (adatto per .tmux.conf) che lo avvolge con un prompt per il nome file:

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

Questo cattura (fino a) 32768 righe di cronologia più le righe attualmente visualizzate. A partire da tmux 1.6, è possibile utilizzare i numeri fino a INT_MIN se il riquadro ha una cronologia più profonda di 32 righe Ki (in genere fino a 2 righe Gi). A partire da tmux 2.0, è possibile utilizzare capture-pane -S -per indicare "inizio all'inizio della cronologia" (ovvero nessun numero negativo grande e codificato).


Nota: il numero di righe nel file salvato non sarà sempre uguale al limite della cronologia del riquadro più la sua altezza.

Quando il buffer della cronologia di un riquadro è pieno, tmux scarta il 10% più vecchio delle righe invece di scartarne solo una. Ciò significa che la profondità della cronologia effettiva di un riquadro a volte sarà pari al 90% del limite configurato.


1
Probabilmente stai eseguendo tmux 1.3; probabilmente puoi usare tmux server-info | head -1per vedere la tua versione. tmux -Vfunziona in tmux * 1.4 e versioni successive.
Chris Johnsen,

1
Questo è di gran lunga uno dei comandi tmux più utili che ho trovato.
Kenny,

1
E se sei già nella tua finestra di tmux e non vuoi riavviare, fai semplicemente un [PrefixKey] : per arrivare alla riga di comando di tmux, quindi incolla l'intera linea, quindi fai semplicemente un [Prefix] P P maiuscola e sei a posto.
Ali,

1
@BradenBest Un prefisso SI deve essere collegato a un'unità. Né "32Ki" né "32K" sono validi. Non pensare che K maiuscola non sia un prefisso SI. Bel lavoro essere dalla parte dei pedanti che seminano confusione e sbagliare.
Aleksandr Dubinsky,

1
@BradenBest I prefissi binari creare confusione perché 1 MB usato per avere un significato preciso, ma ora ha due significati. Peggio ancora, il significato decimale è inutile per il settore IT, ad eccezione dei produttori di storage che lo usano per falso marketing. Questa confusione è stata iniziata dai pedanti che si sono rifiutati di essere pratici. Se tu stesso non sei un tale pedante, allora mi scuso per il mio tono e ti esorto a riconsiderare il tuo entusiasmo per i prefissi binari.
Aleksandr Dubinsky,

19

Avevo le combinazioni di tasti standard che sembravano essere leggermente diverse rispetto alla risposta di @ jasonwryan e non ho cambiato nulla in configurazione.

Di seguito è la ricetta che ha funzionato per me. Forse lo troverai utile se non vuoi apportare modifiche in tmux config e vuoi solo copiare rapidamente parte dello scrollback.

Prefix== Ctrl+bnel mio tmux (tmux 1.6, debian 7).

  1. Immettere la modalità di selezione: Prefix+ [.
  2. Avviare la selezione: Space.
  3. Evidenzia il testo necessario usando vim navigation (ad esempio, usa i tasti freccia o premi ggper raggiungere l'inizio della cronologia di output).
  4. Effettivamente copia negli appunti interni usando Enter. Si uscirà dalla modalità di copia.
  5. Apri qualsiasi file usando vim (probabilmente nella nuova scheda tmux) e incolla il contenuto che hai copiato prima di usare Prefix+ ].
  6. Quindi puoi fare il cat di quel file o usare l'output di cui hai bisogno.

man tmux mi ha aiutato a capire che il mio tmux era in modalità emacs, quindi nessuna delle combinazioni di tasti sopra ha funzionato. man tmux, ancora una volta, mi ha aiutato a capire cosa usare. Ma l'errore più grande che ho fatto è stato che l'host da cui ho salvato il contenuto non era l'host da cui stavo eseguendo tmux, quindi ho continuato a cercare il file salvato sull'host sbagliato ...
Cognitiaclaeves

16

Se vuoi qualcosa che puoi eseguire dalla riga di comando (invece di usare le chiavi del prefisso tmux), prova a eseguire:

tmux capture-pane -pS -1000000

Se lo esegui e sembra non fare nulla, è perché sta emettendo esattamente ciò che era solo sullo schermo, quindi sembra lo stesso.

Naturalmente, puoi anche reindirizzarlo in un file:

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

Guarda la tmuxpagina man e cerca capture-panealtre cose che puoi fare (come catturare sequenze di escape nel caso tu voglia conservare il colore, o specificare se vuoi unire più linee visive quando non contengono una nuova linea)


1
Questo è molto utile, soprattutto perché la risposta accettata non funziona più.
Piojo,


4

Questo è in realtà molto semplice. Accedere alla modalità di comando premendo prefix keyquindi :. Quindi fai capture-pane -S -<line number you want to dump> allorasave-buffer <filepath>

Quel file contiene tutto l'output di scrollback. Successivamente è necessario eliminare il buffer per motivi di sicurezza.


1

Come posso scrivere tutto lo scrollback in una sessione di tmux su un file?

Lo uso nel mio ~ / .tmux.conf e ora quando esco dalla shell in esecuzione, l'output del riquadro viene salvato in un file di registro univoco:

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'                        
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.