herbstluftwm 的平铺层和浮动层是如何工作的?
herbstluftwm 的每个虚拟桌面(tag)同时包含一个平铺层和一个浮动层。平铺层的窗口自动填满屏幕空间,浮动层的窗口可以自由摆放在平铺窗口之上;两层窗口都能仅用键盘完成移动、缩放和聚焦。理解这套双层结构,是掌握 herbstluftwm 日常操作的关键。
双层结构:一个 tag,两种窗口
herbstluftwm 是面向 X 窗口系统的手动平铺窗口管理器。它把每个虚拟桌面称为 tag,而每个 tag 并不是单一布局,而是由两层叠加而成:
| 层 | 行为 | 空间占用 |
|---|---|---|
| 平铺层(tiling layer) | 窗口按分割结构自动排列,填满屏幕 | 占满整个屏幕空间 |
| 浮动层(floating layer) | 窗口自由放置、自由缩放 | 悬浮在平铺窗口之上 |
两层共存于同一个 tag 中,切换 tag 时两层一起切换。这意味着你不需要在“平铺模式”和“浮动模式”之间二选一,而是可以在同一桌面上同时使用两种窗口。
平铺层:frame 分割与填充
平铺层的排列不是由预设布局决定的,而是基于 frame 的递归分割:
- 屏幕空间被划分为 frame。
- 一个 frame 可以被分割成多个子 frame。
- 子 frame 可以继续被分割,也可以直接放入窗口。
- 放入窗口的 frame 由窗口填满。
因此,平铺布局本质上是一棵可随时修改的分割树。你决定在哪里分割、分割几次、每个末端 frame 放哪个窗口,窗口就自动填满对应区域。这种“手动”特性意味着布局由你的操作驱动,而不是由算法自动重排。
浮动层:自由摆放,叠加其上
浮动层的窗口不受 frame 结构约束,可以放在屏幕任意位置,也可以任意缩放。它们显示在平铺窗口之上,适合临时窗口、对话框或需要固定位置的程序。由于浮动窗口不参与平铺分割,它们不会挤占或改变平铺层的布局。
键盘操作:两层一致
平铺窗口和浮动窗口都可以仅用键盘完成以下操作:
- 移动
- 调整大小
- 聚焦
这一点对无鼠标环境或偏好全键盘操作的用户尤其重要——浮动窗口并不因为“自由”就必须依赖鼠标。
运行时配置:改动即时生效
herbstluftwm 的全部配置在运行时通过 herbstclient 工具完成。配置文件本身只是一个启动时运行的脚本。所有配置项、窗口规则、虚拟桌面、快捷键等都可以在不重启窗口管理器的情况下实时更新。例如,你可以随时调整某个 tag 的分割方式或窗口规则,改动立即反映在当前会话中。
虚拟显示器:把屏幕再切分
屏幕空间可以被自由划分为多个“monitor”,这些虚拟显示器不一定对应真实的(多)显示器硬件配置。例如,一台高分辨率显示器可以被拆成两个或更多虚拟显示器,从而同时查看两个虚拟桌面。所有显示器共享同一组 tag,并且可以用一次按键交换两个显示器的内容。
上手路径
如果你刚开始接触 herbstluftwm,官方建议从教程入手。doc/ 目录下提供了 herbstluftwm 和 herbstclient 的 manpage,也可以在线查看。获取方式包括通过包管理器安装、下载 tarball,或克隆 git 仓库:
git clone https://github.com/herbstluftwm/herbstluftwm
遇到问题时,可以加入 irc.libera.chat 上的 #herbstluftwm 频道,或访问 reddit 的 r/herbstluftwm 社区;bug 报告可通过 GitHub issue tracker 或邮件列表 [email protected] 提交。