将另一个窗口的终端加载到 tmux 中的当前拆分窗格中

将另一个窗口的终端加载到 tmux 中的当前拆分窗格中

在 GNU Screen 中,我可以切换到给定分割内的任意窗口编号。例如:

  • 输入screen以启动它。
  • Ctrl+a c创建一个新窗口。现在有两个窗口:窗口 0 和窗口 1。当前窗口现在是窗口 1。
  • Ctrl++创建一个新的分割a Shifts
  • Ctrl+a Tab转到新的拆分。
  • Ctrl+0在此新分割中加载窗口 0。

我们如何在 Tmux 中做类似的事情?这是我目前所做的:

  • 输入tmux以启动它。
  • Ctrl+b c创建一个新窗口。现在有两个窗口:窗口 0 和窗口 1。当前窗口是窗口 1。
  • Ctrl+b "创建新的拆分窗格。当前窗格现在是新的拆分窗格。
  • 我现在怎样才能将窗口 0 中的 shell 加载到这个新的拆分窗格中?

有没有办法在 tmux 中模拟屏幕的这种行为?

答案1

Tmux 不支持在两个不同的窗口中显示同一个窗格,也不支持在同一个窗口中两次显示同一个窗格。您可以将整个窗口链接到会话,而无需取消其与原始会话的链接。或者您可以将窗格放在另一个窗口中,但这会将该窗格从其原始窗口中移除。

在您的示例中,您已经创建了一个窗格,用于放置所需窗格。在这种情况下,您可以使用swap-panetmux 命令交换两个窗格。来自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(默认prefixCtrl+ 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 "

  1. 标记要移动的窗格。
  2. 拆分要拆分的窗格:

    • 或者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.00:1.10:1.1独特的标识符(分别以$@和为前缀%)。对于你的情况,命令可能类似于:

tmux swapp -s %2 -t %0

但请注意,如果旧窗格确实%0位于0:0.0而新窗格位于%20:1.1则它们现在分别%0位于0:1.1和。每个窗格的唯一标识符“附加”到窗格的内容(进程)并随其“移动”。窗格的非前缀标识符取决于窗格的总数及其在窗口中的位置。%20: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。

相关内容