herbstluftwm 的平铺层和浮动层是如何工作的?

herbstluftwm 的每个虚拟桌面(tag)同时包含一个平铺层和一个浮动层。平铺层的窗口自动填满屏幕空间,浮动层的窗口可以自由摆放在平铺窗口之上;两层窗口都能仅用键盘完成移动、缩放和聚焦。理解这套双层结构,是掌握 herbstluftwm 日常操作的关键。

双层结构:一个 tag,两种窗口

herbstluftwm 是面向 X 窗口系统的手动平铺窗口管理器。它把每个虚拟桌面称为 tag,而每个 tag 并不是单一布局,而是由两层叠加而成:

层 行为 空间占用
平铺层(tiling layer) 窗口按分割结构自动排列,填满屏幕 占满整个屏幕空间
浮动层(floating layer) 窗口自由放置、自由缩放 悬浮在平铺窗口之上

两层共存于同一个 tag 中,切换 tag 时两层一起切换。这意味着你不需要在“平铺模式”和“浮动模式”之间二选一,而是可以在同一桌面上同时使用两种窗口。

平铺层:frame 分割与填充

平铺层的排列不是由预设布局决定的,而是基于 frame 的递归分割:

  1. 屏幕空间被划分为 frame。
  2. 一个 frame 可以被分割成多个子 frame。
  3. 子 frame 可以继续被分割,也可以直接放入窗口。
  4. 放入窗口的 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] 提交。

herbstluftwm.org