如何在 i3wm 中将窗口移动到其父窗口的级别?

如何在 i3wm 中将窗口移动到其父窗口的级别?

假设我打开了窗口 w1、w2,以及以 w1 作为父窗口的子窗口 w1-a、w1-b。有没有办法将 w1-a 移动到其父窗口级别?

答案1

我通过观看 i3 网站上的视频教程找到了答案:

Shift+ $mod+Up

焦点家长:

$mod+a

我希望这对其他刚接触 i3wm 的人有用。

答案2

我想扩展一下作者的答案。 Shift+$mod+Up( move upfor w1-a) 非常依赖于您当前的布局。

假设容器树的初始状态是:

.
├── w1
│   ├── w1-a
│   └── w1-b
└── w2

(请注意,w1 不是直接可见的 - 只有它的两个子容器/窗口是。)

然而,虽然这指定了任何给定父级的子级的顺序,但它没有指定每个容器是否使用水平或垂直分割,这将影响操作的结果move up

在容器树的同一级别内重新排序

例如,如果您在垂直分割中将其与w1-b物理下方一起使用:w1-a

. (horizontal split)
├── w1 (vertical split)
│   ├── w1-a
│   └── w1-b
└── w2

然后它只会将它们切换到w1-b上面w1-a并移动不是到父顶级。容器树现在看起来像这样:

. (horizontal split)
├── w1 (vertical split)
│   └── w1-b
│   ├── w1-a
└── w2

从视觉上看,变化将如下所示:

+------------------------------------------+      +------------------------------------------+
| +-----------------+  +-----------------+ |      | +-----------------+  +-----------------+ |
| | w1              |  | w2              | |      | | w1              |  | w2              | |
| | +-------------+ |  |                 | |      | | +-------------+ |  |                 | |
| | | w1-a        | |  |                 | |      | | | w1-b        | |  |                 | |
| | |             | |  |                 | |      | | |             | |  |                 | |
| | |             | |  |                 | |      | | |             | |  |                 | |
| | |             | |  |                 | |      | | |             | |  |                 | |
| | +-------------+ |  |                 | |      | | +-------------+ |  |                 | |
| | +-------------+ |  |                 | | ---> | | +-------------+ |  |                 | |
| | | w1-b        | |  |                 | |      | | | w1-a        | |  |                 | |
| | | (move up)   | |  |                 | |      | | |             | |  |                 | |
| | |             | |  |                 | |      | | |             | |  |                 | |
| | |             | |  |                 | |      | | |             | |  |                 | |
| | |             | |  |                 | |      | | |             | |  |                 | |
| | +-------------+ |  |                 | |      | | +-------------+ |  |                 | |
| +-----------------+  +-----------------+ |      | +-----------------+  +-----------------+ |
+------------------------------------------+      +------------------------------------------+

提升一级(可能是提问者的意图)

另一方面,如果w1-a位于 的左侧w1-bw2上方w1

. (vertical split)
├── w1 (horizontal split)
│   ├── w1-a
│   └── w1-b
└── w2

move up然后执行on后w1-b,您最终将在树的同一(顶层)级别上得到w2和,但仍然会处于其中 ,这可能会非常令人困惑,特别是考虑到它本身只是一个不可见的容器。w1-bw1-aw1w1

容器树现在看起来像这样:

.
├── w1-b
├── w1
│   └── w1-a
└── w2

+------------------------------------------+      +------------------------------------------+
| +--------------------------------------+ |      | +--------------------------------------+ |
| | w1                                   | |      | | w1-b                                 | |
| | +---------------+  +---------------+ | |      | |                                      | |
| | | w1-a          |  | w1-b          | | |      | +--------------------------------------+ |
| | |               |  | (move up)     | | |      | +--------------------------------------+ |
| | |               |  |               | | |      | | w1                                   | |
| | |               |  |               | | |      | | +----------------------------------+ | |
| | +---------------+  +---------------+ | |      | | | w1-a                             | | |
| +--------------------------------------+ |      | | |                                  | | |
| +--------------------------------------+ | ---> | | +----------------------------------+ | |
| | w2                                   | |      | +--------------------------------------+ |
| |                                      | |      | +--------------------------------------+ |
| |                                      | |      | | w2                                   | |
| |                                      | |      | |                                      | |
| |                                      | |      | |                                      | |
| +--------------------------------------+ |      | +--------------------------------------+ |
+------------------------------------------+      +------------------------------------------+

如果您随后尝试w1-a向上移动,视觉上不会发生明显变化,但树会发生变化并且w1不再存在:

.
├── w1-b
├── w1-a
└── w2

+------------------------------------------+      +------------------------------------------+
| +--------------------------------------+ |      | +--------------------------------------+ |
| | w1-b                                 | |      | | w1-b                                 | |
| |                                      | |      | |                                      | |
| +--------------------------------------+ |      | +--------------------------------------+ |
| +--------------------------------------+ |      | +--------------------------------------+ |
| | w1                                   | |      | | w1-a                                 | |
| | +----------------------------------+ | |      | |                                      | |
| | | w1-a                             | | |      | |                                      | |
| | |                                  | | |      | |                                      | |
| | +----------------------------------+ | | ---> | |                                      | |
| +--------------------------------------+ |      | +--------------------------------------+ |
| +--------------------------------------+ |      | +--------------------------------------+ |
| | w2                                   | |      | | w2                                   | |
| |                                      | |      | |                                      | |
| |                                      | |      | |                                      | |
| +--------------------------------------+ |      | +--------------------------------------+ |
+------------------------------------------+      +------------------------------------------+

因此,您需要再次将其向上移动以在顶层重新排序并放置w1-a在上面w1-b

提升两级

如果在垂直分割中w1-a物理上位于上方,并且在水平分割中位于右侧:w1-bw2w1

. (horizontal split)
├── w1 (vertical split)
│   ├── w1-a
│   └── w1-b
└── w2

那么你最终会w1-a成为w1与和的容器相同的容器w2

容器树:

.
├── w1-a
└── container
    ├── w1
    │   └── w1-b
    └── w2

+------------------------------------------+      +------------------------------------------+
| +-----------------+  +-----------------+ |      | +--------------------------------------+ |
| | w1              |  | w2              | |      | | w1-a                                 | |
| | +-------------+ |  |                 | |      | |                                      | |
| | | w1-a        | |  |                 | |      | |                                      | |
| | | (move up)   | |  |                 | |      | +--------------------------------------+ |
| | |             | |  |                 | |      | +--------------------------------------+ |
| | |             | |  |                 | |      | | container (former root)              | |
| | |             | |  |                 | |      | | +---------------+ +----------------+ | |
| | +-------------+ |  |                 | |      | | | w1            | | w2             | | |
| | +-------------+ |  |                 | | ---> | | | +-----------+ | |                | | |
| | | w1-b        | |  |                 | |      | | | | w1-b      | | |                | | |
| | |             | |  |                 | |      | | | |           | | |                | | |
| | |             | |  |                 | |      | | | |           | | |                | | |
| | |             | |  |                 | |      | | | +-----------+ | |                | | |
| | +-------------+ |  |                 | |      | | +---------------+ +----------------+ | |
| +-----------------+  +-----------------+ |      | +--------------------------------------+ |
+------------------------------------------+      +------------------------------------------+

结论

在 i3 中移动容器/窗口一开始可能有点不直观,但如果您了解哪个容器容纳哪个容器以及它们的位置,您就可以预测移动容器的行为。请记住,移动操作可能并不总是会导致可见的更改。

PS:小思想实验:如果您move left w1-a在“容器树中同一级别内重新排序”示例中,您会得到类似于“向上移动一级”场景的内容。

答案3

我对这个问题的答案是有一个 i3helper bash 脚本,它可以独立于布局通过focus parent和标记来完成此操作。提取的命令是:

#!/bin/bash
case $1 in
  moveToParent)
    i3 mark i3ha
    i3 focus parent
    i3 focus parent
    i3 mark i3hb
    i3 [con_mark="i3ha"] focus
    i3 move window to mark i3hb
    i3 unmark i3ha
    i3 unmark i3hb
    ;;
esac

并将其绑定在 i3 中:

# focus the parent container
bindsym $mod+a focus parent
bindsym $mod+shift+a exec i3helper moveToParent
bindsym $mod+z focus child

也可以直接绑定序列,但这更适合我,因为我也对其他命令进行了重要的预处理。

相关内容