【问题标题】:Tmux: Switch the split style of two adjacent panesTmux:切换两个相邻窗格的拆分样式
【发布时间】:2013-03-04 13:46:47
【问题描述】:

我意识到重塑窗格布局一般 描述起来并不简单,但我对至少能够交换两个相邻窗格的布局感兴趣。

假设我将这些窗格布置成这样

 _____________
|    |        |
|    |   2    |
|    |________|
| 0  |        |
|    |        |
|    |        |
|    |   3    |
|____|        |
| 1  |        |
|____|________|

我现在发现我希望窗格 3 有更多的垂直空间。考虑如何用窗格 0 或 1 重新排列它显然不是一件容易的事,但如果我可以告诉 3 和 2 翻转拆分,那就太好了轴:

 _____________
|    |     |  |
|    |     |  |
|    |     |  |
| 0  |     |  |
|    |  3  |2 |
|    |     |  |
|    |     |  |
|____|     |  |
| 1  |     |  |
|____|_____|__|

(注意这里 tmux 很可能会重新排序,所以旧的 3 变成新的窗格 #2)

目前,当我尝试运行 join-pane -h 来重新组织它时,它告诉我“无法将窗格加入到它自己的窗口中”。是的,好吧,我只是想在不破坏整个布局的情况下对其进行洗牌。

我想一种解决方法是将其拆分为自己命名的窗口,然后立即将其重新加入,尽管它看起来无法确定要切换到的方向(水平与垂直)。

请注意,这与交换两个窗格的位置的操作不同,其中存在一个可以使用的命令。我正在寻找交换分裂轴。

【问题讨论】:

    标签: tmux


    【解决方案1】:

    前缀+空格绑定到next layout

    【讨论】:

    • 是的,但这与 all 窗格有关。我确实有一个很好的解决方案。当我回到终端时会发布
    • 你的解决方案是什么?
    • 是的,@StevenLu 你的解决方案是什么?很想知道,因为谷歌刚刚把我带到这里,但让我挂了...... ;]
    • 我有解决办法,会发布答案
    【解决方案2】:
    # Here is a jewel of a bind which does the task of flipping the
    # orientation of the current pane with the pane before it (in the
    # ordering) -- I had a SO question on this and nobody answered.
    bind -n M-f move-pane -t '.-'
    bind M-f move-pane -t '.-'
    bind -n M-r move-pane -h -t '.-'
    bind M-r move-pane -h -t '.-'
    

    评论是谎言,这个功能不直观,坦率地说很糟糕,但它确实在紧要关头工作。

    更新:我已经更新了这个以删除我的配置中的-n 绑定,基本上你确实希望保持打开通过tmux“通过”击键的能力。例如,一段时间后,我希望在 Vim 中具有完全相同的功能,我将其绑定到相同的组合。


    更新:可以在这里与出色的解决方案结合使用:https://stackoverflow.com/a/70024796/340947

    这使您可以抓住一个窗格并四处走动。使我的绑定过时了,但对于熟悉的行为,两者都可以保留(就像我会的那样)。如果您碰巧在第一个窗格上运行它,我真的不喜欢我的会做一些令人困惑的事情(在这种情况下,'.-' 会选择右下角的窗格)。

    【讨论】:

    • 对于未来的旅行者,这里是对 Steven 所做的事情的解释:bind M-f move-pane -t '.-' 这将绑定键盘命令 (M)eta+f。您的元密钥通常是您的 alt 密钥。 -t 选择一个目标,目标以'A.B' 的格式呈现,A 是目标窗口,B 是该窗口的窗格索引。在 Steven 的示例中,省略了目标窗口,因此使用当前活动的窗口。为窗格索引提供的- 表示“按编号的前一个窗格”。默认情况下,窗格是垂直拆分的,但是在后面的绑定中添加-h 会水平拆分
    【解决方案3】:

    如果你真的想完全按照你说的做,我建议你把窗格打开到一个新窗口,然后重新加入。

    例如……

    确保您有两个窗格之一处于活动状态并将其拆分:

    前缀break-pane

    返回主窗口(前缀w)并在其余窗格上执行任何操作以使其成为您想要的布局

    确保您的窗格处于活动状态,您希望另一个窗格与之相邻

    确保窗口已命名(或指定的名称已知)

    转到窗格被分解成的新窗口(再次前缀w

    join-pane -t <Main Window Name> -h(或者-v,如果你想要垂直分割)

    【讨论】:

    • 你没有看到我自己的答案吗?我刚才也接受了。
    【解决方案4】:

    C-b space(默认绑定到下一个布局)在可用布局中循环

    【讨论】:

    • 我将避免否决这个答案,原因有两个:1.我没有在我的问题中明确表示我对切换或循环通过预定义的布局完全不感兴趣,正如你提到的,和 2. 这个答案可能对偶然发现这个问题并且可能对学习如何使用预定义布局感兴趣的其他读者有益。
    • 但所有这些都因某人在 2013 年已经提供了您的答案而失效
    • 我赞成你的非反对票,因为C-b space 正是我所需要的。 ;)
    • 马克,那么你可能会发现C-B M-1C-B M-2等有用。
    • 我非常喜欢 C-B M-1、C-B M-2 解决方案(其中 M 是未来旅行者的 Alt 键)。大多数情况下,我在刚刚设置好的系统(不是我的)上运行 tmux,因此我更喜欢开箱即用的解决方案,这与绑定键不同(这很难记住并且需要从 Google 搜索中复制粘贴)。跨度>
    【解决方案5】:

    重申:

    You have panes
    laid out like
    this:
    
     _____________                    _____________
    |    |        |                  |    |     |  |
    |    |   2    |                  |    |     |  |
    |    |________|                  |    |     |  |
    | 0  |        |   but you want   | 0  |     |  |
    |    |        |   them to look   |    |  3  |2 |
    |    |        |   like this:     |    |     |  |
    |    |   3    |                  |    |     |  |
    |____|        |                  |____|     |  |
    | 1  |        |                  | 1  |     |  |
    |____|________|                  |____|_____|__|
    

    由于您知道所有窗格编号(尤其是要重新排列的窗格的编号),因此简短的回答是输入:

    CTRL+B :move-pane -s 3 -t 2 -h ENTER


    但如果您不知道所有窗格编号,这里有一个重新定位窗格的简单方法:

    1. 如果您的鼠标支持尚未打开,请使用以下命令打开它:
      CTRL+B :set-option -g mouse on ENTER
    2. 使用鼠标,单击您要撕下的窗格 -- 也就是说,单击要重新定位到右侧或下方的窗格另一个窗格。 (在您的示例中,这将是窗格 2,因为您想将其撕下并重新定位到窗格 3 的右侧。)
    3. 接下来,单击要附加/重新定位撕下的窗格的窗格。 (在您的示例中,这将是窗格 3,因为您希望将窗格 2 附加到它的右侧。)
    4. 最后,输入:
      CTRL+B :move-pane -s ! -h ENTER

    解释:

    • 魔术主要发生在第 4 步,使用-s ! 开关。它告诉tmux 将您单击的倒数第二个窗格移动到您单击的最后一个窗格。
    • 步骤 4 中的-h 开关告诉tmux 水平重新连接窗格——即向右。如果您想在下面附加它,请改用-v 开关,或者完全不使用-h 开关。

    注意事项:

    • 这些步骤会将窗格 2 放置在窗格 3 的右侧。如果您希望窗格 2 位于窗格 3 的左侧,则只需将窗格 3 作为“撕下”运行这些步骤" 面板,并将窗格 2 作为要附加到的面板。 (或者您可以交换面板;您可以通读man tmux 了解如何操作。)
    • 如果您通过 Unix shell 提示符运行步骤 4,请记住引用 !,如下所示:
      tmux move-pane -s '!' -h
    • 电话:
      set-option -g mouse on
      如果您还没有将其放入 ~/.tmux.conf 文件中,这是一条很棒的行。
    • 如上所述,tmux在您重新排序后分配新的窗格编号。
    • 要查看特定窗格的窗格编号,请单击所需页面(使其成为当前页面),然后键入:
      CTRL+B   我
      如果显示窗格编号的状态消息对您来说消失得太快,您可以使用以下命令延长它的显示时间:
      CTRL+B :set-option -g display-time 4000 回车
    • 要快速查看所有窗格的窗格编号/索引,请键入:
      CTRL+B   Q
      如果窗格编号对您来说消失得太快,您可以使用以下命令延长它们的可见时间:
      CTRL+B :set-option -g display-panes-time 4000 ENTER

    【讨论】:

    • 感谢您的回答。直到现在我都没有机会回顾它。我认为这种基于鼠标的功能可能非常强大,但取决于我使用的计算机类型,我可能更喜欢仅使用键盘,另一方面,我确实相信这个确切的用例是少数几个之一鼠标由于其精确能力,理论上可以明显优于鼠标。我认为这可能非常好,但是当您无法获得实时预览时会有些痛苦。我希望这可能是可能的。我还没有深入探索鼠标映射。
    • 我相信 tmux 的内置鼠标右键菜单完全使用绑定构建,这令人印象深刻。我认为可以做一些事情来基本上使用鼠标拖动窗格并以类似于现代平铺界面的方式重新排列它们。这将是惊人的。至于基于键盘的界面,我接受的另一个答案很好,它可能会有点令人困惑,但永远不会让您进入不可恢复的状态,因为它始终是您关注的同一个窗格。
    【解决方案6】:
    #flipping the orientation of the current pane with the pane <arrow-way>-of
    
        bind -n S-Up move-pane -h -t '.{up-of}'
        bind -n S-Right move-pane -t '.{right-of}'
        bind -n S-Left move-pane -t '.{left-of}'
        bind -n S-down move-pane -h -t '.{down-of}'
    

    这是我的示例,仅以箭头的方式使用窗格更改 otiantation 按 Shift 和箭头键或根据需要重新绑定命令

    【讨论】:

    • 惊人的第一篇文章。这很棒。不确定何时添加了这些目标窗格令牌,但这是这里的门票。也是很好的绑定选择,我以前在 vim 中使用 shift+arrow 来按单词或段落移动,但它永远不会被使用。
    【解决方案7】:

    组合你的前缀(通常是crtl+b),然后是space

    当您有 2 个窗格时,它将在水平模式和垂直模式之间切换。

    【讨论】:

    • 当您拥有的窗格数量为 4 个或更少时,这很好。此功能确实很有用,但您必须意识到它不会循环遍历您可以拥有的所有可能的布局。它按以下确切顺序循环:(1) 所有垂直拆分,(2) 所有水平拆分,(3) 第一个窗格在顶部,其余的在底部垂直拆分,(4) 第一个窗格在左侧,其余的右侧水平分割,(5)比较合理的网格布局。 只有 5 个布局循环使用next-layout
    • 感谢您的信息,我编辑了我的答案。
    • 谢谢!此外,我想提一下,tmux 处理平铺的方式可能是使用二叉树。例如,在像所有水平拆分这样的情况下,树的确切布局是无关紧要的,但是一旦组合了不同类型的拆分,它就会对布局产生重要影响。当您有网格布局时,水平或垂直条是“父”拆分,不能“拆分”。让我知道这是否让您感到困惑。例如,在我的问题的第一张图中,网格布局是垂直主拆分。你也可以有一个水平主分割的网格。
    • 所以我想你可以开始了解我来自哪里了。即使我只使用 4 个窗格(哈!!!有时我有近 20 个窗格),我希望能够例如从垂直主拆分布局交换到水平主拆分布局。 next-layout 肯定不会给我这个选项。
    猜你喜欢
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多