Escribir todos los tmux scrollback en un archivo


194

¿Cómo puedo escribir todo el scrollback en una sesión tmux en un archivo?

capture-panel puede tomar la pantalla actual, pero no el desplazamiento completo.

Respuestas:


52

Esto depende del valor history-limitque haya establecido en su .tmux.conf- el valor predeterminado es 2000; Si desea capturar más, deberá establecer explícitamente el número de líneas.

Para capturar todo el desplazamiento hacia atrás, ingrese al modo de copia, seleccione todo el desplazamiento hacia atrás y tírelo al búfer, luego péguelo en su archivo.

La forma en que logre esto dependerá de la mode-keysopción que prefiera, vi o emacs. man tmuxtiene una tabla útil que describe las claves respectivas.

Tengo lo siguiente en mi .tmux.confpara simplificar esto:

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

El proceso para capturar el desplazamiento completo es entonces:

PrefixEsc : para ingresar al modo de copia

v : para comenzar la selección visual (suponiendo que ya se encuentre en la parte inferior de la pantalla)

gg : para capturar todo en el desplazamiento hacia atrás

y : para tirarlo al búfer

Prefixc : abra otra ventana de tmux

vim scrollback.txt

i : ingrese el modo de inserción en vim

Prefixp : pegar en el archivo

También hay una respuesta aquí que describe cómo copiar el búfer a un archivo temporal usandoxsel eso podría ser útil.


2
Esto es problemático en el mejor de los casos ... pegar en el modo de inserción en Vim tiene todo tipo de problemas, por ejemplo, cuando tiene la sangría automática habilitada. Nunca conseguí que esto funcionara para mi satisfacción.
Konrad Rudolph

13
Si usa :set pastevim, vim ignorará la adición de sangrías automáticas o cualquier combinación de teclas basada en inserción.
tlunter

@tlunter buen consejo!
jasonwryan

¿Se puede hacer esto con las combinaciones de teclas predeterminadas?
Daveloytodo el

@daveloyall Por supuesto, simplemente no use las opciones de combinación de teclas que incluí de mi .tmux.conf...
jasonwryan

224

Para aquellos que buscan una respuesta simple, simplemente use prefix+ :, luego escriba capture-pane -S -3000+ return(Reemplace 3000con la cantidad de líneas que desee guardar). Esto copia esas líneas en un búfer.

Luego, para guardar el búfer en un archivo, simplemente use prefix+ :nuevamente y escriba save-buffer filename.txt+ return, reemplazando filenamecon lo que desee.

(Por defecto prefixes ctrl + b.)


14
save-buffer filename.txtparece guardar el archivo en /, no en pwd(directorio actual). En cambio, proporcioné una ruta de archivo absoluta y funcionó de
maravilla

15
y no olvides que MENOS frente a <<amount-of-buffer-lines-you-want-to-save>>
Yordan Georgiev el

99
Esta es la mejor respuesta aquí. Muchas gracias.
Jesse Atkinson

77
Si, tu ganas. Esta debería ser la mejor respuesta.
wordsforthewise

1
+ n> 1 Después de iniciar sesión para votar, parece que esta es al menos la segunda vez que esta respuesta me ha sido útil. XD
L0j1k

159

Con tmux 1.5, el capture-panecomando acepta -Sy -Eespecifica las líneas de inicio y finalización de la captura; los valores negativos se pueden usar para especificar líneas del historial. Una vez que tenga los datos en un búfer, puede guardarlos con save-buffer.

Aquí hay un enlace de ejemplo (adecuado para .tmux.conf) que lo envuelve todo con un mensaje para el nombre de archivo:

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

Esto captura (hasta) 32768 líneas de historial más las líneas que se muestran actualmente. Comenzando con tmux 1.6, puede usar números hasta INT_MIN si su panel tiene un historial que es más profundo que las líneas de 32Ki (generalmente hasta líneas de 2Gi). A partir de tmux 2.0, puede capture-pane -S -significar "comenzar al principio del historial" (es decir, no hay un número negativo grande y codificado).


Nota: El número de líneas en el archivo guardado no siempre será igual al límite del historial del panel más su altura.

Cuando el búfer de historial de un panel está lleno, tmux descarta el 10% más antiguo de las líneas en lugar de descartar solo una línea. Esto significa que la profundidad del historial efectivo de un panel a veces será tan baja como el 90% de su límite configurado.


1
Probablemente esté ejecutando tmux 1.3; probablemente puedas usar tmux server-info | head -1para ver tu versión. tmux -Vfunciona en tmux * 1.4 y versiones posteriores.
Chris Johnsen

1
Este es, con mucho, uno de los comandos tmux más útiles que he encontrado.
kenny

1
Y si ya está en su ventana de tmux y no desea reiniciar, simplemente haga un [PrefixKey] : para llegar a la línea de comando de tmux, y luego pegue toda la línea, entonces solo haga una [Prefix] P P mayúscula y estará listo.
Ali

1
@BradenBest Se debe adjuntar un prefijo SI a una unidad. Ni "32Ki" ni "32K" son válidos. No importa que K mayúscula no sea un prefijo SI. Buen trabajo estar del lado de los pedantes sembrando confusión y equivocándose.
Aleksandr Dubinsky

1
@BradenBest Los prefijos binarios siembran confusión porque 1 MB solía tener un significado exacto, pero ahora tiene dos significados. Peor aún, el significado decimal es inútil para la industria de TI, excepto para los fabricantes de almacenamiento que lo usan para marketing falso. Esta confusión fue iniciada por pedantes que se negaron a ser prácticos. Si usted no es tan pedante, le pido disculpas por mi tono y le insto a que reconsidere su entusiasmo por los prefijos binarios.
Aleksandr Dubinsky

19

Tenía combinaciones de teclas estándar que parecían ser un poco diferentes a las de la respuesta de @ jasonwryan y no cambiaron nada en la configuración.

A continuación se muestra la receta que funcionó para mí. Tal vez lo encuentre útil si no desea realizar ningún cambio en la configuración de tmux y solo desea copiar rápidamente parte del desplazamiento hacia atrás.

Prefix== Ctrl+ben mi tmux (tmux 1.6, debian 7).

  1. Ingrese al modo de selección: Prefix+ [.
  2. Iniciar la selección: Space.
  3. Resalte el texto necesario usando la navegación vim (por ejemplo, use las teclas de flecha o presione ggpara llegar al comienzo del historial de salida).
  4. Realmente copie en el portapapeles interno usando Enter. Saldrás del modo de copia.
  5. Abra cualquier archivo usando vim (probablemente en la nueva pestaña tmux) y pegue el contenido que copió antes de usar Prefix+ ].
  6. Luego puede hacer cat de ese archivo o usar la salida como lo necesite.

man tmux me ayudó a resolver que mi tmux estaba en modo emacs, por lo que ninguna de las combinaciones de teclas anteriores funcionó. man tmux, nuevamente, me ayudó a decidir qué usar. Pero el mayor error que cometí fue que el host del que guardé el contenido no era el host desde el que ejecutaba tmux, así que seguí buscando el archivo guardado en el host incorrecto ...
Cognitiaclaeves

16

Si desea algo que pueda ejecutar desde la línea de comandos (en lugar de usar sus teclas de prefijo tmux), intente ejecutar:

tmux capture-pane -pS -1000000

Si lo ejecuta y parece que no hace nada, es porque está produciendo exactamente lo que estaba en su pantalla, por lo que se ve igual.

Por supuesto, también puede canalizarlo a un archivo:

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

Consulte la tmuxpágina de manual y busque capture-panemás cosas que puede hacer (como capturar secuencias de escape en caso de que desee conservar el color o especificar si desea unir varias líneas visuales cuando no contienen una nueva línea)


1
Esto es muy útil, especialmente porque la respuesta aceptada ya no funciona.
piojo


4

Esto es realmente muy fácil. Ingrese al modo de comando presionando y prefix keyluego :. Entonces haz capture-pane -S -<line number you want to dump> entoncessave-buffer <filepath>

Ese archivo contiene toda la salida de desplazamiento hacia atrás. Debe eliminar el búfer después por razones de seguridad.


1

¿Cómo puedo escribir todo el scrollback en una sesión tmux en un archivo?

Lo uso en mi ~ / .tmux.conf , y ahora cuando salgo de mi shell en ejecución, la salida del panel se guarda en un archivo de registro único:

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'                        
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.