自动将客户端放到指定工作区
要自动在特定工作区上显示特定窗口,你可以直接分配。
你可以使用任何标准来匹配窗口,请参阅 命令列表#命令条件。
assign
和 for_window <criteria> move to workspace
的区别在于
前者只会在应用程序映射窗口时执行(映射意味着实际将其显示在屏幕上)而后者将在符合指定条件的窗口将其属性更改为某些内容时执行。
因此,建议你尽可能匹配窗口类(和实例,如果合适)而不是窗口标题,因为某些应用程序首先创建它们的窗口,然后担心设置正确的标题。
例如 Vimperator 的 Firefox,
窗口启动时被命名为 Firefox,只有当 Vimperator 被加载时,标题才会改变。
由于 i3 会在应用程序映射窗口后立即获取标题,因此在这种情况下,你必须在 Firefox
上进行匹配。
另一个已知问题是 Spotify,它在映射窗口时不会设置类提示,这意味着你必须使用 for_window
规则将 Spotify 分配给特定的工作区。
最后,不支持使用 assign [tiling]
和 assign [floating]
。
你还可以指定一个窗口以显示在特定输出上。
你可以使用 RandR 名称(例如 VGA1
)或与当前聚焦的工作区(例如 left
和 down
)的输出相关的名称。
分配由 i3 按照它们在配置文件中出现的顺序进行处理。 第一次匹配窗口的分配规则直接生效,不考虑后面的分配。
语法:
assign <criteria> [→] [workspace] [number] <workspace>
assign <criteria> [→] output left|right|up|down|primary|<output>
例子:
# 将 URxvt 终端分配到第二个工作空间
assign [class="URxvt"] 2
# 相同但更精确(精确匹配而不是子字符串)
assign [class="^URxvt$"] 2
# 相同但有个漂亮的箭头 :)
assign [class="^URxvt$"] → 2
# 分配到已命名的工作空间
assign [class="^URxvt$"] → work
# 分配到第二个工作空间,不考虑名字
assign [class="^URxvt$"] → number 2
# 你也可以指定数字+名字。如果第二个工作空间存在的话
# assign will skip the text part.
assign [class="^URxvt$"] → number "2: work"
# 启动 urxvt -name irssi
assign [class="^URxvt$" instance="^irssi$"] → 3
# 将 URxvt 分配给当前的输出屏幕右侧
assign [class="^URxvt$"] → output right
# 将 URxvt 分配到主输出屏幕
assign [class="^URxvt$"] → output primary
请注意,你可能尚未配置主输出。为此,请运行:
xrandr --output <output> --primary
此外,箭头不是必需的,它看起来不错:-)。如果你决定使用它,它必须是一个 UTF-8 编码的箭头,而不是 -> 或类似的东西。
要获取类和实例,你可以使用 xprop
。单击窗口后,你将看到以下输出:
xprop:
WM_CLASS(STRING) = "irssi", "URxvt"
WM_CLASS 的第一部分是实例(本例中为“irssi”),第二部分是类(本例中为“URxvt”)。
如果你在分配时遇到任何问题,请务必先检查 i3 日志文件(请参阅 https://i3wm.org/docs/debugging.html)。它包括有关匹配过程的更多详细信息以及启动时窗口的实际类、实例和标题。
请注意,如果你只想在特定工作区上启动应用程序一次,但不想永久分配它的所有实例, 则可以在配置文件中使用 i3 的启动通知支持(请参阅 exec)通过以下方式:
在工作区 3 上启动 iceweasel(一次):
# 在工作区 3 上启动 iceweasel,然后切换回工作区 1
# (作为命令行工具,i3-msg 不支持启动通知,因此请使用 exec --no-startup-id。)
# (使用 i3 的 exec 命令启动 iceweasel 使 i3 创建一个启动通知上下文,如果没有它,iceweasel 窗口
# 不能匹配到启动命令的工作区。)
exec --no-startup-id i3-msg 'workspace 3; exec iceweasel; workspace 1'