i3

来自 ArchWiki
(重定向自 I3wm

i3 是一个受 wmii 启发的平铺窗口管理器,主要面向开发者和高级用户。

i3 的既定目标包括清晰的文档、适当的多显示器支持、窗口的树状结构以及类似 vim 中的不同模式。

安装

i3 可以通过 i3-wm 软件包安装

还提供 i3 软件包组。它包括窗口管理器、屏幕锁定器和两个通过 stdout 将状态行写入 i3bar 的程序。

注意: i3-gapsi3 的一个分支,具有间隙和其他功能 — 已合并到 i3-wm 中,因此不再可用。请改为安装 i3-wm 软件包。

启动

从 tty 启动

使用 xinit 运行 i3

显示管理器

i3-wm 包括作为 Xsessioni3.desktop,它会启动窗口管理器。i3-with-shmlog.desktop 启用日志(对调试很有用)。

i3-gnomeAURi3 集成到 GNOME 中 - 但底层的 i3-gnome 与 GNOME 45 不兼容,并且不再维护。

使用

有关更多信息,请参阅 官方文档,特别是 i3 用户指南

键盘快捷键

i3 中,命令通过修饰键调用,称为 $mod。默认情况下这是 Alt (Mod1),Super (Mod4) 是一种流行的替代方案。Super 键通常在键盘上表示为 Windows 图标,或者在 Apple 键盘上表示为 Command 键。

请参阅 i3 参考卡使用 i3 了解默认值。请参阅 键盘绑定 以添加新的快捷方式。

非 Qwerty 键盘布局的用户可能希望绕过“配置向导”,如下文 所述

如果在多个窗口管理器或桌面环境之间切换,请考虑使用 sxhkd 或其他环境无关的程序来管理绑定。更多信息可以在 键盘快捷键#Xorg 中找到。

容器和布局

i3 在树状结构中管理窗口,容器作为构建块。此结构通过水平或垂直分割分支。默认情况下容器是平铺的,但可以设置为标签式或堆叠式布局,以及设置为浮动(例如对话框窗口)。浮动窗口始终位于顶部。

有关详细信息,请参阅 i3 树容器和树数据结构

应用程序启动器

i3 使用 dmenu 作为应用程序启动器,默认绑定到 $mod+d。由于它是可选依赖项,因此必须先安装 dmenu 才能使用此功能。

i3-wm 包含 i3-dmenu-desktop,它是 dmenuPerl 封装器,它使用 桌面条目 来创建所有已安装应用程序的列表。或者,可以使用软件包 j4-dmenu-desktop-gitAUR

rofi 是一个流行的 dmenu 替代品,并且可以列出桌面条目。

KDE Plasma/i3 中使用 KRunner 作为应用程序启动器

可以像这里看到的那样,让 i3 与 KDE Plasma 一起运行:KDE#使用不同的窗口管理器

当使用 KDEWM=/usr/bin/i3 运行 Plasma 时,可以通过将以下内容添加到 i3 配置中,将 KRunner 设置为备用应用程序启动器,并使用 $mod+d 绑定:

~/.config/i3/config
set $menu --no-startup-id qdbus org.kde.krunner /App display
bindsym $mod+d exec $menu

配置

有关详细信息,请参阅 配置 i3。本文的其余部分假定 i3 配置文件位于 ~/.config/ 文件夹中。

配置向导和备用键盘布局

i3 首次启动时,它会提供运行配置向导 i3-config-wizard。此工具通过重写 /etc/i3/config.keycodes 中的模板配置文件来创建 ~/.config/i3/config。它对默认模板进行了两处修改:

  1. 它要求用户选择一个默认修饰键,并将其作为单行添加到模板中,例如 set $mod Mod1;以及
  2. 它将所有 bindcode 行替换为与用户当前键盘布局对应的 bindsym 行。

步骤 2 旨在确保 Qwerty 键盘上的四个导航快捷键 jkl; 将映射到具有相同位置的 keysym,例如 Dvorak 键盘上的 htns。这种魔法的副作用是,最多有 15 个其他 keysym 可能会以破坏助记符的方式重新映射 - 因此,对于 Dvorak 用户,“restart”绑定到 $mod1+p 而不是 $mod1+r,“split horizontally”绑定到 $mod1+d 而不是 $mod1+h,等等。

因此,希望获得与教程中给出的绑定相匹配的直接按键绑定的备用键盘布局用户,可能更喜欢绕过“配置向导”。这可以通过简单地将 /etc/i3/config 复制到 ~/.config/i3/config(或 ~/.i3/config)并编辑该文件来完成。

请注意,基于键码的配置也是可能的,例如,对于经常在键盘布局之间切换但希望 i3 绑定保持不变的用户。

自动启动

~/.config/i3/config 文件中添加 exec 命令以在启动时执行命令。例如:

exec terminator

使用 exec_always 命令将确保命令在 i3 重新启动时也运行。

或者,您可以使用 XDG Autostart 的专用实现。

i3bar

除了显示工作区信息外,i3bar 还可以充当 i3status 或替代品(例如下一节中提到的那些)的输入。例如:

~/.config/i3/config
bar {
    output            LVDS1
    status_command    i3status
    position          top
    mode              hide
    workspace_buttons yes
    tray_output       none

    font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1

    colors {
        background #000000
        statusline #ffffff

        focused_workspace  #ffffff #285577
        active_workspace   #ffffff #333333
        inactive_workspace #888888 #222222
        urgent_workspace   #ffffff #900000
    }
}

有关详细信息,请参阅 配置 i3bar

i3bar 替代品

一些用户可能更喜欢面板,例如传统 桌面环境 提供的面板。这可以在 i3 中通过在启动期间启动所选的面板应用程序来实现。

例如,要使用 Xfce 面板 (xfce4-panel),请在 ~/.config/i3/config 中的任意位置添加以下行:

exec --no-startup-id xfce4-panel --disable-wm-check

可以通过注释掉 ~/.config/i3/configbar{ } 部分,或定义一个按键绑定来切换工具栏,从而禁用 i3bar:

~/.config/i3/config
# bar toggle, hide or show
bindsym $mod+m bar mode toggle

下面列出了独立于桌面环境的替代品:

  • polybar — 一个快速且易于使用的工具,用于创建状态栏。
https://github.com/jaagr/polybar || polybar
  • excalibar — 轻量级但可自定义的 C 语言状态栏。
https://github.com/cylgom/excalibar || excalibar-gitAUR

i3status

将默认配置文件复制到主目录:

$ cp /etc/i3status.conf ~/.config/i3status/config

并非所有插件都在默认配置中定义,并且某些配置值可能对您的系统无效,因此需要相应地更新它们。有关详细信息,请参阅 i3status(1)

i3status 替代品

  • bumblebee-status — 可主题化的 Python 状态栏生成器。
https://github.com/tobi-wan-kenobi/bumblebee-status || bumblebee-statusAUR
  • conky — 高度可扩展的系统监视器。有关与 i3bar 一起使用的信息,请参阅 本教程
https://github.com/brndnmtthws/conky || conky
  • goblocks — 用 Go 编写的快速、轻量级的 i3status 替代品。
https://github.com/davidscholberg/goblocks || goblocksAUR
  • goi3bar — 用 Go 编写的 i3status 替代品。配置文件驱动,具有多个插件、并发选项和丰富的插件支持。
https://github.com/denbeigh2000/goi3bar/ || goi3bar-gitAUR
  • i3blocks — 可通过 shell 脚本扩展。它可以处理单击事件、中断以及定义每个块的刷新间隔。
https://github.com/vivien/i3blocks || i3blocks
  • i3pystatus — 可扩展的 Python 3 状态栏,默认情况下具有许多插件和配置选项。
https://github.com/enkore/i3pystatus || i3pystatus-gitAUR
  • i3status-rust — 用 Rust 编写的高效且功能丰富的替代品。可以处理推送更新、单独的更新间隔、主题和单击事件。
https://github.com/greshake/i3status-rust || i3status-rust
  • j4status — 提供一个状态行,可通过插件配置,并用 C 语言编写。额外的插件由 j4status-plugins-gitAUR[broken link: package not found] 提供。
https://sardemff7.github.io/j4status/ || j4status-gitAUR
  • ty3status — 用 Typescript 编写的 i3status 替代品。内置了对 javascript 块的一流支持。
https://github.com/mrkmg/ty3status || ty3status-gitAUR

i3status 封装器

  • i3cat — 一个基于 go 的封装器,可以连接来自多个外部源的输入。它可以处理单击事件并将用户指定的信号转发到其子进程。
https://vincent-petithory.github.io/i3cat/ || i3cat-gitAUR
  • py3status — 一个用 Python 编写的可扩展 i3status 封装器。
https://github.com/ultrabug/py3status || py3status
  • YaGoStatus — 另一个用 Go 编写的 i3status 替代品。
https://github.com/burik666/yagostatus || yagostatus-gitAUR

状态栏中的图标字体

本文或章节是与 字体#表情符号和符号 合并的候选对象。

注意: ttf-font-awesome、ttf-font-iconsttf-ionicons 只是符号(图标)字体的示例,它们与 i3 无关。(在 Talk:I3 中讨论)
  • ttf-font-awesome — 可以使用 CSS 自定义的可缩放矢量图标。
https://fontawesome.com/ || ttf-font-awesome
  • ttf-font-icons — Awesome 和 Ionicons 的非重叠且尺寸一致的混合体。这也避免了 DejaVu Sans 和 Awesome 之间的轻微重叠。
https://kageurufu.net/icons.pdf || ttf-font-iconsAUR
  • ttf-ionicons — Ionic Framework 的高级图标字体。
https://ionicframework.cn/docs/ionicons/ || ttf-ioniconsAUR

另请参阅 字体#表情符号和符号

要组合字体,请在配置文件中定义字体回退序列,用 , 分隔字体,如下所示:

~/.config/i3/config
bar {
  ...
  font pango:DejaVu Sans Mono, Icons 8
  ...
}

根据 pango 语法,字体大小仅在逗号分隔的字体系列列表的末尾指定一次。为每种字体设置大小将导致除最后一种字体之外的所有字体都被忽略。

使用上面链接的备忘单中给出的 unicode 数字,将图标添加到 ~/.config/i3status/config 中的格式字符串中。输入法在文本编辑器之间会有所不同。例如,要插入“心形”图标(unicode 数字 f004):

本文或章节是与 输入法 合并的候选对象。

注意: 应该在一个地方描述。(在 Talk:I3 中讨论)
  • 在各种 gui 文本编辑器(例如 gedit、Leafpad)和终端(例如 GNOME 终端、xfce4-终端)中:Ctrl+Shift+uf004Enter
  • Emacs 中:C-x8RETf004RET
  • Vim 中(在插入模式下):Ctrl+vuf004
  • urxvt 中:按住 Ctrl+Shift,键入 f004

终端模拟器

默认情况下,当按下 $mod+Enter 时,它会启动 i3-sensible-terminal,这是一个调用终端的脚本。有关终端的调用顺序,请参阅 i3-sensible-terminal(1)

要改为启动所选的终端,请修改 ~/.config/i3/config 中的此行:

bindsym $mod+Return exec i3-sensible-terminal

或者,设置 $TERMINAL 环境变量

禁用标题点击

添加 bindsym button1 nop 以在单击窗口标题栏时不会选择窗口。如果您的默认布局是标签式的,并且您经常错误地点击 i3 的标签而不是应用程序中的某些内容,这将非常有用。

技巧和窍门

跳转到已打开的窗口

  • i3-cycle-focus — 为 i3 提供 Alt-Tab 功能
https://github.com/acrisci/i3ipc-python/blob/master/examples/i3-cycle-focus.py || i3ipc-python-gitAUR
  • i3-easyfocus — 在 i3 中聚焦和选择窗口
https://github.com/cornerman/i3-easyfocus || i3-easyfocus-gitAUR[broken link: package not found]
  • quickswitch-i3 — 用于在 i3 中快速更改和定位窗口的 Python 实用程序
https://github.com/OliverUv/quickswitch-for-i3/ || quickswitch-i3AUR
  • Rofi — 在窗口之间切换
https://github.com/davatorium/rofi?tab=readme-ov-file#modes || rofi
  • wmfocus — 聚焦和选择窗口
https://github.com/svenstaro/wmfocus || wmfocus

跳转到紧急窗口

添加到 ~/.config/i3/config[1]

bindsym $mod+x [urgent=latest] focus

保存和恢复窗口布局

从 4.8 版本开始,i3 可以保存和恢复工作区布局。为此,需要以下软件包:perl-anyevent-i3perl-json-xs

注意: 本节仅提供有关如何保存单个工作区的当前窗口布局以及如何恢复以供以后使用的快速教程。有关更多详细信息,请参阅 官方文档

保存单个工作区的当前窗口布局

要保存当前窗口布局,请按照以下步骤操作:

  1. 首先,执行各种命令以在首选工作区中打开窗口,并在需要时调整其大小。确保记下每个窗口执行的每个命令。
  2. 现在,在一个新的工作区中,打开一个终端并运行以下命令:
    $ i3-save-tree --workspace N > ~/.config/i3/workspace_N.json
    其中 N 是首选工作区的编号。这会将工作区 N 的当前布局保存到文件 ~/.config/i3/workspace_N.json
  3. 新创建的文件需要编辑。可以使用以下命令自动完成此操作:
    $ sed -i 's|^\(\s*\)// "|\1"|g; /^\s*\/\//d' ~/.config/i3/workspace_N.json

恢复工作区的窗口布局

有两种方法可以恢复工作区的布局:编写脚本,或编辑 ~/.config/i3/config 以自动加载布局。在本节中,仅考虑第一种情况,有关第二种情况,请参阅 官方文档

要恢复上一节中保存的布局,请编写一个名为 load_layout.sh 的文件,其内容如下:

  • 起始行:
~/load_layout.sh
#!/bin/sh
i3-msg "workspace --no-auto-back-and-forth M; append_layout ~/.config/i3/workspace_N.json"

其中 M 是您想要在其中加载先前保存的布局的工作区编号,N 是在上一节中保存的工作区编号。

  • 以及上一节中用于获取首选窗口的命令,但用括号括起来,并在最后一个括号前附加一个 & 符号。

例如,如果保存的布局包含三个 uxterm 窗口:

~/load_layout.sh
#!/bin/sh

# First we append the saved layout of workspace N to workspace M
i3-msg "workspace --no-auto-back-and-forth M; append_layout ~/.config/i3/workspace_N.json"

# And finally we fill the containers with the programs they had
(uxterm &)
(uxterm &)
(uxterm &)

然后将文件设置为可执行。最后,可以通过运行以下命令将工作区 N 的布局加载到工作区 M 上:

$ ~/load_layout.sh
提示:bindsym $mod+g exec ~/load_layout.sh 添加到 ~/.config/i3/config 并重启 i3 会将 Mod+g 绑定到运行上述脚本。
注意: 如果上述脚本无法正常工作,请参阅 官方文档~/.config/i3/workspace_N.jsonswallows 部分需要手动编辑。

暂存区容器

默认情况下,暂存区仅包含单个窗口。但是,容器也可以设置为暂存区。

创建一个新容器(例如,Mod+Enter),分割它(Mod+v)并创建另一个容器。聚焦父容器(Mod+a),在相反方向分割(Mod+h),然后再次创建一个容器。

聚焦第一个容器(根据需要使用聚焦父容器),使窗口浮动(Mod+Shift+Space),然后将其移动到暂存区(Mod+Shift+-)。现在您可以根据喜好分割容器。

注意: 容器无法在浮动窗口中单独调整大小。在使窗口浮动之前调整容器的大小。
提示: 当仅使用终端应用程序时,请考虑使用多路复用器(例如 tmux)代替。

另请参阅 [2] 了解多个暂存区。

屏幕保护程序和电源管理

使用 电源管理#xss-lock,您可以为您的 i3 会话注册一个屏幕锁定器。带有 xautolock-time 选项会在给定的时间段后锁定屏幕:

xautolock -time 10 -locker "i3lock -i background_image.png" &

一个 systemd 服务文件可用于在系统进入睡眠或休眠状态之前锁定屏幕。请参阅 电源管理/挂起和休眠#自定义 systemd 单元。请注意,i3lock 要求服务类型为 forking

另请参阅 DPMS

另一种选择是将 xidlehookAURbetterlockscreenAUR 或任何其他屏幕保护程序一起使用。xidlehook 是用 Rust 编写的 xautolock 替代品,但具有一些额外的功能。这包括在播放音频或屏幕处于全屏状态时禁用锁定的选项。--timer 选项以秒为单位给出:

xidlehook --not-when-audio --not-when-fullscreen --timer 360 "betterlockscreen -l dim" "" &

关闭、重启、锁屏

可以将关闭、重启和锁屏的快捷键组合添加到 ~/.config/i3/config。以下示例假设您已安装 polkit 以允许非特权用户运行 电源管理 命令。

set $Locker i3lock && sleep 1

set $mode_system System (l) lock, (e) logout, (s) suspend, (h) hibernate, (r) reboot, (Shift+s) shutdown
mode "$mode_system" {
    bindsym l exec --no-startup-id $Locker, mode "default"
    bindsym e exec --no-startup-id i3-msg exit, mode "default"
    bindsym s exec --no-startup-id $Locker && systemctl suspend, mode "default"
    bindsym h exec --no-startup-id $Locker && systemctl hibernate, mode "default"
    bindsym r exec --no-startup-id systemctl reboot, mode "default"
    bindsym Shift+s exec --no-startup-id systemctl poweroff -i, mode "default"

    # back to normal: Enter or Escape
    bindsym Return mode "default"
    bindsym Escape mode "default"
}

bindsym $mod+Pause mode "$mode_system"

完成后,每当您按下 $mod+pause 时,系统都会提示您。 для 实现更复杂的行为,请使用单独的脚本,并在模式中引用它。 [3]

注意
  • sleep 1 添加了少量延迟,以防止可能与挂起相关的竞争条件 [4]
  • systemctl poweroff-i 参数会导致关机,即使其他用户已登录(这需要 polkit),或者当 logind (错误地)认为如此时。 [5]

有关备选屏幕锁屏程序的列表,请参阅 应用程序列表/安全#屏幕锁屏程序

吞噬终端窗口

类似于 dwm,i3 可以“吞噬”当前终端窗口以及从中启动的新 GUI 窗口。这可以通过使用 i3-swallow-gitAUR 软件包来完成。

例如,要让 mpv 的窗口吞噬原始终端

$ swallow mpv video.mp4

或者,可以通过使用 选项卡式或堆叠式容器 来模拟终端吞噬,以便在不使用终端窗口时隐藏它。但是,这样做会带来始终在容器顶部显示窗口列表的缺点。

外部显示器手动管理

感谢 xrandr,有很多方法可以轻松管理系统显示器。以下示例将其集成到 i3 配置文件中,其行为与上面的电源管理部分类似。

此处,配备 VGA 和 HDMI 输出的笔记本电脑将使用菜单选择来切换它们的开/关状态

## Manual management of external displays
# Set the shortcuts and what they do
set $mode_display Ext Screen (v) VGA ON, (h) HDMI ON, (x) VGA OFF, (y) HDMI OFF
mode "$mode_display" {
    bindsym v exec --no-startup-id xrandr --output VGA1 --auto --right-of LVDS1, mode "default"
    bindsym h exec --no-startup-id xrandr --output HDMI1 --auto --right-of LVDS1, mode "default"
    bindsym x exec --no-startup-id xrandr --output VGA1 --auto --off, mode "default"
    bindsym y exec --no-startup-id xrandr --output HDMI1 --auto --off, mode "default"

    # back to normal: Enter or Escape
    bindsym Return mode "default"
    bindsym Escape mode "default"
}
# Declare here the shortcut to bring the display selection menu
bindsym $mod+x mode "$mode_display"

任何在切换为关闭状态的显示器中仍然打开的窗口都将自动返回到剩余的活动显示器。

确定设备名称的最简单方法是插入您希望使用的设备并运行

$ xrandr --query

这将输出可用的、已识别的设备及其系统内名称,以便您适当地设置配置文件。

有关可用选项的完整列表,请参阅 xrandr 页面或 xrandr(1),以及 i3 用户指南 和/或 reddit 上的 i3 FAQ 以获取更多信息。

选项卡式或堆叠式网页浏览

一些网络浏览器有意不实现选项卡,因为管理选项卡被认为是窗口管理器的任务,而不是浏览器的任务。

为了让 i3 管理您的无选项卡网络浏览器,在本例中以 uzbl 为例,将以下行添加到您的 ~/.config/i3/config

for_window [class="Uzbl-core"] focus child, layout stacking, focus

这是用于堆叠式网页浏览,意味着窗口将垂直显示。选项卡式浏览的优势在于,即使打开了很多浏览器窗口,窗口标题也完全可见。

如果您更喜欢选项卡式浏览,窗口水平排列(“选项卡”),请使用

for_window [class="Uzbl-core"] focus child, layout tabbed, focus

工作区变量

由于工作区在 i3 中被多次定义,因此分配工作区变量可能会有所帮助。例如

set $WS1 term
set $WS2 web
set $WS3 misc
set $WS4 media
set $WS5 code

然后将工作区名称替换为与其匹配的变量

bindsym $mod+1          workspace $WS1
...
bindsym $mod+Shift+1    move container to workspace $WS1

有关更多信息,请参阅 更改命名工作区

正确处理浮动对话框

虽然对话框默认应以浮动模式打开 [6],但许多对话框仍然以平铺模式打开。要更改此行为,请使用 xorg-xprop 检查对话框的 WM_WINDOW_ROLE,并将正确的规则添加到 ~/.i3/config (使用 pcre 语法)

for_window [window_role="About"] floating enable
for_window [window_role="Organizer"] floating enable
for_window [window_role="Preferences"] floating enable
for_window [window_role="bubble"] floating enable
for_window [window_role="page-info"] floating enable
for_window [window_role="pop-up"] floating enable
for_window [window_role="task_dialog"] floating enable
for_window [window_role="toolbox"] floating enable
for_window [window_role="webconsole"] floating enable
for_window [window_type="dialog"] floating enable
for_window [window_type="menu"] floating enable

您还可以使用标题规则和正则表达式

for_window [title="Preferences$"] floating enable

WM_CLASS

for_window [class="(?i)mplayer"] floating enable

状态栏中的网络下载/上传速度

您可以调整此上游 脚本。为此,

  • 根据您的系统重命名两个网卡(使用 ip addr
  • /sys/devices 上找到它们,然后适当地替换它们
$ find /sys/devices -name network_interface
提示: 使用 /sys/class/net/interface/statistics/ 以不依赖 PCI 位置。

现在,只需将脚本保存在合适的位置(例如 ~/.config/i3),并将您的状态程序指向它。

自动切换水平/垂直窗口分割方向

autotiling 软件包可用于自动切换水平/垂直窗口分割方向,从而产生类似于 bspwm 螺旋平铺的行为。安装后,将以下内容添加到您的 ~/.config/i3/config 并重新加载 i3。

exec_always --no-startup-id autotiling

故障排除

通用

在许多情况下,错误已在开发版本 i3-gitAURi3status-gitAUR 中修复,并且上游会要求使用此版本重现任何错误。 [7] 另请参阅 调试/获取跟踪#编译选项

i3 消息栏中的按钮不起作用

i3-nagbar 中的“编辑配置”等按钮调用 i3-sensible-terminal,因此请确保您的 终端模拟器 已被 i3 识别。

平铺终端中错误的换行

i3 v4.3 及更高版本忽略平铺窗口的大小增量提示 [8]。这可能会导致终端过早换行,以及其他问题。作为一种解决方法,在再次平铺之前,使有问题的窗口浮动。

鼠标光标保持等待模式

当启动不支持启动通知的脚本或应用程序时,鼠标光标将保持繁忙/观看/时钟模式 60 秒。

要为特定应用程序解决此问题,请使用 --no-startup-id 参数,例如

exec --no-startup-id ~/script
bindsym $mod+d exec --no-startup-id dmenu_run

要全局禁用此动画,请参阅 光标主题#创建指向缺失光标的链接

无响应的按键绑定

某些工具(例如 scrot)在与常规按键绑定(在按键后执行)一起使用时可能无法正常工作。在这些情况下,使用 --release 参数在按键释放后执行命令 [9]

bindsym --release Print exec --no-startup-id scrot
bindsym --release Shift+Print exec --no-startup-id scrot -s

画面撕裂

i3 没有正确实现双缓冲 [10],因此可能会发生画面撕裂或闪烁。请参阅 picom,或 modesetting 驱动程序的 TearFree 选项

托盘图标不可见

tray_output primary 指令可能需要使用 xrandr 设置主输出,显式指定输出,或者干脆删除此指令。 [11] 有关详细信息,请参阅 Xrandr。由 i3-config-wizard 创建的默认配置不再从 i3 4.12 开始将此指令添加到配置中。

Spotify 的默认工作区

要为 spotify 窗口分配默认工作区,不能使用带有 assign 的标准路由,而应使用 for_window 命令,例如

~/.config/i3/config
...
for_window [class="Spotify"] move container to workspace $ws10

为确保 for_window 在窗口已在 $ws10 中时不移动窗口,可以改为使用 move --no-auto-back-and-forth

另请参阅

Arch Linux 论坛

屏幕录像