i3 (简体中文)
i3 是一种动态的平铺式窗口管理器,其灵感来自于面向开发者与资深用户的 wmii。
i3 的既定目标包括清晰可读的文档,完善的多显示器支持,基于树形结构的窗口管理,提供 vim 式的多种操作模式。
安装
通过安装i3-wm软件包来安装i3.
也可以安装i3软件包组。它包括了窗口管理器, 一个锁屏器和两个生成状态栏并通过stdout与i3bar交互的程序。
启动
从tty启动
使用 xinit (简体中文)来启动i3
从显示管理器启动
i3-wm 软件包包括了 i3.desktop
,可以支持将 i3 作为 Xsession 启动。i3-with-shmlog.desktop
这个入口则附加了日志功能(对于调试很有用)。i3-gnomeAUR软件包则把 i3-wm
集成到了 GNOME 中去。
使用
通过官方文档 获取全面的信息,基本使用方法见i3 User's Guide。
键盘映射
在 i3 里,一切命令均以「修饰键」开头,即 $mod
. 默认上来说是 Alt 键 alt
(Mod1),但开始键 Super
(Mod4) 也更为广泛接受。Super 键往往带有 Windows 图标,在苹果键盘上则是 Command 键。
见 i3 偏好 和 Using i3 以获取默认映射表。见 Keyboard 绑定 以获取添加新快捷键的说明。
非Qwerty键盘布局的用户可能会希望跳过 以下所说的“配置助手”。
如果在多个窗口管理器之间切换,可以考虑使用sxhkd或者其它environment agnostic程序来管理键盘映射。更多信息可在Keyboard shortcuts#Xorg中找到。
容器和布局
i3 以树形结构的方式管理窗口,容器是最小的单位。这种结构可以被水平或竖式分割。容器默认是平铺的,但也可以设置为标签或堆叠式布局。它同样也能设置为浮动式(适用于对话窗口)。浮动的窗口总是显示在顶部。
参见 i3 Tree 和 Containers and the tree data structure 以了解更多信息。
程序启动器
i3 使用 dmenu 作为首席程序启动器,键绑定默认为 $Mod+d
。在使用它之前必须先安装可选依赖 dmenu
i3-wm 包含了 i3-dmenu-desktop ——— 一个 "dmenu" 的Perl 包装器,它通过Desktop entries (简体中文)创建一个已安装应用的列表。 也可以使用j4-dmenu-desktop-gitAUR 作为替代。
rofi 是一个流行的dmenu替代品,它能列出更多的选项。
在KDE Plasma/i3中使用KRunner作为应用启动器
在KDE Plasma中使用i3也是可行的,参见 KDE (简体中文)#使用其他窗口管理器
当通过 KDEWM=/usr/bin/i3
运行Plasma时, 你可以添加以下内容到i3的config配置中将$mod+d
绑定到KRunner上来替代dmenu作为程序启动器:
~/.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
; 然后 - 它会用用户设置的键盘布局相应的 bindsyn 行替换所有 bindcode 行。
第二步是设计用于确保 Qwerty 键盘上的四个导航键 j
, k
, l
和 "分号" on a Qwerty keyboard会被映射在拥有相同位置的按键上,举例说,Dvorak 键盘上的 h
, t
, n
, s
。这个小戏法的副作用是 最多十五个按键会被以一种破话位置记忆的方式被映射 - 所以,对于 Dvorak 用户, “重启”被绑定于 $mod1+p
而不是 $mod1+r
,“竖直分割”被绑定于 $mod1+d
而不是 $mod1+h
,类似的还有更多。
因此,其他键盘布局的用户若是想要直截了当的,符合教程中给出的按键绑定的键盘绑定,可能更倾向于不去使用 "config wizard" 。这可以拷贝 /etc/i3/config
到 ~/.config/i3/config
(或 ~/.i3/config
),然后编辑此文件。
注意,用户也可以建立一份以键码为基础的配置。例如,对于那些经常切换键盘布局,但是想要 i3 的键盘绑定保持相同的用户。
自启动程序
添加一行 exec
命令到 ~/.config/i3/config
文件中。
例如:
exec terminator
你也可以使用 XDG Autostart来设置自启动程序。
颜色主题
配置文件允许用户自定义窗口装饰颜色, 但配置文件的语法使创建或共享主题不切实际。有几个方案使这更容易, 包括各种用户贡献的主题。
- j4-make-config — 合并配置与主题或个人配置部件, 例如本机特定的配置, 这允许快速更改主题和灵活、动态地自定义配置
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
i3bar 可以通过注释掉 ~/.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可选方案
- i3blocks — 通过 shell 脚本扩展。 它可以处理点击事件,中断,和定义或更在块的基础上更新间隔。
- i3pystatus — 默认带有许多插件和选项的可扩展 Python 3 状态栏
- https://github.com/enkore/i3pystatus i3pystatus || i3pystatus-gitAUR
- i3situation — 另一个 Python 3 状态栏生成器。
- https://github.com/HarveyHunt/i3situation || i3situation-gitAUR[损坏的链接:package not found]
- j4status — 提供了状态栏,可以通过插件扩展,且是用 C 写成的。额外的插件来自j4status-plugins-gitAUR.
- goi3bar — Go语言 写的 i3status 替代品。配置文件同时还有各种插件,并发选项和丰富的插件支持。
- goblocks — Go语言 写的轻便快速的 i3status 替代品。
- bumblebee-status — 多主题的Python状态栏生成器。
- ty3status — Typescript编写的 i3status 替代品,
- i3status-rust — 使用Rust编写的高效并且特性丰富的i3status替代品。能够处理push更新, 单独设置更新间隔, 支持主题和点击事件
i3status 包装器
- i3cat — 基于go语言做的包装器,它可以链接来自多个资源的输入,也可以处理鼠标操作来转发用户特定的信号到子程序。
- py3status — 一个可扩展的基于Python的 i3status 包装器。
- YaGoStatus — Go编写的另一个i3status替代品。.
状态栏中的图标字体
安装 i3-wm-iconpatchAUR来让状态栏支持图标。你也可以使用下面的图标字体。
- ttf-font-awesome — 可以通过 CSS定制的可缩放矩阵字体。[1]显示了每个图像的 Unicode 值。
- ttf-font-icons — 也提供了全面的图像字符,包括彼此毫无重叠的 Awesome 和 Ionicons, 也很好地避免了 Awesome 与 DejaVu Sans 的微秒重叠。
- ttf-ionicons — Ionic Framework的独特图标
要配合这些字体使用,在配置文件中一种字体属性的后缀用,
分割字体。示例:
~/.config/i3/config
bar { ... font pango:DejaVu Sans Mono, Icons 8 ... }
依照 pango语法, 在逗号分割的多个字体的后面,字体大小只被设置一次,对每个字体都设置大小将会造成除了最后一个字体以外,其他的字体都被忽略。
在~/.config/i3status/config
中使用unicode数字添加图标。输入法将会在文本处理器间有所区分。 例如,插入心型图标(unicode 数字 f004):
- 在多个图形化的文本处理器(如 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+Return
会运行 i3-sensible-terminal
这个查找终端模拟器程序的脚本.参见i3-sensible-terminal(1)了解它查找终端模拟器的顺序。
要想立即启动自定义的终端模拟器, 编辑~/.config/i3/config
中的这一行:
bindsym $mod+Return exec i3-sensible-terminal
也可以通过设置 $TERMINAL
environment variable达到同样效果.
禁用标题栏点击动作
添加 bindsym button1 nop
来禁止i3选中你点击的标题栏对应的窗口。当你的默认布局是标签式并且经常不小心误点到窗口标签时比较有用。
技巧与提示
跳转到打开的窗口
- quickswitch-i3 — 一个可在 i3 的窗口之间快速跳转,定位的 Python 实现
- i3-wm-scripts — 用正则表达式在窗口之间进行搜索并跳转
- winmenupy — 启动 dmenu 时就会依次列出工作空间上的一系列客户端,选定其中一个并跳转即可
- rofi — Search and jump to open and scratchpad window
- i3-easyfocus — Focus and select windows in i3
- wmfocus — Focus and select windows in i3 and other window managers
- i3-cycle-focus — Provides an Alt-Tab functionality for i3
- i3-winmotion — Focus and select visible windows in i3
跳转到急需处理的窗口
添加这行到 ~/.config/i3/config
: [2]
bindsym $mod+x [urgent=latest] focus
保存和恢复窗口布局
从4.8版本起, i3能够保存和恢复工作区布局。 要实现这个需要Official repositories (简体中文)中的这些包: perl-anyevent-i3 和 perl-json-xs
保存一个工作区的当前窗口布局
要保存当前的窗口布局,按这几步做:
- 首先, 在一个你喜欢的工作区内执行命令打开一些窗口,并根据需要调整它们的大小。 记下打开每个窗口所执行的命令
- 现在, 切换到一个新的工作区, 打开终端然后执行:
i3-save-tree --workspace N > ~/.config/i3/workspace_N.json
N是上一步的工作区号码。 这将会保存N号工作区的布局到这个文件中~/.config/i3/workspace_N.json
. - 这个新创建的文件需要被编辑, 但是你可以用这个命令来完成:
tail -n +2 ~/.config/i3/workspace_N.json | fgrep -v '// split' | sed 's|//||g' > ~/.config/i3/workspace_N.json
恢复工作区的窗口布局
有两种方法恢复工作区的布局: 写一个脚本, 或者编辑 ~/.config/i3/config
来自动载入布局. 这里只讨论第一种方法, 参考 官方文档 了解第二种方法怎么用。
要恢复在上一小节中保存的工作区布局, 写一个叫 load_layout.sh
的文件,它包含以下内容:
- The starting lines:
~/load_layout.sh
#!/bin/bash i3-msg "workspace M; append_layout ~/.config/i3/workspace_N.json"
M是你想要载入布局的工作区编号,N是之前保存布局的那个工作区的编号
- 还有在之前你所使用的打开那些窗口的命令, 但它们必须被封闭在()内,并且在命令末尾加上&符号来让它后台运行
例如,如果保存的布局包括3个 uxterm
窗口:
~/load_layout.sh
#!/bin/bash # First we append the saved layout of workspace N to workspace M i3-msg "workspace M; append_layout ~/.config/i3/workspace_N.json" # And finally we fill the containers with the programs they had (uxterm &) (uxterm &) (uxterm &)
然后把文件设为可执行的:
chmod u+x ~/load_layout.sh
最后,运行下面的命令将N号工作区的布局载入到M号工作区:
~/load_layout.sh
bindsym $mod+g exec ~/load_layout.sh
到 ~/.config/i3/config
并重启i3将绑定Mod+g 到上面的脚本~/.config/i3/workspace_N.json
的swallows 部分需要被手动编辑Scratchpad容器
默认地, scratchpads 只包括一个窗口. 但是,容器也能变成一个scratchpad
创建一个新的容器(例如, Mod+Enter
), 分割它 (Mod+v
) 然后创建另外一个容器。 聚焦到父窗口 (Mod+a
), 于另一方向上分割(Mod+h
), 然后重新创建。
聚焦到第一个容器 (并且聚焦到父窗口), 把窗口变为浮动式 (Mod+Shift+Space
),然后移动它到scratchpad (Mod+Shift+-
).现在你可以根据喜好拆分容器了
屏保和电源管理
通过 Power management#xss-lock 你可以为你的i3会话注册一个屏保。使用 xautolock 的-time
选项在给定时间后锁定屏幕:
xautolock -time 10 -locker "i3lock -i 'background_image.png'" &
一个 systemd 服务文件能在系统将要进入睡眠或休眠状态时用来锁屏。参见 Power management#Suspend/resume service files,注意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
将会看到一个提示。要实现更复杂的行为表现,使用一个独立的脚本, 并在mode中引用它。 [3]
对于其它可用于替代的锁屏器,参见 List of applications/Security#Screen lockers.
“吞噬”终端窗口
和dwm相似, i3 能够用新启动的GUI窗口"吞噬"当前的终端窗口。这可以通过使用 i3-swallowAUR[损坏的链接:package not found] 或 i3-swallow-gitAUR 软件包来实现。
例如, 要让 mpv的窗口吞噬原始的终端:
$ i3-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 页面或者man page来获取完整可使用的参数列表, 访问i3 userguide 和/或 i3 FAQ on reddit了解更多信息.
标签式或层叠式的网络浏览器
有些网络浏览器并没有实现 Tab, 因为原则上对 Tabs 的管理是由窗口管理器负责,而不是浏览器。
为了让 i3 管理您的无 Tab 网络浏览器,以 uzbl 为例,在 ~/.i3/config
添加以下:
for_window [class="Uzbl-core"] focus child, layout stacking, focus
这是层叠式浏览,即所有窗口为垂直地显示。好处是任何 Tab 的标题都可见,哪怕开了很多浏览器窗口。
如果您更偏好标签式浏览,即窗口在水平方向上显示,用:
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
参见Changing named workspaces获取更多信息。
正确处理浮动对话框
即使是默认情况下就该在浮动模式中打开的对话框 [6],也可能仍在平铺模式中打开。要改变这个行为,用xorg-xprop检查对话框的 WM_WINDOW_ROLE
,然后添加正确的规则到 ~/.i3/config
(使用 pcre 语法):
for_window [window_role="pop-up"] floating enable for_window [window_role="task_dialog"] floating enable
还可以使用标题规则和正则表达式:
for_window [title="Preferences$"] floating enable
或者 WM_CLASS
:
for_window [class="(?i)mplayer"] floating enable
状态栏网速显示
你可以试试上游的 脚本, 要使用它:
- 根据你的系统重命名两个网卡 (use
ip addr
) - 在
/sys/devices
找到它们,然后合适地替换掉:
$ find /sys/devices -name network_interface
/sys/class/net/interface/statistics/
来不依靠pci位置查找现在,保存脚本到一个合适的位置 (例如 ~/.config/i3
) ,然后让你的状态栏程序配合它工作
自动切换水平/垂直窗口分割方向
这个 autotilingAUR软件包能够用来自动切换水平/垂直窗口分割方向以达到和bspwm螺旋平铺相似的效果,安装完成之后,把下面内容添加到~/.config/i3/config
然后重启i3.
exec_always --no-startup-id autotiling
疑难排除
通用
很多时候,你遇到的 bug 在开发版中被修复了。可以从 AUR 上的 i3-gitAUR 与 i3status-gitAUR 编译安装最新的开发版。上游(即 i3 项目开发者)希望你能用开发版再试试看能否重现问题 [7] 延伸阅读:Debug - Getting Traces#General.
i3 信息栏上的某些按钮不能用
举例:i3-nagbar
上的“Edit Config”按钮是要调用 i3-sensible-terminal
命令的。这就需要你的 终端模拟器能够被i3识别。
平铺的终端窗口中出现折行错乱
从 v4.3 版本起,i3 会无视平铺窗口的扩大提示(size increment hints)[8]。这就带来了折行错乱等问题。平铺之前尝试先把窗口改成浮动状态,可以绕过这个问题。
鼠标指针总处于忙碌状态
当启动了某些并不支持启动提醒的脚本或程序时,鼠标指针会逗留在忙碌状态六十秒左右。
为排除此现象,凡是 exec
命令都加 --no-startup-id
后缀,比如:
exec --no-startup-id ~/script bindsym $mod+d exec --no-startup-id dmenu_run
为了在全局禁用这个鼠标动画,查看:Cursor themes#Create links to missing cursors。
绑定快捷键不起作用
像 scrot 这类工具,用普通的按键绑定方式(按下按键后,未松开按键前就立即执行)可能不会正常工作。可以试试绑定时加上 --release
参数,使命令在松开按键之后执行 [9]:
bindsym --release Print exec --no-startup-id scrot bindsym --release Shift+Print exec --no-startup-id scrot -s
画面撕裂现象
因为 i3 的双倍缓冲实现得不到位,会出现画面撕裂或闪烁。安装并配置好 picom 可以解决这一问题。[10]
看不到系统托盘图标
为了让 tray_output primary
这一行配置生效,有时需要用 xrandr 来指定一个主显示输出。你可以试试按照 tray_output 显式地指定一个具体的输出,或者干脆删掉这行配置[11]。 关于显示输出的细节可以参看 Xrandr 页面. 自从 i3 4.12 版本起,由 i3-config-wizard 生成的默认配置已经不再包含这行配置了。
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 Tiling Window Manager
- i3源代码
- i3-extras - 脚本和补丁合集
- i3ipc-glib - 一个i3拓展插件库
- i3ipc-ruby - An improved library for i3 extensions in Ruby
- j4tools - 为i3设计的非官方工具
Arch Linux Forums
- The i3 thread - i3的通用讨论
- i3桌面截图和配置分享
截屏与视频