OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 052

Hyprland 特殊工作区:给窗口一只抽屉

把切换、启动和窗口匹配分开,完整配置多组命名特殊工作区。

所在专题Linux 桌面:协议、窗口与定制 ↗
约 6 分钟阅读开始阅读

特殊工作区可以像抽屉一样,在当前普通工作区上方显示或收起一组窗口。它不是暂停进程、权限隔离或另一套桌面会话:隐藏之后,应用仍然运行。

本篇根据 Ed 的特殊工作区教程重新整理,去除网页导航与个人信息,并以 Hyprland 0.54 的版本化文档校对旧式 Hyprlang 示例。上游后续配置接口会变化,使用其他版本时先核对对应版本文档,不混用 Lua 配置和这里的 Hyprlang 语法。

先给抽屉一个名字,再绑定显示动作#

命名使多个特殊工作区彼此独立。快捷键触发 togglespecialworkspace,其参数是名称本身,不加 special: 前缀。

# Hyprland 0.54 / Hyprlang 示例
bind = ALT, X, togglespecialworkspace, chat
bind = ALT, E, togglespecialworkspace, mail
bind = ALT, B, togglespecialworkspace, notes
bind = ALT, T, togglespecialworkspace, tasks
bind = ALT, P, togglespecialworkspace, gallery
bind = ALT, V, togglespecialworkspace, media

动作依次包含修饰键、按键、dispatcher 和目标名称。名字只是标签,不会自动启动同名程序。空工作区被打开时看不到窗口,并不表示快捷键失效。

原剪藏声称数量无限,这是不准确的;0.54 文档给出的同时存在上限为 97。通常只应为有实际用途的窗口组建立固定入口。

把已有窗口送入指定工作区#

显示/隐藏与移动窗口是两种动作。移动命令接受一般工作区,因此目标要写成 special:名称。

bind = SUPER SHIFT, S, movetoworkspace, special:notes
bind = SUPER, S, togglespecialworkspace, notes

前一条作用于当前窗口,后一条显示或隐藏 notes。需要静默移动时核对该版本的 movetoworkspacesilent。多显示器环境也要观察工作区出现在哪个输出,避免把“窗口移动”和“当前焦点改变”混成一件事。

会话启动时,把应用放进去#

exec-once 负责启动命令;执行规则给新窗口指定目标工作区。以下应用仅作通用示例,需要对应可执行文件已安装。

exec-once = [workspace special:chat silent] ferdium
exec-once = [workspace special:notes silent] logseq
exec-once = [workspace special:mail silent] betterbird
exec-once = [workspace special:tasks silent] com.todoist.Todoist
exec-once = [workspace special:gallery silent] allusion
exec-once = [workspace special:media silent] youtube-music

silent 旨在不把当前视图立即切过去。exec-once 在会话启动时执行,不会因为普通配置重载就再次执行;验证窗口规则无需重启整台机器,可以手动启动一个测试实例并检查归属。

这条机制依赖启动进程与窗口的关联。如果命令转交给已经运行的单实例进程,或者经过包装与派生进程,执行规则未必能抓住最终窗口。因此还需要下一层基于窗口属性的规则。

用窗口规则覆盖以后重新打开的实例#

先读取真实窗口属性,而不是把程序文件名猜成窗口 class。xprop 只适用于 X11 / XWayland 窗口;原生 Wayland 窗口应使用合成器提供的信息。

hyprctl version
hyprctl clients
hyprctl -j clients

以下按 0.54 的窗口规则格式示意:

windowrule {
  name = notes-special
  match:class = ^(Logseq)$
  workspace = special:notes silent
}

windowrule {
  name = mail-special
  match:class = ^(betterbird)$
  workspace = special:mail silent
}

程序名、class、initialClass、窗口 title 的用途不同。用现场输出确认大小写和匹配对象;对话框是否也被规则捕获,需要单独检查。旧教程的 windowrule = workspace ..., ^(...)$ 不能不加版本判断直接复制进新配置。

分三步验证,不把问题堆到一起#

  1. 先只测试快捷键能否打开和收起空工作区。
  2. 手动把一个窗口送入工作区,确认显示动作和移动动作的目标名称相同。
  3. 最后加入自动启动和窗口规则,关闭并重新打开测试程序,检查新窗口是否仍进入目标。

如果只有自动启动正确、以后重开失败,优先检查窗口规则;如果规则完全无效,先检查实际 class 和版本语法。隐藏的窗口仍消耗资源,是否常驻应由用途决定。删除规则前可把窗口移回普通工作区,再清理对应快捷键和启动项。

参考与延伸

  1. Ed:原始特殊工作区教程 ↗
  2. Hyprland 0.54 Dispatchers ↗
  3. Hyprland 0.54 Window Rules ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Linux 桌面:协议、窗口与定制

  1. 01一个候选框,经过了哪些层?
  2. 02Hyprland 特殊工作区:给窗口一只抽屉
  3. 03Plasma 5:桌面定制的历史配置笔记
  4. 04Plasma 6:从 X11 习惯迁移到 Wayland
CONTINUE READING / 下一篇Plasma 5:桌面定制的历史配置笔记

保留原文配置与工具线索,明确旧版本故障、会话差异和插件兼容范围。