i3
i3 是一个受 wmii 启发的平铺式窗口管理器,主要面向开发人员和高级用户。
i3 的既定目标包括清晰的文档、完善的多显示器支持、窗口的树状结构,以及像 vim 那样的不同模式。
安装
还有一个名为 i3 的包组。它包含了窗口管理器、一个屏幕锁以及两个通过 stdout 向 i3bar 写入状态行的程序。
启动
从 tty
使用 xinit 运行 i3。
显示管理器
i3-wm 包含 i3.desktop 作为 Xsession,它启动窗口管理器。i3-with-shmlog.desktop 启用日志(对于调试很有用)。
用法
键盘快捷键
在 i3 中,命令通过一个修饰键调用,称为 $mod。默认情况下它是 Alt (Mod1),而 Super (Mod4) 是一个流行的替代选项。Super 通常是键盘上代表 Windows 图标的键,或者在 Apple 键盘上是 Command 键。
有关默认设置,请参阅i3 参考卡和使用 i3。要添加新的快捷方式,请参阅键盘绑定。
非 Qwerty 键盘布局的用户可能希望如下文所述,绕过“配置向导”。
如果在多个窗口管理器或桌面环境之间切换,请考虑使用 sxhkd 或其他与环境无关的程序来管理绑定。更多信息可在 键盘快捷键#Xorg 中找到。
容器和布局
i3 以树状结构管理窗口,以容器为构建块。该结构通过水平或垂直分割进行分支。容器默认是平铺的,但可以设置为标签页式或堆叠式布局,也可以设置为浮动(例如用于对话框窗口)。浮动窗口始终置于最顶层。
有关详细信息,请参阅 i3 Tree 和 Containers and the tree data structure。
应用程序启动器
i3 使用 dmenu 作为应用程序启动器,默认绑定到 $mod+d。由于它是可选依赖项,因此在使用此功能之前必须先安装 dmenu。
i3-wm 包含 i3-dmenu-desktop,一个用于 dmenu 的 Perl 包装器,它使用 桌面条目 来创建已安装应用程序的列表。或者,也可以使用 j4-dmenu-desktop。
rofi 是一个流行的 dmenu 替代品,并且功能更强大,可以列出桌面条目。
KRunner 作为 KDE Plasma/i3 中的应用程序启动器
i3 可以与 KDE Plasma 并行运行,如在此处所示:KDE#使用不同的窗口管理器
当使用 KDEWM=/usr/bin/i3 运行 Plasma 时,可以通过将以下内容添加到 i3 配置中,将 KRunner 设置为 $mod+d 的替代应用程序启动器:
~/.config/i3/config
set $menu --no-startup-id qdbus6 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 行。
第二步旨在确保 Qwerty 键盘上的四个导航快捷键 j、k、l 和 ; 被映射到具有相同位置的键码,例如,在 Dvorak 键盘上是 h、t、n、s。这种魔法的副作用是,最多可能有十五个其他键码被重新映射,从而破坏了助记符 — 因此,对于 Dvorak 用户,“重启”绑定到 $mod1+p 而不是 $mod1+r,“水平分割”绑定到 $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,或者定义一个键绑定来切换 bar:
~/.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 编写。
- ty3status — 用 Typescript 编写的 i3status 替换项。内置对 JavaScript 块的一流支持。
i3status 包装器
- i3cat — 一个基于 Go 的包装器,可以连接来自多个外部源的输入。它可以处理点击事件并将用户指定的信号转发给其子进程。
- py3status — 一个用 Python 编写的可扩展 i3status 包装器。
- YaGoStatus — 用 Go 编写的另一个 i3status 替换项。
状态栏中的图标字体
- otf-font-awesome — 可用 CSS 定制的矢量图标。
- ttf-font-icons — 非重叠、尺寸一致的 Awesome 和 Ionicons 混合体。这还可以避免 DejaVu Sans 和 Awesome 之间的轻微重叠。
- ttf-ionicons — Ionic Framework 的高级图标字体。
另请参阅 Fonts#Emoji and symbols。
要在配置文件中组合字体,请定义一个字体回退序列,用 , 分隔字体,如下所示:
~/.config/i3/config
bar {
...
font pango:DejaVu Sans Mono, Icons 8
...
}
根据 pango 语法,字体大小只指定一次,位于逗号分隔的字体系列列表的末尾。为每种字体设置大小将导致除最后一个字体外的所有字体都被忽略。
在 ~/.config/i3status/config 的格式字符串中添加图标,使用上面链接的备忘单中给出的 Unicode 数字。输入法在不同文本编辑器之间会有所不同。例如,要插入“心形”图标(Unicode 数字 f004):
- 在各种 GUI 文本编辑器(例如 gedit、Leafpad)和终端(例如 GNOME Terminal、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 的选项卡而不是应用程序中的内容,这会很有用。
技巧与提示
跳转到已打开窗口
- i3ipc-python — 提供
/usr/share/doc/python-i3ipc/examples/i3-cycle-focus.py脚本,该脚本为 i3 实现Alt-Tab功能(有关详细信息,请参阅该脚本中的注释)。
- quickswitch-i3 — 用于在 i3 中快速切换和定位窗口的 Python 工具。
- Rofi — 在窗口之间切换
- wmfocus — 聚焦和选择窗口
跳转到紧急窗口
添加到 ~/.config/i3/config:[1]
bindsym $mod+x [urgent=latest] focus
保存和恢复窗口布局
i3-wm 提供了 i3-save-tree 脚本来保存和恢复工作区布局。要使用它,请安装其依赖项 perl-anyevent-i3。
保存单个工作区的当前窗口布局
要保存当前窗口布局,请按照以下步骤操作:
- 首先,执行各种命令在首选工作区中打开窗口,并在需要时调整它们的大小。确保记下每个窗口执行的每个命令。
- 现在,在新工作区中,打开一个终端并运行以下命令:
$ 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 是上一节中保存的工作区编号。
- 以及上一节中用于获取首选窗口的命令,但用括号括起来,并在最后一个括号前附加一个 ampersand。
例如,如果保存的布局包含三个 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] 关于多个暂存区。
屏幕保护程序和电源管理
通过 Power management#xss-lock,您可以为您的 i3 会话注册一个屏幕锁。xautolock 的 -time 选项会在给定时间段后锁定屏幕:
xautolock -time 10 -locker "i3lock -i background_image.png" &
可以使用 systemd 服务文件在系统进入睡眠或休眠状态之前锁定屏幕。请参阅 Power management/Suspend and hibernate#Custom systemd units。请注意,i3lock 需要服务类型为 forking。
另请参阅 DPMS。
另一个选择是使用 xidlehookAUR 和 betterlockscreenAUR 或任何其他屏幕保护程序。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]
有关备用屏幕锁定的列表,请参阅 List of applications/Security#Screen lockers。
吞并终端窗口
类似于 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
状态栏中的网络下载/上传速度
您可以使用此上游 脚本。如有必要,请更改 ifaces 变量,将脚本保存在合适的位置(例如 ~/.config/i3/),使其 可执行,然后将 status_command 指向它。
自动切换水平/垂直窗口分割方向
可以使用 autotiling 包自动切换水平/垂直窗口分割方向,从而产生类似于 bspwm 的螺旋平铺行为。安装后,将以下内容添加到您的 ~/.config/i3/config 文件中并重新加载 i3。
exec_always --no-startup-id autotiling
故障排除
常规
在许多情况下,bug 在开发版本 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 桌面截图和配置共享
屏幕录像