Запишіть усі прокрутки tmux у файл


194

Як я можу записати весь прокрутку у сесії tmux у файл?

capture-panel може захопити поточний екран, але не весь прокрутка.

Відповіді:


52

Це залежить від значення, history-limitяке ви встановили у своєму .tmux.conf- за замовчуванням 2000; якщо ви хочете отримати більше, вам потрібно буде чітко встановити кількість рядків.

Щоб зафіксувати весь прокрутку, увійдіть в режим копіювання, виберіть весь прокрутку і витягніть її в буфер, а потім вставте його у файл.

Як ви це зробите, буде залежати від mode-keysваріанту, який ви надаєте перевагу, vi або emacs. man tmuxмає корисну таблицю з описом відповідних клавіш.

У мене є таке, .tmux.confщоб спростити це:

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

Потім відбувається процес повного відтворення прокрутки:

PrefixEsc : увійти в режим копіювання

v : почати візуальний вибір (якщо припустити, що ви вже внизу екрана)

gg : щоб захопити все в прокрутці

y : витягнути його в буфер

Prefixc : відкрити ще одне вікно tmux

vim scrollback.txt

i : введіть режим вставки в vim

Prefixp : вставити у файл

Тут також є відповідь, що описує, як скопіювати буфер у тимчасовий файл, використовуючи,xsel що може бути корисним.


2
Це в кращому випадку проблематично ... при вставленні режиму вставки у Vim виникають усілякі проблеми, наприклад, коли увімкнено автоматичне відступ. Я ніколи цього не вдавав працювати на своє задоволення.
Конрад Рудольф

13
Якщо ви використовуєте :set pastevim, vim буде ігнорувати додавання автоматичних відступів або будь-яких вкладених клавіш.
tlunter

@tlunter приємна порада!
Jasonwryan

Чи можна це зробити за допомогою типових прив’язок ключів?
daveloyall

@daveloyall Звичайно, просто не використовуйте параметри клавіатури, які я включив у свій .tmux.conf...
jasonwryan

224

Для тих, хто шукає просту відповідь, просто використовуйте prefix+ :, а потім введіть capture-pane -S -3000+ return(Замініть 3000тим, скільки рядків ви хочете зберегти.) Це копіює ці рядки в буфер.

Потім, щоб зберегти буфер у файл, просто використовуйте prefix+ :ще раз і введіть save-buffer filename.txt+ return, замінюючи filenameвсе, що завгодно.

(За замовчуванням prefixє ctrl + b.)


14
save-buffer filename.txtсхоже, що файл зберігається в /, а не в pwd(поточний каталог). Натомість я надав абсолютний шлях до файлу, і він спрацював як принадність
MohamedEzz

15
і не забувайте, що МІНУС напроти <<amount-of-buffer-lines-you-want-to-save>>
Йордан Георгієв

9
Тут найкраща відповідь. Дуже дякую.
Джессі Аткінсон

7
Так, ви виграєте. Це має бути головна відповідь.
словазрештою

1
+ n> 1 Після входу в систему для оновлення здається, що це принаймні вдруге ця відповідь мені була корисною. XD
L0j1k

159

З tmux 1.5 capture-paneкоманда приймає -Sта -Eвказує початкові та кінцеві рядки захоплення; негативні значення можуть бути використані для визначення рядків з історії. Коли ви отримаєте дані в буфері, ви можете зберегти їх save-buffer.

Ось приклад прив'язки (підходить для .tmux.conf), який завершує все це запитом на ім'я файлу:

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

Це фіксує (до) 32768 рядків історії плюс поточно відображені рядки. Починаючи з tmux 1.6, ви можете використовувати цифри аж до INT_MIN, якщо на вашій панелі є історія, глибша за 32Ki рядків (як правило, до 2Gi рядків). Починаючи з tmux 2.0, ви можете використовувати capture-pane -S -для позначення «початок на початку історії» (тобто немає великого, жорстко кодованого негативного числа).


Примітка: Кількість рядків у збереженому файлі не завжди буде дорівнює межі історії панелі плюс його висоті.

Коли буфер історії панелі заповнений, tmux відкидає найстаріші 10% рядків, а не відміняє лише один рядок. Це означає, що ефективна глибина історії панелі іноді буде досягати 90% від налаштованої межі.


1
Напевно, ви працюєте tmux 1.3; ви можете, ймовірно, використовувати tmux server-info | head -1для перегляду своєї версії. tmux -Vпрацює в tmux * 1.4 і пізніших версіях.
Кріс Джонсен

1
Це, безумовно, одна з найкорисніших команд tmux, яку я знайшов.
kenny

1
І якщо ви вже знаходитесь у своєму вікні tmux і не хочете перезавантажуватись, просто зробіть a, [PrefixKey] : щоб дістатися до командного рядка tmux, а потім вставити весь рядок, тоді ви просто зробите [Prefix] P це з великої літери P і вам добре йти.
Алі

1
@BradenBest До одиниці потрібно приєднати префікс SI. Ні "32Ki", ні "32K" не дійсні. Не забувайте, що велика літера K не є префіксом SI. Хороша робота бути на стороні плутанини, що сіє плутанину, і помиляється.
Олександр Дубінський

1
@BradenBest Двійкові префікси сіють плутанину, оскільки 1 Мб раніше було точне значення, але тепер воно має два значення. Гірше, що десяткове значення марно для ІТ-галузі, за винятком виробників сховищ, які використовують його для помилкового маркетингу. Цю плутанину розпочали педанти, які відмовилися бути практичними. Якщо ви самі не такий педант, тоді я вибачаюся за свій тон і закликаю вас переглянути своє захоплення бінарними префіксами.
Олександр Дубінський

19

У мене були стандартні прив'язки клавіш, які, здавалося, трохи відрізняються, ніж у відповіді @ Jasonwryan, і нічого не змінювали в config.

Нижче наведено рецепт, який працював на мене. Можливо, вам це стане в нагоді, якщо ви не хочете вносити жодних змін у конфігурацію tmux і просто хочете швидко скопіювати частину прокрутки.

Prefix== Ctrl+bв моєму tmux (tmux 1.6, debian 7).

  1. Введіть режим вибору: Prefix+ [.
  2. Почати вибір: Space.
  3. Виділіть необхідний текст за допомогою навігації vim (наприклад, використовуйте клавіші зі стрілками або натисніть, ggщоб відкрити початок історії виводу).
  4. Фактично скопіюйте у внутрішній буфер обміну за допомогою Enter. Ви вийдете з режиму копіювання.
  5. Відкрийте будь-який файл за допомогою vim (можливо, на новій вкладці tmux) та вставте вміст, який ви скопіювали, перш ніж використовувати Prefix+ ].
  6. Тоді ви можете зробити кішку цього файлу або використовувати вихід, як вам потрібно.

man tmux допоміг мені з'ясувати, що мій tmux перебуває у режимі emacs, тому жодне з прив’язок ключів не працювало. man tmux, знову ж таки, допоміг мені розібратися, чим користуватися. Але найбільшою помилкою, яку я зробив, було те, що хост, з якого я зберегла вміст, - це не той хост, з якого я запускав tmux, тому я продовжував шукати збережений файл на неправильному хості ...
Cognitiaclaeves

16

Якщо ви хочете щось запустити з командного рядка (замість того, щоб використовувати свої префіксальні ключі tmux), спробуйте виконати:

tmux capture-pane -pS -1000000

Якщо ви запускаєте його і, здається, нічого не робите, це тому, що він виводить саме те, що було на екрані, так що це виглядає так само.

Звичайно, ви також можете передавати його у файл:

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

Перегляньте tmuxдовідкову сторінку та знайдіть capture-paneбільше речей, які ви можете зробити (наприклад, захопити послідовності втечі, якщо ви хочете зберегти колір, або вкажіть, чи потрібно об’єднувати кілька візуальних ліній, коли вони не містять нового рядка)


1
Це дуже корисно, тим більше, що прийнята відповідь більше не працює.
piojo

13

Ось плагін tmux, який дозволяє це:

https://github.com/tmux-plugins/tmux-logging

Після встановлення збережіть за допомогою нього весь прокрутку prefix + alt-shift-p.


4

Це насправді дуже просто. Увійдіть у режим команд, натиснувши prefix keyпотім :. Тоді зробіть capture-pane -S -<line number you want to dump> Потімsave-buffer <filepath>

Цей файл містить увесь результат прокрутки. Після цього слід видалити буфер з міркувань безпеки.


1

Як я можу записати весь прокрутку у сесії tmux у файл?

Я використовую це в моєму ~ / .tmux.conf , і тепер, коли я виходжу з запущеної оболонки, вихід панелі зберігається в унікальний файл журналу:

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'                        
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.