假设我打开了窗口 w1、w2,以及以 w1 作为父窗口的子窗口 w1-a、w1-b。有没有办法将 w1-a 移动到其父窗口级别?
答案1
我通过观看 i3 网站上的视频教程找到了答案:
Shift+ $mod+Up
焦点家长:
$mod+a
我希望这对其他刚接触 i3wm 的人有用。
答案2
我想扩展一下作者的答案。
Shift+$mod+Up
( move up
for 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-b
和w2
上方w1
:
. (vertical split)
├── w1 (horizontal split)
│ ├── w1-a
│ └── w1-b
└── w2
move up
然后执行on后w1-b
,您最终将在树的同一(顶层)级别上得到w2
和,但仍然会处于其中 ,这可能会非常令人困惑,特别是考虑到它本身只是一个不可见的容器。w1-b
w1-a
w1
w1
容器树现在看起来像这样:
.
├── 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-b
w2
w1
. (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
也可以直接绑定序列,但这更适合我,因为我也对其他命令进行了重要的预处理。