Записать все 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 который может быть полезным.

jasonwryan
источник
2
В лучшем случае это проблематично… при вставке в режим вставки в Vim возникают всевозможные проблемы, например, когда включен автоматический отступ. Я никогда не получал это, чтобы работать к моему удовлетворению.
Конрад Рудольф
13
Если вы используете :set pastevim, vim будет игнорировать добавление автоматических отступов или любых сочетаний клавиш на основе вставки.
tlunter
@tlunter хороший совет!
Джейсонвриан
Можно ли это сделать с помощью привязок клавиш по умолчанию?
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(текущий каталог). Вместо этого я
указал
15
и не забывайте, что МИНУС перед << количеством строк буфера, которые вы хотите сохранить >>
Джордан Георгиев
9
Это лучший ответ здесь. Огромное спасибо.
Джесси Аткинсон
7
Да, ты выиграл. Это должен быть главный ответ.
словами
1
+ n> 1 После входа в upvote, похоже, это как минимум второй раз, когда этот ответ был мне полезен. 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, если ваша панель имеет историю, которая глубже 32Ки строк (обычно до 2Ги строк). Начиная с 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, которую я нашел.
Кенни
1
И если вы уже находитесь в своем окне tmux и не хотите перезапускать, просто сделайте a, [PrefixKey] : чтобы перейти к командной строке tmux, а затем вставьте всю строку, тогда вы просто сделаете a, [Prefix] P это заглавная буква P, и вы готовы идти.
Али
1
@BradenBest Префикс SI должен быть присоединен к устройству. Ни "32Ki", ни "32K" не действительны. Не важно, что прописные буквы K не являются префиксом SI. Хорошая работа - быть сбитым с толку сеяными педантами и ошибаться.
Александр Дубинский
1
@BradenBest Бинарные префиксы сеют путаницу, потому что 1 МБ раньше имел точное значение, но теперь оно имеет два значения. Хуже того, десятичное значение бесполезно для ИТ-индустрии, кроме производителей хранилищ, которые используют его для ложного маркетинга. Эта путаница была начата педантами, которые отказались быть практичными. Если вы сами не такой педант, то я прошу прощения за мой тон и призываю вас пересмотреть свой энтузиазм по поводу бинарных префиксов.
Александр Дубинский
19

У меня были стандартные привязки клавиш, которые выглядели немного иначе, чем в ответе @ jasonwryan, и я ничего не изменил в конфигурации.

Ниже рецепт, который работал для меня. Возможно, вы найдете это полезным, если вы не хотите вносить какие-либо изменения в конфигурацию tmux и просто хотите быстро скопировать часть прокрутки.

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

  1. Войдите в режим выбора: Prefix+ [.
  2. Начать выбор: Space.
  3. Выделите необходимый текст с помощью навигации vim (например, используйте клавиши со стрелками или нажмите, ggчтобы перейти к началу истории вывода).
  4. Собственно скопируйте во внутренний буфер обмена используя Enter. Вы выйдете из режима копирования.
  5. Откройте любой файл с помощью vim (возможно, на новой вкладке tmux) и вставьте скопированный контент перед использованием Prefix+ ].
  6. Затем вы можете сделать cat этого файла или использовать вывод, как вам нужно.
Alex
источник
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другие вещи, которые вы можете сделать (например, захватить escape-последовательности на случай, если вы хотите сохранить цвет, или указать, хотите ли вы, чтобы несколько визуальных линий были соединены, если они не содержат новой строки)

Кристофер Шроба
источник
1
Это очень полезно, тем более что принятый ответ больше не работает.
Пихо
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'                        
user2688272
источник