使用sway
我最初只会简单的sway快捷键,有些窗口布局我甚至是使用鼠标来拖放窗口完成的。但是,当我开始使用 ThinkPad X220笔记本 这样古老的笔记本(对 FreeBSD 支持极好),12.5英寸分辨率1366x768的经典小屏机器,迫使我研究 sway配置 来实现极致的紧凑布局。
这也带来一个问题,当所有的窗口标题栏消失以后,已经无法使用鼠标拖放完成窗口布局,不得不完全以来键盘操作布局。这迫使我重新回来学习基本的sway快捷键。
"左一右二"布局
在Sway(i3-like)的平铺逻辑中,默认的平铺方式是"水平平铺"。要实现"左一右二"(右边两个窗口上下排列),关键是使用"切换切分方向(Split Direction)"快捷键:
Mod + h: 水平切分(Horizontal)Mod + v: 垂直切分(Vertical)
"左一右二" 在布局时候,第2个窗口布局好以后,在启动第3个窗口前,按以下 Mod + v 见默认水平切分改为垂直切分,那么启动的第3个窗口就会在第2个窗口下方,形成 "左一右二"(右边两个窗口上下排列)
预设切分方向快捷键
在Sway中,虽然也能通过拖拽来调整布局,但是这不是核心能力,真正的核心是预设切分方向快捷键:
功能 |
默认快捷键 |
说明 |
|---|---|---|
水平切分(Horizontal) |
|
下一个窗口出现在当前窗口的 右侧 |
垂直切分(Vertical) |
|
下一个窗口出现在当前窗口的 下方 |
切换全屏 |
|
让当前窗口占满整个屏幕 |
改变窗口比例 |
|
进入调整大小模式,用方向键或 |
自动化布局脚本
可以使用 swaymsg 写一个简单的Shell脚本:
# 一个简单的自动化布局脚本示例
swaymsg "exec firefox; split horizontal"
sleep 1
swaymsg "exec foot; split vertical"
sleep 0.5
swaymsg "exec foot"
这个脚本命令可以组合成一个 $mod+shift+z 组合键来一次性自动布局好
# 一键启动特定布局:Firefox (左) + 2*Foot (右上下)
bindsym $mod+Shift+z exec swaymsg "workspace 1; \
exec firefox; \
split horizontal; \
exec foot; \
split vertical; \
exec foot"
不过,实践发现脚本布局是失败的: 当系统中已经启动过 firefox 和 foot ,再启动布局,总是一晃而过无法正确排版。
Google Gemini 提供了一个脚本,确保脚本只针对新启动的那个窗口进行操作:通过临时标记(Mark)来精准定位新窗口。
#!/bin/sh
# 1. 启动 Firefox 并立即给“下一个”出现的 Firefox 窗口打上标记 'target_web'
swaymsg "exec firefox"
# 循环等待,直到找到那个还没被标记的新 Firefox
while :; do
# 尝试寻找没有标记且 app_id 是 firefox 的窗口并打上标记
if swaymsg "[app_id=\"firefox\" con_mark=\"^$\"] mark --add target_web" 2>/dev/null; then
break
fi
sleep 0.2
done
# 2. 针对带标记的 Firefox 进行水平切分
swaymsg "[con_mark=\"target_web\"] focus; split horizontal"
# 3. 启动第一个 foot 并打标记 'term_top'
swaymsg "exec foot"
while :; do
if swaymsg "[app_id=\"foot\" con_mark=\"^$\"] mark --add term_top" 2>/dev/null; then
break
fi
sleep 0.1
done
# 4. 针对第一个 foot 进行垂直切分
swaymsg "[con_mark=\"term_top\"] focus; split vertical"
# 5. 启动最后一个 foot
swaymsg "exec foot"
# 可选:清理标记(如果你不希望窗口一直带着标签)
swaymsg "[con_mark=\"target_web\"] unmark"
swaymsg "[con_mark=\"term_top\"] unmark"
警告
以上脚本验证不成功,暂时没有时间折腾,先记录待后续排查