将所有tmux回滚写入文件


194

如何将tmux会话中的所有回滚写入文件?

capture-panel 可以抓取当前屏幕,但不能抓取整个回滚。

Answers:


52

这取决于history-limit您在中设置的值.tmux.conf-默认值为2000;默认值为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中粘贴到插入模式会遇到各种问题,例如,当您启用了自动缩进时。我从来没有让我满意的工作。
康拉德·鲁道夫2015年

13
如果:set paste在vim中使用,vim将忽略添加自动缩进或任何基于插入的键绑定。
tlunter

@tlunter小贴士!
jasonwryan'2

可以使用默认键绑定完成此操作吗?
daveloyall 2015年

@daveloyall当然,只是不要使用我包含在我的键箱中的选项.tmux.conf...
jasonwryan 2015年

223

对于寻找简单答案的用户,只需使用prefix+ :,然后输入capture-pane -S -3000+ return(用3000您想保存的行替换掉即可。)这会将这些行复制到缓冲区中。

然后,要将缓冲区保存到文件,只需再次使用prefix+ :,然后输入save-buffer filename.txt+ return,替换filename为您想要的任何内容。

(默认prefixctrl + b。)


14
save-buffer filename.txt似乎将文件保存在中/,而不是保存在pwd(当前目录)中。取而代之的是,我提供了一个绝对的文件路径,它的工作
原理

14
并且不要忘记在《想要保存的缓冲行数》前面的减号
Yordan Georgiev

9
这是最好的答案。非常感谢。
杰西·阿特金森

7
是的,你赢了。这应该是最佳答案。
wordforthewise

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 开始,如果窗格的历史记录深于32Ki行(通常最多2Gi行),则可以使用低至INT_MIN的数字。从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窗口中并且不想重新启动,则只需执行一次操作[PrefixKey] : 即可进入tmux命令行,然后粘贴整行,那么您只需要执行a [Prefix] P ,即为大写P,就可以了。
阿里

1
@BradenBest必须将一个SI前缀附加到一个单元上。“ 32Ki”和“ 32K”均无效。切记大写字母K不是SI前缀。撒播混乱的学徒一边做错,一边做得很好。
Aleksandr Dubinsky

1
@BradenBest二进制前缀使人们感到困惑,因为1 MB 曾经有确切的含义,但是现在它有两个含义。更糟糕的是,十进制含义对IT行业毫无用处,除非存储制造商将其用于虚假营销。这种混乱是由拒绝实用的学徒开始的。如果您自己不是这样的书呆子,那么我对我的语气表示歉意,并敦促您重新考虑您对二进制前缀的热情。
Aleksandr Dubinsky

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. 然后,您可以处理该文件或根据需要使用输出。

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


4

这实际上很容易。通过按输入命令模式,prefix key然后:。然后做capture-pane -S -<line number you want to dump>save-buffer <filepath>

该文件包含所有回滚输出。出于安全原因,之后应删除缓冲区。


1

如何将tmux会话中的所有回滚写入文件?

我在〜/ .tmux.conf中使用它,现在当我退出正在运行的shell时,窗格输出将保存到唯一的日志文件中:

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'                        
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.