去年写过一篇 从Tmux 转到GNU Screen,理由是我可以 在两个显示器上通过PuTTY连接到同一个GNU Screen会话,但两个显示器可以显示不同的窗口(用GNU Screen的术语来说,是window和region),当时认为Tmux是做不到这一点的(如果两个PuTTY窗口attach到同一个会话,一个执行切换窗口的操作,另外一个PuTTY上面也会跟着切换,不能工作在不同窗口上),

但后来发现,其实Tmux支持类似的功能,不过文档中写得有点不太浅显明白.我也是碰到有文章讲这个才发现有这个功能的.

tmux 会话间共享窗口

Tmux实现这个功能依靠的概念是grouped sessions,也就是将建立两个会话(session)并将它们归并到同一个组,同一个组内的多个会话拥有同样的窗口(和窗口里面的pane),但各自有着不同的"当前窗口".创建组的方法是是在创建第二个session的时候用 -t target-session 将前一个session指定为新session的目标session:

new-session [-AdDP] [-c start-directory] [-F format] [-n window-name] [-s session-name]
[-t target-session] [-x width] [-y height] [shell-command]
(alias: new)
Create a new session with name session-name. The new session is attached to the current terminal unless -d is given.
window-name and shell-command are the name of and shell command to
execute in the initial window. If -d is used, -x and -y specify the
size of the initial window (80 by 24 if not given). If run from a terminal, any termios(4) special characters are saved and
used for new windows in the new session. The -A flag makes new-session behave like attach-session if session-
name already exists; in the case, -D behaves like -d to attach-session. If -t is given, the new session is grouped with target-session. This
means they share the same set of windows - all windows from target-
session are linked to the new session and any subsequent new windows or
windows being closed are applied to both sessions. The current and
previous window and any session options remain independent and either
session may be killed without affecting the other. Giving -n or shell-
command are invalid if -t is used. The -P option prints information about the new session after it has
been created. By default, it uses the format ‘#{session_name}:’ but a
different format may be specified with -F.`

然后用 tmux list-sessions 就可以看到有两个session.

bamanzi@raspberrypi:~ $ tmux ls
1: 2 windows (created Tue Jun 27 13:51:20 2017) [204x52] (group 0)
3: 2 windows (created Tue Jun 27 13:59:19 2017) [204x52] (group 0) (attached)

可以看到这里两个会话都有 (group 0) 这个标识.

两个显示器(或者两个人)用 tmux attach -t <id> 分别attached到这两个不同的会话的话,两边可以各自查看不同的窗口.

解决窗口尺寸的问题

不过相对GNU Screen而言,这里还是有个不爽的地方,两个tmux会话之间窗口(window)大小会相互影响:比如一个PuTTY是132x55的,另一个是140x50的,当只有一个session连上来的时候,tmux会将窗口尺寸调整到跟当前PuTTY一致,但组内另外一个窗口连上来的时候,window的大小跟会跟两个屏幕的公共部分一样大了(变成132x50)--这跟同一个tmux session的情况是一样的.

而GNU Screen的设计不太一样,屏幕尺寸是不相互影响的,连region分隔也不相互影响.我们可以在一个PuTTY窗口上显示窗口3和5(GNU Screen的窗口比较类似于Tmux的pane),在另一个PuTTY窗口上显示窗口1, 2和4.窗口大小完全相互不影响--不过它有个烦人的地方,将一个窗口放到当前region来现实的时候,要用C-a F (fit) 调整一下该程序的终端大小,使其跟当前region大小一致.

tmux 提供了一个选项来解决(部分解决)这个问题:

aggressive-resize [on | off]

         Aggressively resize the chosen window.  This means that tmux will resize the window to
the size of the smallest session for which it is the current window, rather than the
smallest session to which it is attached. The window may resize when the current
window is changed on another sessions; this option is good for full-screen programs
which sup‐ port SIGWINCH and poor for interactive programs such as shells.

简单翻译一下:当打开这个选项之后,如果两个session显示的当前窗口不是同一个,那么两个session各自根据自己的大小来调整其当前窗口的尺寸(简单理解就是,各自最大化);如果两个session显示同一个窗口,那么还按之前的规则来(缩小到两边的公共面积内).

参考

在tmux会话之间共享窗口(Windows & Panes)的更多相关文章

  1. Android应用程序组件Content Provider在应用程序之间共享数据的原理分析

    文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6967204 在Android系统中,不同的应用 ...

  2. Tmux会话-基本操作及原理

    一.Tmux命令介绍: Tmux (“Terminal Multiplexer”的简称), 是一款优秀的终端复用软件,类似 GNU screen,但比screen更出色. tmux来自于OpenBSD ...

  3. Prism 4 文档 ---第10章 Silverlight和WPF之间共享代码

        本主题帮助你理解来自Prism的多目标和它的优缺点.多目标的代码针对两个不同的平台有大致相同的代码库.这允许同时保持代码尽可能多一样能够产生针对两种不同技术的二进制文件.在这种情况下,本节介绍 ...

  4. DELPHI编写服务程序总结(在系统服务和桌面程序之间共享内存,在服务中使用COM组件)

    DELPHI编写服务程序总结 一.服务程序和桌面程序的区别 Windows 2000/XP/2003等支持一种叫做“系统服务程序”的进程,系统服务和桌面程序的区别是:系统服务不用登陆系统即可运行:系统 ...

  5. Python 进程之间共享数据

    最近遇到多进程共享数据的问题,到网上查了有几篇博客写的蛮好的,记录下来方便以后查看. 一.Python multiprocessing 跨进程对象共享  在mp库当中,跨进程对象共享有三种方式,第一种 ...

  6. wpf多程序集之间共享资源字典--CLR名称空间未定义云云

    wpf多程序集之间共享资源字典--CLR名称空间未定义云云 分类: WPF 2012-10-28 10:57 1162人阅读 评论(0) 收藏 举报 以下介绍如何创建可用于在多个程序集之间共享的资源字 ...

  7. C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 VC中进程与进程之间共享内存 .net环境下跨进程、高频率读写数据 使用C#开发Android应用之WebApp 分布式事务之消息补偿解决方案

    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped 转 节点通信存在两种模型:共享内存(Shared memory)和消息传递(Messages passing). ...

  8. 学习笔记4_ServletContext(重要整个Web应用的动态资源之间共享数据)

    ServletContext(重要) 一个项目只有一个ServletContext对象! 我们可以在N多个Servlet中来获取这个唯一的对象,使用它可以给多个Servlet传递数据! 与天地同寿!! ...

  9. Android应用程序之间共享文字和图片(一)

    以下为TestReceiveShare1工程 MainActivity如下: package cn.testreceiveshare1; import java.util.ArrayList; imp ...

随机推荐

  1. webpack打包之无依赖模块

    一.入口文件main.js // main.js console.log('webpack'); 二.出口文件bundle.js 1.浏览代码 2.本质 // 实际就是一个自执行函数 (functio ...

  2. python 3.6 + numpy + matplotlib + opencv + scipy 安装

    首先,下载并安装 python3.6: 然后,在网址http://www.lfd.uci.edu/~gohlke/pythonlibs/ 上 分别下载 numpy.scipy.matplotlib.o ...

  3. Codeforces.226D.The table(构造)

    题目链接 \(Description\) 给定一个\(n\times m\)的矩阵\(A_{i,j}\),每次可以将一列或一行取负.求一个方案使得若干次操作后,每行每列的和都非负. \(n,m\leq ...

  4. BZOJ.5286.[AHOI/HNOI2018]转盘(线段树)

    BZOJ LOJ 洛谷 如果从\(1\)开始,把每个时间\(t_i\)减去\(i\),答案取决于\(\max\{t_i-i\}\).记取得最大值的位置是\(p\),答案是\(t_p+1+n-1-p=\ ...

  5. php include 绝对路径 dirname(__FILE__)

     include(dirname(__FILE__)."/PHPMailer/function.php"); 

  6. 潭州课堂25班:Ph201805201 爬虫高级 第八课 AP抓包 SCRAPY 的图片处理 (课堂笔记)

    装好模拟器设置代理到 Fiddler  中, 代理 IP 是本机 IP, 端口是 8888, 抓包 APP斗鱼 用 format 设置翻页

  7. [CC-BLREDSET]Black and Red vertices of Tree

    [CC-BLREDSET]Black and Red vertices of Tree 题目大意: 有一棵\(n(\sum n\le10^6)\)个结点的树,每个结点有一种颜色(红色.黑色.白色).删 ...

  8. POJ 水题(刷题)进阶

    转载请注明出处:優YoU http://blog.csdn.net/lyy289065406/article/details/6642573 部分解题报告添加新内容,除了原有的"大致题意&q ...

  9. 关于 win10启动错误 Error:16

    那个软件报这个错误,就打开属性 -- 兼容性 -- 打勾以管理员身份运行

  10. Redis 数据变化通知服务实践

    从Redis 2.8.0版本起,Redis加入了“Keyspace notifications”(即“键空间通知”)的功能.键空间通知,允许Redis客户端从“发布/订阅”通道中建立订阅关系,以便客户 ...