i3布局保存问题:程序无法填充save-tree创建的占位符
解决i3布局占位符自动捕获程序的问题
第一步:简化布局文件的捕获规则
你的JSON布局文件中,swallows字段的匹配条件过于严格(比如精确匹配窗口标题、特定机器名),这会导致程序启动后无法被占位符捕获。建议修改规则,只保留最稳定的匹配项:
修改后的Chrome占位符规则
{ "border": "normal", "current_border_width": 2, "floating": "auto_off", "geometry": { "height": 1028, "width": 1916, "x": 1932, "y": 34 }, "marks": [], "name": "Google Chrome", "percent": 0.6, "swallows": [ { "class": "^Google\\-chrome$", "instance": "^google\\-chrome$", "window_role": "^browser$" } ], "type": "con" }
- 移除了
machine和title字段:机器名仅适用于你的特定设备,而Chrome窗口标题会随标签页变化,这两个字段会干扰捕获。
修改后的Kitty占位符规则
{ "border": "normal", "current_border_width": 2, "floating": "auto_off", "geometry": { "height": 501, "width": 956, "x": 0, "y": 0 }, "marks": [], "name": "Kitty Terminal", "percent": 0.5, "swallows": [ { "class": "^kitty$", "instance": "^kitty$" } ], "type": "con" }
- 同样移除
machine和title字段:Kitty标题会随工作目录变化,无需精确匹配。
第二步:加载布局并启动程序
要让占位符生效,必须先加载布局文件,再启动程序。可以通过i3配置文件直接实现,或者编写shell脚本。
方法1:直接在i3配置文件中配置
将以下内容添加到你的~/.config/i3/config(或~/.i3/config)文件末尾:
# 加载工作区1的布局 exec --no-startup-id i3-msg "workspace 1; append_layout ~/.i3/layouts/workspace1.json" # 延迟启动程序,确保占位符已创建 exec --no-startup-id sleep 0.5 && google-chrome exec --no-startup-id sleep 0.5 && kitty exec --no-startup-id sleep 0.5 && kitty
sleep 0.5是必要的:给i3留出时间创建占位符容器,避免程序先启动导致无法被捕获。- 替换
~/.i3/layouts/workspace1.json为你实际的布局文件路径。
方法2:使用shell脚本
创建脚本~/.i3/scripts/load_workspace1.sh:
#!/bin/bash # 切换到工作区1并加载布局 i3-msg "workspace 1; append_layout ~/.i3/layouts/workspace1.json" # 等待占位符创建 sleep 0.5 # 启动程序 google-chrome & kitty & kitty &
然后给脚本添加执行权限:
chmod +x ~/.i3/scripts/load_workspace1.sh
最后在i3配置文件中添加:
exec --no-startup-id ~/.i3/scripts/load_workspace1.sh
验证效果
重启i3(按Mod+Shift+C重新加载配置,或Mod+Shift+R重启),检查程序是否自动填充到对应的占位符位置。如果仍不生效,可以尝试:
- 延长
sleep时间至1秒 - 使用
xprop命令查看程序的WM_CLASS和WM_WINDOW_ROLE,确保swallows中的正则匹配正确
内容的提问来源于stack exchange,提问作者AKJ
相关产品推荐
相关产品推荐

