为tmux绑定按键重绘滚动缓冲区时遇“Can't write to client”错误求助
tmux绑定capture-pane刷新本地滚动缓冲区的问题解决
问题背景
许多终端程序(如PuTTY)自带滚动条,可向上查看已滚出屏幕的内容;tmux的每个窗口也内置回滚缓冲区。
在以下场景中,需要将tmux回滚缓冲区的内容刷新到本地终端的滚动缓冲区:
- 重新连接tmux会话后,本地终端缓冲区为空
- 切换tmux窗口导致本地缓冲区混乱
- 需要复制粘贴超出当前屏幕尺寸的内容
tmux的capture-pane(简称capturep)命令可输出回滚缓冲区内容,手动将其保存到文件后用cat输出到屏幕能实现需求,但希望通过按键绑定一键完成重绘操作。
尝试的配置及错误
尝试了如下按键绑定:
bind-key -T prefix C-l capturep -e -J -p -S- -E-
按下前缀键+Ctrl-L时,屏幕底部短暂提示Can't write to client;即使添加-t0指定目标窗口,错误依然存在。但在shell提示符下直接执行tmux capturep -e -J -p -S- -E-可正常输出内容。
解决方法
问题根源在于-p参数:该参数让capturep将内容输出到tmux的标准输出,但按键绑定执行时,tmux没有合适的输出目标(不同于在shell中执行时输出到终端),因此报错。
需要将capturep的输出导向当前终端设备/dev/tty,可通过两种方式修改绑定:
方式一:管道结合run-shell
bind-key -T prefix C-l capturep -e -J -S- -E- | run-shell "cat > /dev/tty"
方式二:在run-shell中执行完整命令
bind-key -T prefix C-l run-shell "tmux capturep -e -J -p -S- -E- > /dev/tty"
参数说明
-e:保留输出中的转义序列,保证内容的格式(如颜色)与原缓冲区一致-J:将换行符连接成连续的行,避免不必要的换行-S-和-E-:捕获整个回滚缓冲区的内容(从最旧到最新)
内容的提问来源于stack exchange,提问作者Michael Grant
相关产品推荐
相关产品推荐

