i3 有个东西叫「scratchpad」,和我在 Awesome 里用的 run_or_raise
功能有些类似。
我的需求是某些浮动窗口可以「招之即来,挥之即去」。上次尝试切换 i3 遇到的一大麻烦就是,我经常从终端里启动图形界面的程序,而启动完之后我得手动给我的终端找个地方放着。i3 不支持最小化,也只有十个带数字快捷键、可以快速访问的工作区,所以 scratchpad 很重要,但是它的行为我有些捉摸不定。
首先是 move scratchpad
这个命令。它会把当前 con(窗口或者容器)浮动、取消全屏,然后移到一个叫 __i3_scratch
的不显示的工作区。
然后是 scratchpad show
命令(动词放后边了)。如果没有指定条件,它有如下复杂的处理逻辑:
- 检查当前窗口是不是去过 scratchpad。如果是,就把它丢回去。
- 否则检查当前工作区是否有另外的 scratchpad 窗口。如果有,就给它焦点。
- 否则检查其它工作区是否有另外的 scratchpad 窗口。如果有,就把它移过来。
-
否则把
__i3_scratch
里最久没有「见到光」的窗口移过来。
如果指定了条件,那么这样检查匹配的窗口:
- 如果窗口不曾去过 scratchpad,什么也不做。
- 否则如果窗口去过 scratchpad 并且在当前工作区,就隐藏它。
- 否则就把它移过去。
总结一下,就是「回去,或者回来」。虽然动作的名字叫「show」,但其实是一个类似于 toggle 的功能。它的麻烦之处在于:如果你有多个去过 scratchpad 的窗口,你很难控制出现的是哪个窗口。一个绕过这个问题的办法是,总是带条件地使用 scratchpad。另一个小麻烦是:没有办法在匹配的窗口已经显示的时候,不要把它隐藏掉——有时候我只是习惯性地呼叫我的终端,而不看它是不是已经在我面前了。
对于浮动窗口,i3 有很多奇怪的限制,或者说是未实现:
- 不支持最小化
- 浮动窗口也不能显示在平铺窗口之下(加上上一条,就是没办法暂时藏起来)
- 不支持最大化(手动调整窗口大小无法自动适配显示器大小,也没有「恢复」一说)
- 不支持显示在最上层(当你在 GIMP 里开了一堆图片需要局部对比时)
- 有全屏窗口时不能显示浮动窗口(看视频无法临时使用浮动窗口查个单词啥的)
- 切换窗口时,平铺窗口和浮动窗口是隔绝的(需要单独的快捷键来切换)