Écrire tous les défilements tmux dans un fichier

194

Comment puis-je écrire tout le scrollback d'une session tmux dans un fichier?

capture-panel peut saisir l'écran actuel, mais pas le défilement complet.

David Wolever
la source

Réponses:

52

Cela dépend de la valeur history-limitque vous avez définie dans votre .tmux.conf- la valeur par défaut est 2000; si vous souhaitez en capturer davantage, vous devez définir explicitement le nombre de lignes.

Pour capturer l'intégralité du défilement, passez en mode copie, sélectionnez l'intégralité du défilement, puis glissez-le dans le tampon, puis collez-le dans votre fichier.

La manière dont vous accomplirez cela dépendra de l’ mode-keysoption que vous préférez, vi ou emacs. man tmuxa un tableau utile décrivant les clés respectives.

J'ai le suivant dans mon .tmux.confpour simplifier ceci:

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

Le processus pour capturer le défilement complet est alors:

PrefixEsc : pour entrer en mode copie

v : pour commencer la sélection visuelle (en supposant que vous êtes déjà au bas de l'écran)

gg : tout capturer dans le scrollback

y : pour le tirer dans le tampon

Prefixc : ouvre une autre fenêtre tmux

vim scrollback.txt

i : entrer en mode insertion dans vim

Prefixp : coller dans le fichier

Il y a également une réponse ici décrivant comment copier le tampon dans un fichier temporaire en utilisantxsel cela pourrait être utile.

jasonwryan
la source
2
C’est au mieux une problématique… Le collage en mode d’insertion dans Vim pose toutes sortes de problèmes, par exemple lorsque l’indentation automatique est activée. Je n'ai jamais eu ce travail à ma satisfaction.
Konrad Rudolph
13
Si vous utilisez :set pastein vim, vim ignorera l'ajout d'indentations automatiques ou de toute association de touches basée sur des insertions.
tlunter
@tlunter belle astuce!
jasonwryan
Cela peut-il être fait avec les raccourcis clavier par défaut?
daveloyall
@daveloyall Bien sûr, n'utilisez pas les options KeyBind que j'ai incluses dans .tmux.conf...
jasonwryan
224

Pour ceux qui recherchent une réponse simple, utilisez simplement prefix+ :, puis tapez capture-pane -S -3000+ return(remplacez-le 3000par le nombre de lignes que vous souhaitez enregistrer.) Ceci copie ces lignes dans un tampon.

Ensuite, pour enregistrer le tampon dans un fichier, utilisez simplement prefix+ :encore, et tapez save-buffer filename.txt+ return, en remplaçant filenamepar ce que vous voulez.

(Par défaut, prefixc'est ctrl + b.)

Sauce McBoss
la source
14
save-buffer filename.txtsemble enregistrer le fichier dans /, pas dans pwd(répertoire actuel). Au lieu de cela, j'ai fourni un chemin de fichier absolu et cela a fonctionné à merveille
MohamedEzz
15
et ne pas oublier que moins devant les << montant de tampon-lignes-vous-want-to-save >>
Yordan Georgiev
9
C'est la meilleure réponse ici. Merci beaucoup.
Jesse Atkinson
7
Oui, vous gagnez Cela devrait être la meilleure réponse.
wordsforthewise
1
+ n> 1 Après s'être connecté au vote vers le haut, il semblerait que ce soit au moins la deuxième fois que cette réponse m'a été utile. XD
L0j1k
159

Avec tmux 1.5, la capture-panecommande accepte -Set permet -Ede spécifier les lignes de début et de fin de la capture; Des valeurs négatives peuvent être utilisées pour spécifier des lignes de l'historique. Une fois que vous avez les données dans un tampon, vous pouvez les sauvegarder avec save-buffer.

Voici un exemple de liaison (adapté à .tmux.conf) qui résume le tout avec une invite pour le nom du fichier:

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

Cela capture (jusqu'à) 32 768 lignes d’historique plus les lignes actuellement affichées. À partir de tmux 1.6, vous pouvez utiliser des nombres allant jusqu'à INT_MIN si votre volet a un historique plus profond que les lignes 32 Ko (généralement jusqu'à 2 lignes Gi). À partir de tmux 2.0, vous pouvez utiliser capture-pane -S -le sens de «commencer au début de l’historique» (c’est-à-dire, aucun grand nombre négatif codé en dur).


Remarque: le nombre de lignes dans le fichier enregistré ne sera pas toujours égal à la limite d'historique du volet plus sa hauteur.

Lorsque la mémoire tampon de l'historique d'un volet est saturée, tmux ignore les 10% de lignes les plus anciens au lieu de supprimer une seule ligne. Cela signifie que la profondeur de l'historique effectif d'un volet sera parfois aussi basse que 90% de sa limite configurée.

Chris Johnsen
la source
1
Vous utilisez probablement tmux 1.3; vous pouvez probablement utiliser tmux server-info | head -1pour voir votre version. tmux -Vfonctionne dans tmux * 1.4 et versions ultérieures.
Chris Johnsen
1
C’est de loin l’une des commandes tmux les plus utiles que j’ai trouvées.
Kenny
1
Et si vous êtes déjà dans votre fenêtre tmux et que vous ne voulez pas redémarrer, faites simplement a [PrefixKey] : pour aller à la ligne de commande tmux, puis collez la ligne entière, puis faites simplement un [Prefix] P P majuscule et vous êtes prêt à partir.
Ali
1
@BradenBest Un préfixe SI doit être associé à une unité. Ni "32Ki" ni "32K" n'est valide. Peu importe que K majuscule ne soit pas un préfixe SI. Beau travail du côté des semeurs de confusion semant la confusion.
Aleksandr Dubinsky
1
@BradenBest Les préfixes binaires sement la confusion, car 1 Mo avait auparavant une signification exacte, mais elle a maintenant deux significations. Pire encore, le sens décimal est inutile pour le secteur informatique, sauf pour les fabricants de stockage qui l'utilisent à des fins de marketing. Cette confusion a été déclenchée par des pédants qui ont refusé d'être pratiques. Si vous-même n'êtes pas aussi pédant, alors je m'excuse pour mon ton et je vous prie instamment de reconsidérer votre enthousiasme pour les préfixes binaires.
Aleksandr Dubinsky
19

J'avais des raccourcis clavier qui semblaient être un peu différents de ceux de @ jasonwryan et qui ne changeaient rien dans la configuration.

Voici la recette qui a fonctionné pour moi. Cela vous sera peut-être utile si vous ne souhaitez apporter aucune modification à la configuration de tmux et que vous souhaitez simplement copier une partie du défilement.

Prefix== Ctrl+bdans mon tmux (tmux 1.6, debian 7).

  1. Entrer en mode de sélection: Prefix+ [.
  2. Début de la sélection: Space.
  3. Mettez en surbrillance le texte nécessaire en utilisant vim navigation (par exemple, utilisez les touches de direction ou appuyez sur ggpour atteindre le début de l'historique de sortie).
  4. Effectivement copier dans le presse-papier interne en utilisant Enter. Vous serez sorti du mode copie.
  5. Ouvrez n’importe quel fichier en utilisant vim (probablement sur le nouvel onglet tmux) et collez le contenu que vous avez copié avant d’utiliser Prefix+ ].
  6. Ensuite, vous pouvez créer un fichier de ce fichier ou utiliser la sortie dont vous avez besoin.
Alex
la source
man tmux m'a aidé à comprendre que mon tmux était en mode emacs, donc aucune des combinaisons de touches ci-dessus ne fonctionnait. man tmux, encore une fois, m'a aidé à trier ce qu'il fallait utiliser. Mais la plus grosse erreur que j'ai commise est que l'hôte à partir duquel j'ai enregistré le contenu n'était pas l'hôte à partir duquel j'exécutais tmux. J'ai donc continué à rechercher le fichier enregistré sur le mauvais hôte ...
Cognitiaclaeves
16

Si vous voulez quelque chose que vous pouvez exécuter depuis la ligne de commande (au lieu d’utiliser vos clés de préfixe tmux), essayez d’exécuter:

tmux capture-pane -pS -1000000

Si vous l'exécutez et qu'il semble ne rien faire, c'est parce qu'il affiche exactement ce qui vient d'être affiché sur votre écran, il a donc le même aspect.

Bien sûr, vous pouvez également le transférer dans un fichier:

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

Reportez-vous à la tmuxpage de manuel et recherchez d' capture-paneautres actions à effectuer (par exemple, capturer des séquences d'échappement si vous souhaitez conserver la couleur, ou spécifier si vous souhaitez que plusieurs lignes visuelles soient jointes lorsqu'elles ne contiennent pas de nouvelle ligne).

Christopher Shroba
la source
1
Ceci est très utile, d’autant plus que la réponse acceptée ne fonctionne plus.
piojo le
4

C'est vraiment très facile. Entrez le mode de commande en appuyant sur prefix keypuis sur :. Alors fais capture-pane -S -<line number you want to dump> ensuitesave-buffer <filepath>

Ce fichier contient toutes les sorties de défilement. Vous devez ensuite supprimer le tampon pour des raisons de sécurité.

Wang
la source
1

Comment puis-je écrire tout le scrollback d'une session tmux dans un fichier?

J'utilise ceci dans mon ~ / .tmux.conf , et maintenant, lorsque je quitte mon shell en cours d'exécution, la sortie du volet est enregistrée dans un fichier journal unique:

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'                        
utilisateur2688272
la source