将 tmux 窗格移动到窗口

mrl*_*rat 274 tmux

当我有多个窗口时,如何将现有窗格移动到tmux 中的另一个窗口,反之亦然?

我来自screen,在那里我可以切换到窗格,然后切换窗口,直到到达我想要的那个;tmux似乎不允许这样做。

jas*_*yan 250

执行此操作的命令join-pane在 tmux 1.4 中。

join-pane [-dhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane]  
    (alias: joinp)
    Like split-window, but instead of splitting dst-pane and creating
    a new pane, split it and move src-pane into the space.  This can
    be used to reverse break-pane.
Run Code Online (Sandbox Code Playgroud)

为了简化这一点,我在我的中有这些绑定.tmux.conf

# pane movement
bind-key j command-prompt -p "join pane from:"  "join-pane -s '%%'"
bind-key s command-prompt -p "send pane to:"  "join-pane -t '%%'"
Run Code Online (Sandbox Code Playgroud)

第一个从目标窗口抓取窗格并将其连接到当前窗口,第二个执行相反的操作。

然后,您可以通过在会话中运行以下命令来重新加载 tmux 会话:

$ tmux source-file ~/.tmux.conf
Run Code Online (Sandbox Code Playgroud)

  • @mrlanrat 我发现你必须在窗口号前面加上一个冒号。看我下面的回答。 (10认同)
  • '%%' 指的是什么? (3认同)
  • 您至少需要打开 2 个窗口,每个窗口都有几个窗格:然后点击 `Prefix+s` 并*在提示符处输入窗口名称*以将窗格发送到该窗口... (2认同)

Bru*_*sky 201

join-pane 就是答案。根据 tmux 文档,我尝试使用它时也遇到了问题。我发现-t-s开关似乎接受[session]:window而不是[session:]window。也就是说,指定会话是可选的,但包括:是强制性的。(我正在使用 tmux 1.5)

因此,为了将窗格添加到当前窗口并将窗口 1 放入窗格中,命令将是 ( Ctrl+B或任何您的绑定键,然后是)...

:join-pane -s :1
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用默认情况下的 break-pane 将它们分开:Ctrl+B !如果您想将其绑定到快捷方式,我建议不要覆盖像 s 这样的默认绑定,因为在此过程中您会在互联网上寻找答案涉及选择会话,它不会在您的系统上工作。注意休息窗格势必!@紧挨着它,而不是绑定到默认任何东西。出于这个原因,我建议这种绑定......

bind-key @ command-prompt -p "create pane from:"  "join-pane -s ':%%'"
Run Code Online (Sandbox Code Playgroud)

或者,要有一个交互式选择器......

bind-key   @ choose-window 'join-pane -h -s "%%"'
bind-key C-@ choose-window 'join-pane    -s "%%"'
Run Code Online (Sandbox Code Playgroud)

或者,要始终加入最近访问过的窗口...

bind-key @ join-pane -h -s !
Run Code Online (Sandbox Code Playgroud)

注意:这-h会导致它水平堆叠窗格(垂直拆分),而不是相反的默认行为。

最重要的是,无论您选择捷径,您都可以学习。因为如果你只是设置它而忘记它,当你发现自己在一个外国服务器上时,你会感到沮丧。让我们面对现实,终端多路复用器为您提供的最重要的事情是远程服务器上的可靠会话。

这完成了我从 GNU Screen 到 Tmux 的转换。我永远不会回头。

享受!

  • 我也一直错过了“:”……谢谢你。 (5认同)
  • 使用点语法帮助我使用 `window.pane`,例如 `join-pane -s 1.0` 将窗口 1 中的窗格 0 移动到当前窗口中。更多详情请访问 https://maciej.lasyk.info/2014/Nov/19/tmux-join-pane/ (5认同)
  • 文档根本不讨论冒号!好一个 (3认同)
  • 从 tmux 2.1 开始,显然不再需要 `:`(例如,只需执行 `:join-pane -s 1`)。也许这是早期版本的错误 (2认同)
  • @JonnyRaa 在`man tmux` 中,在“命令”下,向下几段,“目标窗口(或 src-window 或 dst-window)以 session:window 形式指定一个窗口。” (2认同)
  • 只是为了添加更多文档,它也进入了另一个级别,您可以在其中使用“.”,如在“[session:]window[.pane]”中指定要使用的窗口窗格......仅需要多个窗格窗口和(也许这是较新的 tmux)在这种情况下您也可以省略会话 (2认同)

小智 58

我想我更喜欢我用来将窗格移动到他们自己的窗口的东西。我用

break-pane -t :
Run Code Online (Sandbox Code Playgroud)

我通过实验弄清楚了,但它似乎工作得很好。您可以轻松地对其进行键绑定或别名,无需编写脚本。

  • 这是将窗格移动到其自己的单独窗口的答案。谢谢。 (3认同)
  • +1。我倾向于比“join-pane”更频繁地使用它。 (2认同)
  • 只是哇...... (2认同)

小智 26

键绑定

默认情况下,Ctrl+ b!打破该活动窗格到一个新的窗口,并切换到它。

其中Ctrl+b是默认的前缀

细节

tmux此键执行的命令是break-pane(alias: breakp),如(alias: ) 命令输出中所示,cmd-break-pane.ckey-bindings.c 中实现并绑定为默认值:list-keyslsk

bind-key    -T prefix       !                 break-pane
Run Code Online (Sandbox Code Playgroud)


小智 20

在查看其他答案并仔细阅读 tmux 手册页后,我暂时确定了以下绑定:

bind-key S choose-window 'join-pane -v -s "%%"'
bind-key V choose-window 'join-pane -h -s "%%"'
Run Code Online (Sandbox Code Playgroud)

这将让您以交互方式选择要加入的窗口,并镜像我的小写s/v绑定以创建新的垂直/水平拆分。如果有人知道如何选择单个窗格而不是窗口,请告诉我。


小智 14

如果您不想在提示中键入窗格标识符,也可以使用

bind-key j "join-pane -s !"
Run Code Online (Sandbox Code Playgroud)

这会将最后一个活动窗格/窗口加入当前窗口。


Wal*_*alf 5

您不必更改键绑定。

当您希望移动的窗格具有焦点时,键入Prefix然后:join-pane -t :11同一会话中目标窗口的编号是什么。您可以通过在其名称前加上project:3. 对我来说,join-pane标签自动完成从j.

添加-h-v切换到命令以设置在目标中创建的新拆分的方向,或者直接转到它并使用Prefix +space重新排列。