小智 426
对于那些寻找简单答案的人:
capture-pane -S -3000
+ Return。(替换-3000
为您想要保存的-
任意多行,或替换为所有行。)这会将这些行复制到缓冲区中。save-buffer filename.txt
+ return。(默认Prefix为Ctrl+ B。)
Chr*_*sen 180
在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'
Run Code Online (Sandbox Code Playgroud)
这将捕获(最多)32768 行历史记录加上当前显示的行。从tmux 1.6开始,如果您的窗格的历史记录超过 32Ki 行(通常最多 2Gi 行),您可以使用低至 INT_MIN 的数字。从tmux 2.0开始,您可以使用capture-pane -S -
来表示“从历史的开头开始”(即没有大的、硬编码的负数)。
注意:保存的文件中的行数并不总是等于窗格的历史限制加上其高度。
当窗格的历史缓冲区已满时,tmux会丢弃最旧的 10% 的行,而不是仅丢弃一行。这意味着窗格的有效历史深度有时会低至其配置限制的 90%。
jas*_*yan 69
这取决于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
Run Code Online (Sandbox Code Playgroud)
捕获完整回滚的过程是:
PrefixEsc : 进入复制模式
v : 开始视觉选择(假设您已经在屏幕底部)
gg : 捕获回滚中的所有内容
y : 将其拉入缓冲区
Prefixc : 打开另一个 tmux 窗口
vim scrollback.txt
Run Code Online (Sandbox Code Playgroud)
i : 在vim中进入插入模式
Prefixp : 粘贴到文件中
这里还有一个答案,描述了如何使用xsel
可能有用的方法将缓冲区复制到临时文件。
Chr*_*oba 59
如果您想要可以从命令行运行的东西(而不是使用 tmux 前缀键),请尝试运行:
tmux capture-pane -pS -1000000
Run Code Online (Sandbox Code Playgroud)
如果您运行它并且它似乎没有做任何事情,那是因为它输出的内容与您屏幕上的内容完全相同,所以它看起来是一样的。
当然,您也可以将其通过管道传输到文件中:
tmux capture-pane -pS -1000000 > file.out
Run Code Online (Sandbox Code Playgroud)
请参阅tmux
手册页并搜索capture-pane
您可以执行的更多操作(例如捕获转义序列以防您想保留颜色,或指定是否要在不包含新行的情况下连接多个可视行)
小智 25
我有标准的键绑定,它似乎与@jasonwryan 的回答有点不同,并且没有更改配置中的任何内容。
以下是对我有用的食谱。如果您不想在 tmux 配置中进行任何更改并且只想快速复制一些回滚,也许您会发现它很有用。
Prefix==Ctrl+b在我的 tmux(tmux 1.6,debian 7)中。
小智 16
这是一个启用此功能的 tmux 插件:
https://github.com/tmux-plugins/tmux-logging
安装后,保存整个回滚prefix + alt-shift-p
。
小智 11
将所有回滚写入 tmux 中:
\ntmux capture-pane -pS - > file\n
Run Code Online (Sandbox Code Playgroud)\n其中\xe2\x80\x98-\xe2\x80\x99 to -S is the start of the history
,如手册所述。
对于会话中的所有窗格,您可以使用以下命令循环遍历所有窗格tmux list-panes -s ...
。
如何指定目标窗格?
\ntmux capture-pane -t :WINDOW.PANE -pS - > file\n
Run Code Online (Sandbox Code Playgroud)\n用于-t
指定目标窗格。格式为SESSION:WINDOW.PANE
. 例如,-t :1.2
表示当前 tmux 会话、窗口 1、窗格 2。
要标识窗格,请使用prefix q
,它会打印当前窗口的每个窗格的 ID。
这实际上非常容易。按prefix key
然后进入命令模式:
。然后做capture-pane -S -<line number you want to dump>
然后save-buffer <filepath>
该文件包含所有回滚输出。出于安全原因,您应该在之后删除缓冲区。
小智 6
如何将 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'
Run Code Online (Sandbox Code Playgroud)
转储到文件并自动打开该文件vim
这很甜蜜:
bind-key v 'capture-pane' \; \
capture-pane -S - \; \
save-buffer /tmp/tmux \; \
delete-buffer \; \
send-keys Escape 'ddivim /tmp/tmux' Enter
Run Code Online (Sandbox Code Playgroud)
此解决方案假设您的 shell处于 vi 模式,因此:
dd
清除任何现有命令i
进入插入模式vim /tmp/tmux
在 tmux 3.0 中测试。
关于终端换行问题的换行符插入
这样做的一个问题是,如果输出行比终端宽度长,它会在由于终端换行而被破坏的任何行上插入文字换行符。而我们通常不希望这样。
我尝试-J
按照此处提到的方式修复此问题,但这导致了另一个问题,它开始向每行添加尾随空格字符。
Eric Cousineau 提出了一个解决方法sed
,但我真的宁愿避免这种情况,因为它会删除命令发出的实际换行符,而我希望在那里。
在以下位置询问了与此相反的问题: https: //github.com/tmux/tmux/issues/422添加 capture-pane 选项以仅保留尾随空格。也许空间变薄是一个基本的终端限制?
归档时间: |
|
查看次数: |
129140 次 |
最近记录: |