i3
i3 是一个受 wmii 启发的平铺窗口管理器,主要面向开发者和高级用户。
i3 的既定目标包括清晰的文档、适当的多显示器支持、窗口的树状结构以及类似 vim 中的不同模式。
安装
还有一个 i3 软件包组也可用。它包括窗口管理器、屏幕锁以及两个通过 stdout 将状态行写入 i3bar 的程序。
启动
从 tty 启动
使用 xinit 运行 i3
。
显示管理器
i3-wm 包括 i3.desktop
作为启动窗口管理器的 Xsession。i3-with-shmlog.desktop
启用日志记录(用于调试)。
i3-gnomeAUR 将 i3 集成到 GNOME 中 - 但底层的 i3-gnome 与 GNOME 45 不兼容,并且不再维护。
使用
键盘快捷键
在 i3 中,命令通过修饰键调用,称为 $mod
。默认情况下这是 Alt
(Mod1),Super
(Mod4) 也是一种流行的替代方案。Super 键通常在键盘上表示为 Windows 图标,或在 Apple 键盘上表示为 Command 键。
请参阅 i3 参考卡 和 使用 i3 了解默认设置。请参阅 键盘绑定 以添加新的快捷方式。
非 Qwerty 键盘布局的用户可能希望绕过如下所述的“配置向导”。
如果在多个窗口管理器或桌面环境之间切换,请考虑使用 sxhkd 或其他环境无关的程序来管理绑定。更多信息可以在键盘快捷键#Xorg 中找到。
容器和布局
i3 在树状结构中管理窗口,容器作为构建块。此结构以水平或垂直分割方式分支。容器默认平铺,但可以设置为标签式或堆叠式布局,以及浮动(例如用于对话框窗口)。浮动窗口始终位于顶部。
应用程序启动器
i3 使用 dmenu 作为应用程序启动器,默认绑定到 $mod+d
。由于它是可选依赖项,因此必须先安装 dmenu 才能使用此功能。
i3-wm 包含 i3-dmenu-desktop,它是 dmenu 的 Perl 包装器,它使用 桌面条目 来创建所有已安装应用程序的列表。或者,可以使用软件包 j4-dmenu-desktop-gitAUR。
rofi 是流行的 dmenu 替代品,功能更多,可以列出桌面条目。
KDE Plasma/i3 中使用 KRunner 作为应用程序启动器
可以在 KDE Plasma 旁边运行 i3,如此处所示: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
。它对默认模板进行两处修改
- 它要求用户选择一个默认修饰键,并将其作为单行添加到模板中,例如
set $mod Mod1
;以及 - 它将所有 bindcode 行替换为与用户当前键盘布局对应的 bindsym 行。
步骤 2 旨在确保 Qwerty 键盘上的四个导航快捷键 j
、k
、l
和 ;
将映射到具有相同位置的 keysym,例如 Dvorak 键盘上的 h
、t
、n
、s
。这种魔术的副作用是,最多可能有 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/config
的 bar{ }
部分或定义用于切换栏的按键绑定来禁用 i3bar
~/.config/i3/config
# bar toggle, hide or show bindsym $mod+m bar mode toggle
下面列出了独立于桌面环境的替代品
- polybar — 一个快速且易于使用的工具,用于创建状态栏。
- excalibar — 用 C 语言编写的轻量级但可自定义的状态栏。
i3status
将默认配置文件复制到主目录
$ cp /etc/i3status.conf ~/.config/i3status/config
并非所有插件都在默认配置中定义,并且某些配置值可能对您的系统无效,因此需要相应地更新它们。有关详细信息,请参阅 i3status(1)。
i3status 替代品
- bumblebee-status — 可主题化的 Python 状态栏生成器。
- goblocks — 用 Go 语言编写的快速、轻量级 i3status 替代品。
- goi3bar — 用 Go 语言编写的 i3status 替代品。配置文件驱动,具有多个插件、并发选项和丰富的插件支持。
- i3blocks — 可通过 shell 脚本扩展。它可以处理点击事件、中断和定义每个块的刷新间隔。
- i3pystatus — 默认情况下具有许多插件和配置选项的可扩展 Python 3 状态栏。
- i3status-rust — 用 Rust 编写的高效且功能丰富的替代品。可以处理推送更新、单独的更新间隔、主题和点击事件。
- j4status — 提供一个状态行,可通过插件配置,并用 C 语言编写。额外的插件由 j4status-plugins-gitAUR 提供。
- ty3status — 用 Typescript 编写的 i3status 替代品。构建时首先支持 javascript 块。
i3status 包装器
- i3cat — 一个基于 go 的包装器,可以连接来自多个外部源的输入。它可以处理点击事件并将用户指定的信号转发到其子进程。
- py3status — 用 Python 编写的可扩展 i3status 包装器。
- YaGoStatus — 另一个用 Go 语言编写的 i3status 替代品。
状态栏中的图标字体
- ttf-font-awesome — 可以使用 CSS 自定义的可缩放矢量图标。
- ttf-font-icons — Awesome 和 Ionicons 的非重叠且大小一致的混合。这也避免了 DejaVu Sans 和 Awesome 之间轻微的重叠。
- ttf-ionicons — Ionic Framework 的高级图标字体。
另请参阅 字体#表情符号和符号。
要组合字体,请在您的配置文件中定义字体回退序列,用 ,
分隔字体,如下所示
~/.config/i3/config
bar { ... font pango:DejaVu Sans Mono, Icons 8 ... }
根据 pango 语法,字体大小仅指定一次,在逗号分隔的字体系列列表的末尾。为每种字体设置大小将导致除最后一种字体之外的所有字体都被忽略。
使用上面链接的备忘单中给出的 unicode 编号,将图标添加到 ~/.config/i3status/config
中的格式字符串中。输入方法在文本编辑器之间有所不同。例如,要插入“心形”图标(unicode 编号 f004)
- 在各种 gui 文本编辑器(例如 gedit、Leafpad)和终端(例如 GNOME 终端、xfce4-terminal)中:
Ctrl+Shift+u
、f004
、Enter
- 在 Emacs 中:
C-x
、8
、RET
、f004
、RET
- 在 Vim 中(在插入模式下):
Ctrl+v
、uf004
- 在 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 中聚焦和选择窗口
- quickswitch-i3 — Python 实用程序,用于在 i3 中快速更改和定位窗口
- Rofi — 在窗口之间切换
- wmfocus — 聚焦和选择窗口
跳转到紧急窗口
添加到 ~/.config/i3/config
:[1]
bindsym $mod+x [urgent=latest] focus
保存和恢复窗口布局
从 4.8 版本开始,i3 可以保存和恢复工作区布局。为此,需要以下软件包:perl-anyevent-i3 和 perl-json-xs。
保存单个工作区的当前窗口布局
要保存当前窗口布局,请按照以下步骤操作
- 首先,执行各种命令以在首选工作区中打开窗口,并在需要时调整它们的大小。确保记下每个窗口执行的每个命令。
- 现在,在一个新的工作区中,打开一个终端并运行以下命令
$ i3-save-tree --workspace N > ~/.config/i3/workspace_N.json
其中 N 是首选工作区的编号。这会将工作区 N 的当前布局保存到文件~/.config/i3/workspace_N.json
。 - 新创建的文件需要编辑。可以使用以下命令自动完成此操作
$ 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.json
的 swallows 部分。暂存区容器
默认情况下,暂存区仅包含单个窗口。但是,容器也可以制作为暂存区。
创建一个新容器(例如,Mod+Enter
),分割它(Mod+v
)并创建另一个容器。聚焦父容器(Mod+a
),在相反方向分割(Mod+h
),然后再次创建一个容器。
聚焦第一个容器(根据需要使用聚焦父容器),使窗口浮动(Mod+Shift+Space
),并将其移动到暂存区(Mod+Shift+-
)。现在您可以根据需要分割容器。
另请参阅 [2] 以了解多个暂存区。
屏幕保护程序和电源管理
使用 电源管理#xss-lock,您可以为您的 i3 会话注册一个屏幕锁。带有 xautolock 的 -time
选项会在给定的时间段后锁定屏幕
xautolock -time 10 -locker "i3lock -i background_image.png" &
可以使用 systemd 服务文件在系统进入睡眠或休眠状态之前锁定屏幕。请参阅 电源管理/挂起和休眠#自定义 systemd 单元。请注意,i3lock 要求服务类型为 forking
。
另请参阅 DPMS。
另一种选择是使用 xidlehookAUR,配合 betterlockscreenAUR 或任何其他屏幕保护程序。xidlehook 是 xautolock 的替代品,用 Rust 编写,但具有一些额外的功能。这包括在播放音频或屏幕处于全屏状态时禁用锁定的选项。--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]
有关替代屏幕锁的列表,请参阅 应用程序列表/安全#屏幕锁。
吞噬终端窗口
与 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 用户指南 和/或 i3 FAQ on reddit。
平铺或堆叠式网页浏览
一些网络浏览器有意不实现标签页,因为管理标签页被认为是窗口管理器的任务,而不是浏览器的任务。
为了让 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-gitAUR 和 i3status-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
。
另请参阅
- 官方网站
- Funtoo:I3 平铺窗口管理器
- i3 源代码
- i3-extras - 脚本和补丁集合
- i3ipc-glib - 用于 i3 扩展的库
- i3ipc-ruby - 用于 Ruby 中 i3 扩展的改进库
- j4tools - 旨在与 i3 一起使用的非官方工具
- i3、i3status 在线配色方案配置器(非官方)
Arch Linux 论坛
- i3 线程 - 关于 i3 的一般讨论
- i3 桌面屏幕截图和配置共享
屏幕录像