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

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

#1 楼

这取决于您在history-limit中设置的.tmux.conf的值-默认值为2000;默认值为2000。如果要捕获更多内容,则需要显式设置行数。

要捕获整个滚动,请进入复制模式,选择整个滚动,然后将其拉入缓冲区,然后粘贴将其保存到文件中。

如何完成此操作取决于您喜欢的vi或emacs mode-keys选项。 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:将其拉入缓冲区

前缀:打开另一个tmux窗口

vim scrollback.txt


i:在vim中进入插入模式

前缀:粘贴到文件中

这里还有一个答案,描述了如何使用可能有用的xsel将缓冲区复制到临时文件。

评论


充其量是有问题的……在Vim中粘贴到插入模式会遇到各种问题,例如启用自动缩进时。我从来没有让我满意的工作。

–康拉德·鲁道夫(Konrad Rudolph)
15年1月21日在16:19

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

–小家伙
15年2月4日在21:18

@tlunter小贴士!

– Jasonwryan
15年2月4日在23:10

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

–daveloyall
2015年11月5日17:00

@daveloyall当然,只是不要使用我从.tmux.conf中包含的keybind选项。

– Jasonwryan
2015年11月5日17:14

#2 楼

对于寻求简单答案的用户,只需使用前缀+:,然后键入capture-pane -S -3000 + return(将3000替换为要保存的行数)。这会将这些行复制到缓冲区中。

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

(默认前缀为ctrl + b。)

评论


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

– MohamedEzz
16 Dec 8'在9:54

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

–约旦·格奥尔基耶夫(Yordan Georgiev)
16 Dec 23'在12:46

这是最好的答案。非常感谢。

–杰西·阿特金森(Jesse Atkinson)
17年4月21日在21:22

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

–明智的话
17年6月6日19:39

+ n> 1登录以进行投票后,这似乎至少是第二次此答案对我有帮助。 XD

– L0j1k
19 Mar 28 '19在3:01

#3 楼

在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%。

评论


感谢您的回答……但是我的tmux版本不接受-S捕获窗格(它似乎是1.3-2,尽管它来自dpkg,因为我不知道如何获取tmux来显示版本数…)

– David Wolever
2011年12月12日下午5:40

您可能正在运行tmux 1.3。您可能可以使用tmux服务器信息|头-1查看您的版本。 tmux -V在tmux * 1.4及更高版本中有效。

–克里斯·约翰森(Chris Johnsen)
2011年12月12日上午8:03

这是迄今为止我发现的最有用的tmux命令之一。

–肯尼
2012年7月19日在19:03

如果您已经在tmux窗口中并且不想重新启动,则只需执行[PrefixKey]即可:进入tmux命令行,然后粘贴整行,然后只需执行[Prefix] P就可以了P,你很好。

–阿里
2013年12月17日在21:43

是否可以自动生成tmux缓冲文件的文件名而不是提示输入?因此,您运行快捷方式的所有内容都会保存到另一个文件,例如,当前时间在文件名中。

–user779159
17年9月16日在12:44

#4 楼

如果您希望可以从命令行运行某些内容(而不是使用tmux前缀键),请尝试运行:

tmux capture-pane -pS -1000000


如果运行它,但似乎不行做任何事情,这是因为它输出的恰好是屏幕上的内容,因此看起来是一样的。

当然,您也可以将其通过管道传输到文件中:

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


请参见tmux手册页,并搜索capture-pane,以了解更多您可以做的事情(例如,捕获转义序列以防保留颜色,或者指定是否要在不合并时合并多个视线)没有换行)

评论


这非常有帮助,尤其是因为已接受的答案不再起作用。

– piojo
19年1月16日在7:22

-p参数输出到stdout而不是tmux缓冲区。

–palswim
19年12月1日在6:24

如果您不在本地控制台中,那么它将无法正常工作,因此我尝试了以下操作:1)在本地外壳下面的水平窗格下面添加2)tmux capture-pane -t {top} -pS -1000>〜/ tmp.out

–副词
20 Jul 27 '13:57



#5 楼

我有标准的按键绑定,似乎与@jasonwryan的答案有些不同,并且在配置中没有任何更改。

以下是对我有用的食谱。如果您不想在tmux配置中进行任何更改,而只是想快速复制一些回滚,也许您会发现它很有用。

前缀== Ctrl + b在我的tmux中(tmux 1.6 ,debian 7)。


进入选择模式:前缀+ [。
开始选择:空格。
使用vim导航突出显示必要的文本(例如,使用arrow键或按gg到达输出历史记录的开头。
实际上使用Enter键将其复制到内部剪贴板中。您将退出复制模式。
使用vim打开任何文件(可能在新的tmux选项卡上),然后粘贴您复制的内容,然后再使用Prefix +]。
那么您可以处理该文件或使用输出您的需求。


评论


man tmux帮助我弄清了tmux处于emacs模式,因此上述键绑定均无效。 man tmux再次帮助我弄清楚了要使用的内容。但是我犯的最大错误是,我从中保存内容的主机不是我从中运行tmux的主机,因此我一直在错误的主机上寻找保存的文件...

– Cognitiaclaves
17年8月4日在1:29

#6 楼

这是一个启用此功能的tmux插件:

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

安装后,请使用prefix + alt-shift-p保存整个回滚。

#7 楼

这实际上非常容易。
prefix key然后按:进入命令模式。
然后执行capture-pane -S -<line number you want to dump>
然后save-buffer <filepath>

该文件包含所有回滚输出。为了安全起见,之后应删除缓冲区。

#8 楼


如何将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'                        


#9 楼

如何在tmux会话中将所有回滚都写入文件?
从手册中:‘-’ to -S is the start of the history
所以
 tmux capture-pane -pS - > file
 

这将“在tmux中写入所有回滚”窗格。
对于会话中的所有窗格,您可以尝试使用tmux list-panes -s ...遍历所有窗格
如果需要的话,我可能会更新此答案。

评论


这个。到底谁想与回滚行号相符?真浪费时间。只需转储所有内容,然后在您喜欢的文本编辑器/ gnu命令中使用合理的UI,将输出文件切片/切成小块,就容易得多。

– ijoseph
20 Sep 13'4:53

#10 楼

转储到文件并在vim中自动打开文件
这很不错:
bind-key v 'capture-pane' \; \
  capture-pane -S - \; \
  save-buffer /tmp/tmux \; \
  delete-buffer \; \
  send-keys Escape 'ddivim /tmp/tmux' Enter

它假设您的shell处于vi模式,因此:

转义进入普通模式

dd清除所有现有命令

i进入插入模式
然后我们运行vim /tmp/tmux


在tmux 3.0中进行了测试。