在 GNU Screen 中,我可以切换到给定分割内的任意窗口编号。例如:
- 输入
screen
以启动它。 - 按Ctrl+a c创建一个新窗口。现在有两个窗口:窗口 0 和窗口 1。当前窗口现在是窗口 1。
- 按Ctrl++创建一个新的分割a Shift。s
- 按Ctrl+a Tab转到新的拆分。
- 按Ctrl+0在此新分割中加载窗口 0。
我们如何在 Tmux 中做类似的事情?这是我目前所做的:
- 输入
tmux
以启动它。 - 按Ctrl+b c创建一个新窗口。现在有两个窗口:窗口 0 和窗口 1。当前窗口是窗口 1。
- 按Ctrl+b "创建新的拆分窗格。当前窗格现在是新的拆分窗格。
- 我现在怎样才能将窗口 0 中的 shell 加载到这个新的拆分窗格中?
有没有办法在 tmux 中模拟屏幕的这种行为?
答案1
Tmux 不支持在两个不同的窗口中显示同一个窗格,也不支持在同一个窗口中两次显示同一个窗格。您可以将整个窗口链接到会话,而无需取消其与原始会话的链接。或者您可以将窗格放在另一个窗口中,但这会将该窗格从其原始窗口中移除。
在您的示例中,您已经创建了一个窗格,用于放置所需窗格。在这种情况下,您可以使用swap-pane
tmux 命令交换两个窗格。来自man 1 tmux
:
swap-pane [-dDU] [-s src-pane] [-t dst-pane]
(别名swapp
:)交换两个窗格。[…]
-d
指示 tmux 不要更改活动窗格。如果
-s
省略并且存在标记窗格(参见select-pane -m
),则使用标记窗格而不是当前窗格。
甚至更好:如果-s
和-t
都省略,并且存在标记窗格,则标记窗格和当前窗格将交换。在任何给定时间,整个 tmux 服务器中最多只能有一个标记窗格。
我现在怎样才能将窗口 0 中的 shell 加载到这个新的拆分窗格中?
导航到窗口 0 并标记要移动的窗格(在您的示例中,它是那里唯一的窗格)。您可以使用 RMB(如果支持鼠标)或prefix m(默认prefix为Ctrl+ b)来执行此操作。导航回新窗格并调用:
tmux swapp
您调用的 shelltmux swapp
不会自动销毁,它现在位于标记窗格所在的窗口 0 中。在您的示例中,似乎您不需要此 shell 本身,您只需要新窗格;如果是这样,请考虑tmux swapp && exit
。请记住,如果没有标记窗格(或者当前窗格已标记),则tmux swapp
实际上不会执行任何操作。在这种情况下tmux swapp && exit
只会退出 shell。
或者,反而创建新的拆分窗格后,您只需一步即可将所需窗格移动到当前窗口中。
join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]
(别名joinp
:)类似
split-window
,但不是拆分dst-pane
并创建新窗格,而是将其拆分并移入src-pane
空间。[…]如果
-s
省略并且存在标记窗格(请参阅 select-pane-m
),则使用标记窗格而不是当前窗格。
因此,不要prefix ":
- 标记要移动的窗格。
拆分要拆分的窗格:
- 或者
tmux joinp -v
在 shell 中调用; - 或使用prefix :
joinp -v
Enter;特别是当您要拆分的窗格中没有空闲 shell 时,这很有用(但不要忘记先使该窗格成为当前窗格)。
- 或者
方法prefix :可以用来调用swapp
或任何其他 tmux 命令。
以下是关于从 tmux 外部操作窗格的一些说明。示例使用tmux swapp
但您可以tmux joinp
类似地调用。
swap-pane
允许你交换任何tmux 服务器中的两个窗格。您tmux swapp
甚至可以从外部tmux,无需手动标记和更改窗格,如果您知道如何处理要交换的两个窗格。 它可能是:
tmux swapp -s 0:1.1 -t 0:0.0
格式为session:window.pane
,请参阅手册中对 的解释target-pane
。请注意,这些裸数字是“相对的”(至少部分如此:window.pane
,我不确定数字)。与 交换后的session
第一个窗格变为。另一方面,tmux 会话、窗口和窗格有自己的0:0.0
0:1.1
0:1.1
独特的标识符(分别以$
、@
和为前缀%
)。对于你的情况,命令可能类似于:
tmux swapp -s %2 -t %0
但请注意,如果旧窗格确实%0
位于0:0.0
而新窗格位于%2
,0:1.1
则它们现在分别%0
位于0:1.1
和。每个窗格的唯一标识符“附加”到窗格的内容(进程)并随其“移动”。窗格的非前缀标识符取决于窗格的总数及其在窗口中的位置。%2
0:0.0
您可以命名会话 ( rename-session
) 和窗口 ( rename-window
)。这可让您更轻松地识别窗格session:window.pane
。
您可以运行多个 tmux 服务器。服务器通过其套接字路径(-L
选项)或套接字名称(-S
)来标识。默认名称是default
。如果您tmux
在 tmux 内部调用时不使用上述选项,那么它将找到正确的服务器(TMUX
我认为是通过环境变量)。如果您tmux
在 tmux 外部调用时不使用上述选项,那么它将像tmux -S default
。您可能想要交换属于非默认 tmux 服务器的两个窗格,例如:
tmux -S other swapp -s 0:1.1 -t 0:0.0
Tmux 不支持在服务器之间交换窗格。拥有两个服务器的意义在于它们是分开的。如果您需要在 tmux 的两个半独立实体之间交换窗格,这些实体应该是单个 tmux 服务器内的会话。您可以在不同的会话之间交换窗格。
如果你确实需要“劫持”另一个 tmux 服务器下运行的进程,请使用reptyr
。该工具完全独立于 tmux。