Schreibe alle tmux scrollbacks in eine Datei

194

Wie kann ich den gesamten Scrollback in einer tmux-Sitzung in eine Datei schreiben?

capture-panel kann den aktuellen Bildschirm erfassen, aber nicht den gesamten Scrollback.

David Wolever
quelle

Antworten:

52

Dies hängt von dem Wert ab history-limit, den Sie in Ihrem festgelegt haben .tmux.conf- der Standardwert ist 2000; Wenn Sie mehr aufnehmen möchten, müssen Sie die Anzahl der Zeilen explizit festlegen.

Um den gesamten Bildlauf zu erfassen, rufen Sie den Kopiermodus auf, wählen Sie den gesamten Bildlauf aus, ziehen Sie ihn in den Puffer und fügen Sie ihn in Ihre Datei ein.

Wie Sie dies erreichen, hängt von der von mode-keysIhnen bevorzugten Option vi oder emacs ab. man tmuxhat eine hilfreiche Tabelle, die die jeweiligen Schlüssel beschreibt.

Ich habe Folgendes in meinem .tmux.conf, um dies zu vereinfachen:

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

Der Vorgang zum Erfassen des vollständigen Bildlaufs ist dann:

PrefixEsc : um in den Kopiermodus zu gelangen

v : um mit der visuellen Auswahl zu beginnen (vorausgesetzt, Sie befinden sich bereits am unteren Bildschirmrand)

gg : um alles im Scrollback festzuhalten

y : um es in den Puffer zu ziehen

Prefixc : öffne ein anderes tmux Fenster

vim scrollback.txt

i : In vim in den Einfügemodus wechseln

Prefixp : Einfügen in Datei

Hier finden Sie auch eine Antwort, die beschreibt, wie Sie den Puffer mithilfexsel dieser Funktion in eine temporäre Datei kopieren können.

jasonwryan
quelle
2
Dies ist bestenfalls problematisch. Das Einfügen in den Einfügemodus in Vim hat alle möglichen Probleme, z. B. wenn Sie die automatische Einrückung aktiviert haben. Ich habe das nie zu meiner Zufriedenheit funktionieren lassen.
Konrad Rudolph
13
Wenn Sie :set pastein vim verwenden, ignoriert vim das Hinzufügen von automatischen Einrückungen oder einfügebasierten Tastenkombinationen.
Tlunter
@tlunter schöner tipp!
Jasonwryan
Kann dies mit Standardschlüsselbindungen durchgeführt werden?
daveloyall
@daveloyall Natürlich, verwende einfach nicht die Keybind-Optionen, die ich aus meinem .tmux.conf...
jasonwryan
224

Für diejenigen, die nach einer einfachen Antwort suchen, verwenden Sie einfach prefix+ :und geben Sie capture-pane -S -3000+ ein return(Ersetzen 3000Sie diese durch die Anzahl der Zeilen, die Sie speichern möchten.) Dies kopiert diese Zeilen in einen Puffer.

Dann wird der Puffer in eine Datei zu speichern, verwenden Sie einfach prefix+ :wieder, und geben Sie in save-buffer filename.txt+ returnund ersetzt filenamemit dem, was Sie möchten.

(Standardmäßig prefixist ctrl + b.)

Soße McBoss
quelle
14
save-buffer filename.txtscheint die Datei zu speichern /, nicht in pwd(aktuelles Verzeichnis). Stattdessen habe ich einen absoluten Dateipfad angegeben und es hat wie ein Zauber
funktioniert
15
und vergessen Sie nicht, dass MINUS vor der << Menge-von-Puffer-Zeilen-Sie-speichern-wollen >>
Yordan Georgiev
9
Dies ist die beste Antwort hier. Ich danke dir sehr.
Jesse Atkinson
7
Ja, du gewinnst. Dies sollte die beste Antwort sein.
wordsforthewise
1
+ n> 1 Nach dem Anmelden bei upvote ist diese Antwort anscheinend zum zweiten Mal hilfreich für mich. XD
L0j1k
160

Mit tmux 1.5 capture-paneakzeptiert -Sund -Espezifiziert der Befehl die Start- und Endzeilen des Captures . Mit negativen Werten können Zeilen aus dem Verlauf angegeben werden. Sobald Sie die Daten in einem Puffer haben, können Sie sie mit speichern save-buffer.

Hier ist eine Beispielbindung (geeignet für .tmux.conf), die alles mit einer Eingabeaufforderung für den Dateinamen abschließt:

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

Dies erfasst (bis zu) 32768 Zeilen des Verlaufs sowie die aktuell angezeigten Zeilen. Ab tmux 1.6 können Sie Zahlen bis INT_MIN verwenden, wenn Ihr Fenster einen Verlauf aufweist, der tiefer als 32Ki-Zeilen ist (normalerweise bis zu 2Gi-Zeilen). Ab tmux 2.0 können Sie capture-pane -S -mit "am Anfang der Geschichte beginnen" (dh keine große, fest codierte negative Zahl) beginnen.


Hinweis: Die Anzahl der Zeilen in der gespeicherten Datei entspricht nicht immer dem Verlaufslimit plus der Höhe des Bereichs.

Wenn der Verlaufspuffer eines Fensters voll ist, verwirft tmux die ältesten 10% der Zeilen, anstatt nur eine Zeile zu verwerfen. Dies bedeutet, dass die effektive Verlaufstiefe eines Fensters manchmal nur 90% des konfigurierten Grenzwerts beträgt.

Chris Johnsen
quelle
1
Sie führen wahrscheinlich tmux 1.3 aus. Sie können wahrscheinlich verwenden tmux server-info | head -1, um Ihre Version zu sehen. tmux -VFunktioniert in tmux * 1.4 und höher.
Chris Johnsen
1
Dies ist mit Abstand einer der nützlichsten tmux-Befehle, die ich gefunden habe.
Kenny
1
Und wenn Sie sich bereits in Ihrem tmux-Fenster befinden und nicht neu starten möchten, führen Sie einfach a aus [PrefixKey] : , um zur tmux-Befehlszeile zu gelangen, und fügen Sie dann die gesamte Zeile ein [Prefix] P .
Ali
1
@BradenBest Ein SI-Präfix muss an eine Einheit angehängt werden. Weder "32Ki" noch "32K" sind gültig. Vergiss nicht, dass K in Großbuchstaben kein SI-Präfix ist. Gute Arbeit auf der Seite verwirrender Pedanten zu sein und es falsch zu verstehen.
Aleksandr Dubinsky
1
@BradenBest Die Binärpräfixe sind verwirrend, da 1 MB früher eine exakte Bedeutung hatte, jetzt aber zwei Bedeutungen hat. Schlimmer noch, die dezimale Bedeutung ist für die IT-Branche nutzlos, außer für Speicherhersteller, die sie für falsches Marketing verwenden. Diese Verwirrung wurde von Pedanten ausgelöst, die sich weigerten, praktisch zu sein. Wenn Sie selbst nicht so pedantisch sind, entschuldige ich mich für meinen Ton und fordere Sie auf, Ihre Begeisterung für binäre Präfixe zu überdenken.
Aleksandr Dubinsky
19

Ich hatte Standardtastenbelegungen, die sich ein wenig von denen in @ jasonwryans Antwort unterschieden und an der Konfiguration nichts geändert haben.

Unten ist ein Rezept, das für mich funktioniert hat. Vielleicht finden Sie es nützlich, wenn Sie in tmux config keine Änderungen vornehmen und nur einen Teil des Scrollbacks schnell kopieren möchten.

Prefix== Ctrl+bin meinem tmux (tmux 1.6, debian 7).

  1. Aktivieren Sie den Auswahlmodus: Prefix+ [.
  2. Beginnen Auswahl: Space.
  3. Markieren Sie den erforderlichen Text mit der vim-Navigation (verwenden Sie zum Beispiel die Pfeiltasten oder drücken Sie gg, um zum Anfang des Ausgabeverlaufs zu gelangen).
  4. Eigentlich kopieren Sie in die interne Zwischenablage mit Enter. Sie verlassen den Kopiermodus.
  5. Öffnen Sie eine beliebige Datei mit vim (möglicherweise auf der neuen Registerkarte "tmux") und fügen Sie den Inhalt ein, den Sie vor der Verwendung von Prefix+ kopiert haben ].
  6. Dann können Sie cat von dieser Datei machen oder die Ausgabe verwenden, wie Sie es brauchen.
Alex
quelle
Mit man tmux konnte ich feststellen, dass sich mein tmux im Emacs-Modus befand, sodass keine der oben genannten Tastaturbefehle funktionierte. man tmux hat mir wieder geholfen, herauszufinden, was ich verwenden soll. Aber der größte Fehler, den ich gemacht habe, war, dass der Host, auf dem ich den Inhalt gespeichert habe, nicht der Host war, auf dem ich tmux ausgeführt habe. Also habe ich weiter nach der gespeicherten Datei auf dem falschen Host
gesucht
17

Wenn Sie etwas möchten, das Sie über die Befehlszeile ausführen können (anstatt Ihre tmux-Präfixschlüssel zu verwenden), versuchen Sie Folgendes:

tmux capture-pane -pS -1000000

Wenn Sie es ausführen und es nichts zu tun scheint, liegt das daran, dass es genau das ausgibt, was sich gerade auf Ihrem Bildschirm befand, sodass es gleich aussieht.

Natürlich können Sie es auch in eine Datei umleiten:

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

Sehen Sie sich die tmuxManpage an und suchen capture-paneSie nach weiteren Möglichkeiten (z. B. Erfassen von Escape-Sequenzen für den Fall, dass Sie die Farbe beibehalten möchten, oder geben Sie an, ob mehrere visuelle Linien verbunden werden sollen, wenn sie keine neue Linie enthalten).

Christopher Shroba
quelle
1
Dies ist sehr hilfreich, zumal die akzeptierte Antwort nicht mehr funktioniert.
Piojo
4

Das ist eigentlich sehr einfach. Rufen Sie den Befehlsmodus auf, indem Sie prefix keydann drücken :. Dann mach capture-pane -S -<line number you want to dump> Dannsave-buffer <filepath>

Diese Datei enthält die gesamte Scrollback-Ausgabe. Sie sollten den Puffer anschließend aus Sicherheitsgründen löschen.

Wang
quelle
1

Wie kann ich den gesamten Scrollback in einer tmux-Sitzung in eine Datei schreiben?

Ich verwende dies in meiner ~ / .tmux.conf und jetzt, wenn ich meine laufende Shell beende , wird die Fensterausgabe in einer eindeutigen Protokolldatei gespeichert:

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
quelle