将tmux窗格移至窗口


228

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

我来自screen,可以在其中切换到窗格,然后切换窗口,直到找到所需的窗口为止。tmux似乎不允许这样做。

Answers:


209

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.

为了简化这一点,我为此准备了以下绑定.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 '%%'"

第一个从目标窗口获取窗格并将其连接到当前窗口,第二个则相反。

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

$ tmux source-file ~/.tmux.conf

我正在尝试这种方法,但是当我将您的代码放入.tmux.conf文件并执行Ctrl-b,j时,似乎什么都没有发生。
mrlanrat 2011年

2
您需要至少打开2个窗口,每个窗口中都有几个窗格:然后在提示时单击Prefix+s输入窗口名称,以将窗格发送到该窗口...
jasonwryan 2011年

我仍然没有运气,什么也没发生。我感到tmux没有读取.tmux.conf文件,因为它根本不响应Ctrl-b,j或Ctrl-b,s。(这些是只有2条线路中的配置文件中)
mrlanrat

7
@mrlanrat我发现您必须在窗口号前加一个冒号。请参阅下面的答案。
布鲁诺·布罗诺斯基

1
“ %%”指的是什么?
oligofren

152

连接窗格就是答案。我也尝试基于tmux文档使用它时遇到问题。我发现-t和-s开关似乎接受[session]:window,而不接受[session:] window。也就是说,指定会话是可选的,但必须包含:。(我正在使用tmux 1.5)

因此,为了将窗格添加到当前窗口并将窗口1放置到窗格中,命令应为(Ctrl-B或绑定键,然后按)。

:join-pane -s :1

然后,您可以使用分隔窗格将其中断,默认情况下为:Ctrl-B!如果您想将其绑定到快捷方式,建议不要覆盖s之类的默认绑定,因为一路走来,您将在Internet上寻找涉及选择会话的答案,并且在您的系统上将不起作用。请注意,分隔窗格已绑定到!@紧挨着它,并且默认情况下不绑定任何东西。因此,我建议这种绑定...

bind-key @ command-prompt -p "create pane from:"  "join-pane -s ':%%'"

或者,具有交互式选择器...

bind-key @ choose-window 'join-pane -h -s "%%"'

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

bind-key @ join-pane -h -s !

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

最重要的是,无论您选择哪种快捷方式,您的学习。因为如果您只是设置它而忘记了它,那么当您在外部服务器上发现自己时,就会被吸引住。面对现实,终端多路复用器为您提供的最重要的功能是远程服务器上的可靠会话。

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

请享用!


2
我也一直想念':'...谢谢。
2011年

我最近对此有2票反对,但没有任何评论说明原因。那只是粗鲁和反自由文化。
布鲁诺·布罗诺斯基

1
文档根本没有提到冒号!好人
JonnyRaa

1
使用点语法是什么让我window.panejoin-pane -s 1.0在窗口1移动窗格中0到当前窗口。更多详细信息,请访问maciej.lasyk.info/2014/Nov/19/tmux-join-pane
mbigras

从tmux 2.1开始,:显然不再需要(例如,只需做:join-pane -s 1)。也许这是早期版本中的错误
villapx

38

我想我更喜欢将窗格移动到自己的窗口中使用的东西。我用

break-pane -t :

我通过实验弄清楚了,但是似乎效果很好。您可以轻松地对其进行键盘绑定或别名化,而无需编写脚本。


2
+1。我倾向于比使用更多的时间join-pane
克里斯·B

14

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

bind-key j "join-pane -s !"

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


1
您正在使用哪个版本?我得到unknown command: join-pane -s !1.6。
paradroid

在这里使用2.0,但是仅将行放入conf中而不使用引号似乎可以正常工作。bind-key j join-pane -s !
bkzland

13

在浏览了其他答案并仔细阅读了tmux手册页之后,现在我确定了以下绑定:

bind-key S choose-window 'join-pane -v -s "%%"'
bind-key V choose-window 'join-pane -h -s "%%"'

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


这非常有帮助。谢谢。不幸的是,-v-h不会分别创建垂直和水平“拆分”。它们分别创建垂直和水平“ 堆叠窗格 ”。(也就是说,垂直堆叠的窗格具有水平的分割。)因此,您必须以这种方式训练大脑。这-v也是默认设置,因此我将其省略,仅将其-h放入其中,以便您~/.tmux.conf充当备忘单以供您查看。
布鲁诺·布罗诺斯基

我比其他“突破窗格”的答案更喜欢这个。暂时将窗格自由地拆分到其自己的窗口中之后,稍后我想将其发送回较旧的窗口之一,并且该窗口可以正常处理。
稳定狗

13

键绑定

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

其中Ctrl+ b是默认的前缀

细节

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

bind-key    -T prefix       !                 break-pane

4

您不必更改键绑定。

在您要移动的窗格具有焦点的同时,键入Prefix,然后:join-pane -t :11同一会话中,无论目标窗口的编号在哪里,请输入哪里。您可以在名称前加上,将其移至另一个会话project:3。对我来说,join-pane标签自动完成功能来自j

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.