GlazeWM窗口标题正则表达式:高级匹配与替换规则
你是否还在为Windows系统中窗口管理的混乱而烦恼?GlazeWM作为一款受i3和Polybar启发的Windows平铺窗口管理器(Tiling Window Manager,TWM),提供了强大的窗口标题匹配功能,让你能够通过正则表达式(Regular Expression, regex)精确控制窗口行为。本文将深入解析GlazeWM的窗口标题匹配机制,从基础语法到高级规则,帮助你打造个性化的窗口管理体验。
读完本文后,你将能够:
- 理解GlazeWM窗口标题匹配的核心原理
- 掌握正则表达式在窗口规则中的应用
- 实现基于标题的窗口自动分类与管理
- 解决复杂场景下的窗口识别问题
窗口标题匹配的工作原理
GlazeWM通过窗口规则(Window Rules)系统实现对窗口的自动管理,其中窗口标题匹配是核心功能之一。这一机制在packages/wm/src/user_config.rs中定义,主要通过MatchType枚举实现三种匹配模式:
#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
#[serde(untagged)]
pub enum MatchType {
Equals { equals: String }, // 精确匹配
Includes { includes: String }, // 包含匹配
Regex { regex: String }, // 正则表达式匹配
}
当系统检测到窗口标题变化时(通过packages/wm/src/common/events/handle_window_title_changed.rs中的事件处理器),GlazeWM会自动应用匹配的窗口规则:
pub fn handle_window_title_changed(
window: &Arc<Mutex<WindowContainer>>,
state: &Arc<Mutex<WmState>>,
config: &Arc<Mutex<UserConfig>>,
) -> anyhow::Result<()> {
// 处理窗口标题变化事件逻辑
}
匹配优先级与执行流程
GlazeWM的窗口匹配遵循特定的优先级规则,在packages/wm/src/user_config.rs的pending_window_rules函数中实现:
let is_process_match = match_config
.window_process
.as_ref()
.map(|match_type| match_type.is_match(&window_process))
.unwrap_or(true);
let is_class_match = match_config
.window_class
.as_ref()
.map(|match_type| match_type.is_match(&window_class))
.unwrap_or(true);
let is_title_match = match_config
.window_title
.as_ref()
.map(|match_type| match_type.is_match(&window_title))
.unwrap_or(true);
匹配流程采用"与"逻辑,只有进程名、窗口类和窗口标题同时匹配时,规则才会被应用。这意味着你可以组合多种条件实现精确匹配。
正则表达式基础语法
在GlazeWM中使用正则表达式匹配窗口标题前,需要掌握基本的正则语法。以下是Windows环境下常用的正则表达式元字符:
| 元字符 | 描述 | 示例 | 匹配结果 |
|---|---|---|---|
. | 匹配任意单个字符 | Win. | "Win1"、"WinA"、"Win " |
* | 匹配前一个元素零次或多次 | Win* | "W"、"Win"、"Winnn" |
+ | 匹配前一个元素一次或多次 | Win+ | "Win"、"Winn" |
? | 匹配前一个元素零次或一次 | Win? | "W"、"Win" |
| | 或运算 | Win|Lin | "Win"或"Lin" |
() | 分组 | (Win|Lin)dows | "Windows"或"Linux" |
[] | 字符集 | [Ww]in | "Win"或"win" |
[^] | 否定字符集 | [^0-9] | 非数字字符 |
^ | 行开始 | ^Notepad | 以"Notepad"开头的标题 |
$ | 行结束 | - Notepad$ | 以" - Notepad"结尾的标题 |
GlazeWM使用Rust的regex crate实现正则匹配,完整支持Unicode标准和Perl兼容正则表达式(PCRE)语法。
配置文件中的标题匹配规则
GlazeWM的窗口规则配置文件采用YAML格式,默认路径为~/.glzr/glazewm/config.yaml。以下是三种匹配类型的配置示例:
1. 精确匹配(Equals)
精确匹配要求窗口标题与指定字符串完全一致:
window_rules:
- commands:
- set_floating: { centered: true }
match:
- window_title: { equals: "Document - Notepad" }
on: [manage, title_change]
2. 包含匹配(Includes)
包含匹配只要窗口标题中包含指定子串即可:
window_rules:
- commands:
- move_to_workspace: { workspace: "2" }
match:
- window_title: { includes: "Visual Studio Code" }
on: [manage]
3. 正则表达式匹配(Regex)
正则表达式匹配提供最高灵活性,适用于动态变化的窗口标题:
window_rules:
- commands:
- set_tiling: {}
match:
- window_title: { regex: "^Terminal - .+@.+$" }
on: [manage, title_change]
上述正则表达式匹配所有格式为"Terminal - 用户名@主机名"的终端窗口标题。
高级正则表达式应用场景
动态标题窗口匹配
许多应用程序的窗口标题会动态变化,如浏览器标签页、文档编辑器等。以Chrome浏览器为例,其窗口标题格式通常为"页面标题 - Google Chrome"。要匹配所有Chrome窗口,可以使用:
window_title: { regex: ".* - Google Chrome$" }
这里的.*匹配任意字符序列,$确保标题以" - Google Chrome"结尾。
版本号和动态数字匹配
对于包含版本号或动态数字的窗口标题,可使用正则表达式的数字匹配功能:
# 匹配"Project v1.2.3 - Editor"、"Project v2.0 - Editor"等标题
window_title: { regex: "Project v\d+\.\d+(\.\d+)? - Editor" }
其中\d+匹配一个或多个数字,\.匹配点号,(\.\d+)?表示可选的修订版本号部分。
多条件组合匹配
GlazeWM支持同时匹配多个条件,实现更精确的窗口识别。例如,仅匹配Firefox浏览器中标题包含"GitHub"的窗口:
window_rules:
- commands:
- move_to_workspace: { workspace: "3" }
match:
- window_process: { equals: "firefox.exe" }
window_title: { regex: "GitHub - .+ - Mozilla Firefox" }
on: [manage]
常见问题与解决方案
特殊字符转义
窗口标题中的特殊字符(如.、*、?等)需要转义才能正确匹配。例如,要匹配"file.txt - Notepad",正确的正则表达式应为:
window_title: { regex: "file\.txt - Notepad" }
注意YAML文件中反斜杠本身也需要转义,因此实际配置应写为"file\\.txt - Notepad"。
区分大小写匹配
默认情况下,GlazeWM的正则表达式匹配是区分大小写的。要实现不区分大小写匹配,可以在正则表达式前添加(?i)标记:
# 同时匹配"Notepad"、"notepad"、"NOTEPAD"等
window_title: { regex: "(?i)notepad" }
调试匹配规则
如果窗口规则不生效,可以通过检查packages/wm/src/user_config.rs中的pending_window_rules函数来调试:
let window_title = window.native().title()?;
// 添加日志输出调试信息
log::debug!("Checking window title match: {}", window_title);
GlazeWM的日志系统会记录匹配过程,帮助你定位问题所在。
规则优先级与冲突解决
当多个窗口规则同时匹配一个窗口时,GlazeWM遵循以下优先级规则:
- 更具体的规则优先于更通用的规则
- 配置文件中后定义的规则优先于先定义的规则
run_once: true的规则只会执行一次,不会重复应用
为避免规则冲突,建议遵循以下最佳实践:
- 为特殊窗口定义具体规则,放置在配置文件末尾
- 为通用窗口定义通用规则,放置在配置文件开头
- 使用
run_once: true避免重复应用规则
总结与进阶学习
GlazeWM的窗口标题正则表达式匹配功能为Windows用户提供了强大的窗口管理工具。通过本文介绍的基础知识和高级技巧,你可以实现对各种复杂窗口标题的精确匹配与控制。
要进一步提升你的窗口管理技能,建议:
- 深入学习正则表达式语法,推荐参考Rust regex crate文档
- 研究GlazeWM源码中的窗口事件处理模块,了解标题变化事件的完整生命周期
- 探索社区共享的窗口规则配置,地址为https://gitcode.com/gh_mirrors/gla/glazewm
通过不断实践和优化你的正则表达式规则,你将能够打造一个真正个性化、高效的Windows工作环境。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



