介绍
缘起
自从写了篇配置 i3wm 的教程,我的博客访问量激增,看来有蛮多中文用户需要中文的配置文档,正好翻译一本英文书籍是我的人生清单之一(翻译英文文档应该也算?),于是开了这个新坑。
地址
配置文档上游在:https://github.com/i3/i3.github.io/blob/master/_docs/userguide
项目地址:https://github.com/zjuyk/i3wm-userguide-zh
构建工具:https://github.com/rust-lang/mdBook
我的翻译水平还有待锻炼,里面一些地方可能不太信达雅,欢迎 PR 修改
默认按键绑定
对于嫌太长不愿意看的用户,这里有一份默认按键绑定的概览:
与 $mod(Alt)相关的按键:
与 Shift+$mod 相关的按键:
红色按键是默认需要按下的前导键,蓝色是后需要按下的自定义键。
当你没有配置文件运行 i3wm 时,i3-config-wizard 会帮你生成一份与上面按键位置相同的配置文件,不管你是用的是什么键盘布局。
如果你更想要一份和上面按键一致的的配置文件,那么拒绝 i3-config-wizard 的自动生成然后在 /etc/i3/config
的基础上自定义。
使用 i3
在本指南中,我们使用关键字 $mod
指代配置好的修饰符键。默认情况下,它指的是 Alt 键(Mod1
),而一个流行的备选按键是 Windows 键(Mod4
),使用后者可在很大程度上防止与应用程序定义的快捷方式发生冲突。
打开终端和移动焦点
打开新终端是一个非常基本的操作。默认情况下,这个操作的按键绑定是 $mod + Enter
,即默认配置中的 Alt + Enter(Mod1 + Enter
)。按下 $mod + Enter
打开一个新终端,它将填满屏幕上的整个可用空间。
如果此时打开另一个终端,i3 会将其放置在当前终端的旁边,并将屏幕大小分成两半。i3 会取决显示器的设置,将创建的窗口放在现有窗口的旁边(宽屏显示器)或其下方(旋转显示器)。
要在两个终端之间移动焦点,可以使用你可能从 vi
编辑器那儿知道的方向快捷键。然而,在 i3 中,这类快捷键将使用八基本键(也称导位键,即 A
、S
、D
、F
和 J
、K
、L
、;
这一排八个按键 —— 译者注;在 vi
中,为了和大多数键盘布局兼容,这些快捷键向左移了一位)。因此,$mod + j
是往左,$mod + k
是往下,$mod + l
是往上而 $mod + ;
是往右。所以,要在终端间切换,请使用 $mod + k
或 $mod + l
。当然,箭头方向键也是可以使用的。
现在,工作区(它包含两个终端)已经在特定方向上被拆分了(默认为水平)。就像工作区一样,每个窗口都可以再次被水平或垂直地拆分。“窗口”这个术语是指实际包含了 X11 窗口(如终端或浏览器)的容器,“拆分容器”则表示包含了一个或多个窗口的容器。
TODO:“树”的图片
要垂直拆分一个窗口,请在创建新窗口前按下 $mod + v
。要水平拆分则按下 $mod + h
。
改变容器布局
拆分容器可以拥有以下布局之一:
splith/splitv
(水平拆分/垂直拆分):
控制窗口的大小,使每个窗口在容器中获得相等的空间。 splith 水平分布窗口(窗口彼此相邻), splitv 垂直分布窗口(窗口彼此重叠)。
stacking
(堆叠式):
只显示容器里聚焦的窗口。你可以在容器的顶部看到一个窗口列表。
tabbed
(标签化):
原理和 stacking
相同,但是顶部的窗口列表只有一条垂直分割的行。
要切换模式,请按下 $mod + e
使用 splith/splitv(重复按下可在两者间切换),按下 $mod + s
使用 stacking,按下 $mod + w
使用 tabbed。
为窗口切换全屏模式
要以全屏模式显示窗口或再次退出全屏模式,请按下 $mod + f
。
i3 中还有一个全局全屏模式,该模式下,客户端将跨越所有可用的输出(命令是 fullscrenn toggle global
)。(如果有多个显示器,该模式会将所有显示器看作一个,将窗口跨越多个显示器全屏显示 —— 译者注)
打开其他应用
除了从终端打开应用程序外,还可以使用方便快捷的 dmenu
,默认情况下按下 $mod + d
即可打开它。只需输入想打开的应用程序的名称(或者名称中的几个字)。相应的应用程序必须在 $PATH
路径中才有用。
此外,如果有经常打开的应用程序,可以创建一个绑定按键来直接启动它。详情请参阅 配置 部分。
关闭窗口
如果应用程序不提供关闭窗口的机制(大多数应用程序都提供菜单选项、Esc 键或像 Control + w
之类的快捷键来关闭窗口),可以按下 $mod + Shift + q
杀死窗口。支持 WM_DELETE 协议的应用程序会正确关闭自己(保存所有修改并进行其他清理工作)。否则 X 服务器将杀死窗口,后续行为取决于应用程序。
使用工作区
工作区是一种将一系列窗口分类的简单方法。如底栏左边所示,默认情况下处于第一工作区。要切换到另一个工作区,请按下 $mod + num
键,num
是想使用的工作区的编号。如果工作区还不存在,则会创建它。
一种常见的范例是,将 Web 浏览器放在一个工作区,通信应用程序(mutt
、irssi
等)放在另一个工作区,工作的应用程序放在第三个工作区。当然,没有必要非遵循这种方式不可。
如果有多个屏幕,启动时将会在每个屏幕上创建一个工作区。如果打开一个新的工作区,它将绑定到你创建它的屏幕上。当你切换到位于另一个屏幕的工作区时,i3 会将焦点设置到那块屏幕上。
移动窗口到工作区
要移动窗口到另一个工作区,只需按下 $mod + Shift + num
,num
是目标工作区的编号(这就像切换工作区的时候)。与切换工作区类似,如果目标工作区不存在,则会被创建。
调整大小
改变容器大小最简单的方法是使用鼠标:抓住边框,移动鼠标调整到想要的大小。
还可以使用 绑定模式 ,定义一个通过键盘调整大小的模式。要查看绑定模式的使用示例,请浏览 i3 提供的 默认配置。
原地重启 i3
要原地重新启动 i3(从而在出现错误时进入干净状态,或者要升级到 i3 的较新版本时),可以使用 $mod + Shift + r
按键。
退出 i3
要在不杀死 X 服务器的情况下干净利落地退出 i3,可以使用 $mod + Shift + e
按键。默认情况下,如果真要退出,会弹出对话框要求确认。
浮动模式
浮动模式对立于平铺模式。窗口的位置和大小不由 i3 自动管理,而交由你手动管理。 使用这个模式与平铺模式的范例有所矛盾,但对于一些极端的情况会特别有用,比如“另存为”对话框,或者工具栏窗口(GIMP 或类似的软件有)。这些窗口通常会设置适当的提示并默认以浮动模式打开。
通过按下 $mod + Shift + Space
可以为窗口切换浮动模式。用鼠标拖拽窗口标题栏可以移动窗口。抓住边框并移动鼠标可以调整窗口大小。你还可以使用 浮动修饰键 进行这些操作。另一种通过鼠标调整浮动窗口大小的方式是右键点击标题栏,然后拖拽。
要用键盘调整浮动窗口的大小,请参阅 i3 默认配置 提供的调整大小绑定模式。
浮动窗口始终位于平铺窗口的顶部。
树
i3 通过树来存储所有关于 X11 输出、工作区和窗口布局的信息。 树的根节点是 X11 根窗口,接下来是 X11 的输出, 然后是区域和内容的容器、工作区,最后到窗口本身。 在之前版本的 i3 中,我们使用过链表等结构存储输出和工作区, 针对每个工作区有单独的表。 这种方法现在被证明是复杂、难于使用、理解和实现的。
由容器构成的树
构成树的积木被称为容器(Containers
)。
容器可以容纳窗口
(这里指 X11 的窗口,你可以看见并且使用的窗口,比如浏览器)。
容器也可以容纳一个或多个容器。
我们以一个简单的工作区为例:
i3 启动在一个单显示器,单工作区的环境中。
你打开了两个终端窗口,你会看到:
他们构成的树像这样:
方向与切分容器
只有在使用树状的数据结构来维护布局时, 我们才能很自然地理解切分容器(Split Containers)。
在 i3 中,每个容器都有方向 (水平(horizontal),垂直(vertical)或者未指定(unspecified)), 方向与容器中的布局有关 (当使用垂直切分(splitv)或堆叠(stacking)时是垂直方向, 使用水平切分(splith)或标签式(tabbed)是水平方向)。
所以,在上一个例子中,默认的工作区布局是垂直切分
(因为现在大多数屏幕都是横向的),如果我们把它改成垂直切分
(在默认配置文件中是 $mod+v
),并且打开两个终端,
i3 会这样处理你的两个窗口:
一个关于 i3 自 4 版本以来的有趣的特性是你可以分割几乎所有东西。
假设你现在有两个终端水平切分(也就是水平方向)在一个工作区内,
移动焦点到右边的终端。
现在你想在现在终端的下面打开一个新的终端。
但是如果你现在直接打开终端,它会创建在现在水平切分的右边。
你需要按下 $mod+v
,来使用垂直切分处理右边的容器
(如果需要水平切分,则使用 $mod+h
)。
现在你可以打开一个新的终端,它会在刚刚焦点所在的终端的下方:
此时的树形示意图如下(其中的红色表示你目前的焦点):
你可能已经猜到了,你的切分容器的深度没有限制。
聚焦父容器
让我们继续上面的例子。我们有一个左侧的终端和两个在右侧垂直分割的终端。 现在的焦点在右下的终端上,当我们打开一个新的终端,它会出现在现在这个终端的下方。
所以,我们该如何在现有终端的右边打开一个新的终端呢?
答案是通过 focus parent
切换焦点到目前焦点的父容器。
在默认的设置中,我们使用 $mod+a
聚焦到容器树中的父节点上
(你可以重复多次这个操作直到回到工作区容器)。
这个例子中,你将会聚焦在垂直分割容器上,
它是水平分割的工作区的子容器。
现在,新创建的终端将会出现在垂直分割容器的右边。
图四:聚焦父容器,然后打开新终端
隐式容器
在一些情况下,i3 需要隐式地创建一个容器来完成你的命令。
考虑这样的情况:你在一个单屏幕单工作区的环境中打开 i3, 然后打开了三个终端,按照默认的设置, 现在这些终端会在工作区容器中水平分割。
现在你要移动其中一个终端到下方(默认设置中是 $mod+Shift+j
)。
工作区的方向将被调整为垂直方向。
现在工作区容器中包括了被移动的终端窗口(在下方)和一个新的水平分割容器。
新的水平分割容器被用来容纳另外两个终端窗口。
如果你现在把工作区容器改为标签式堆叠,
你会看到标题栏上出现了对分割容器的描述(比如 H[urxvt firefox]
),
另一个窗口则是你刚刚移动到下方的终端窗口。
配置 i3
这是真正的乐趣开始的地方。;-)
大多数的配置依赖于你的理想的工作环境, 我们并不能作出一个对所有人都合理的默认设置。
我们并没有使用某一种编程语言作为配置文件, 但我们还是在你对于一个窗口管理器的需求范围内, 提供了相当的灵活性。
比如,你可以通过配置绑定跳转到某个特定的窗口, 你可以让特定的应用程序被打开在特定的工作区内, 你可以自动打开一些应用程序, 你可以改变 i3 的颜色, 你可以按照你的需求绑定按键来做你想做的事情。
想要改变 i3 的配置,你可以从 /etc/i3/config
拷贝一份默认的配置文件到
~/.i3/config
(或者符合 XDG 目录结构的 ~/.config/i3/config
),
然后用你喜欢的文本编辑器编辑它。
当你首次打开 i3 (或者没有配置文件的每次)时,
i3 会建议你建立一个新的配置文件。
你可以选择 Alt(Mod1) 或 Windows(Mod4) 作为默认的修饰键。
同时,新创建的配置文件会使用你当前的键盘布局。
如果你需要手动打开配置文件创建向导,
可以使用命令 i3-config-wizard
。
注意,仅当你没有 ~/.i3/config
时,
配置文件向导才会运行,否则它会退出。
自 i3 4.0,我们使用了一种新的配置文件。 i3 会通过一些关键词自动检测配置文件版本, 如果你希望你的配置文件被当作这种新格式, 你的配置文件中需要包含这一行:
# i3 config file (v4)
注释
你可以在配置文件中使用注释来解释你的配置文件。
注释以 #
开头,并且只能被用在行首。
举例:
# This is a comment
# 这是一句注释
字体
i3 可以用 X 核心字体和 FreeType 字体(通过 Pango 实现)渲染窗口标题。
对于 X 核心字体,你可以使用 xfontsel(1)
生成 X 核心字体描述,如果要渲染特殊字符(Unicode 字符),你需要一个支持 ISO-10646 编码的字体。
对于 FreeType 字体,你可能需要指定字体系列(Family)、风格(Style)、粗细(Weight)、变种(Variant),拉伸(Stretch)和大小(Size)。FreeType 字体支持从右到左的渲染,并且通常比 X 核心字体包括更多的 Unicode 符号。
i3 如果没能成功设置字体,会在日志文件中输出错误并且回退到一个可用的字体。
格式:
font <X 核心字体描述>
font pango:<字体系列> [<其他选项>] <大小>
示例:
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
font pango:DejaVu Sans Mono 10
font pango:DejaVu Sans Mono, Terminus Bold Semi-Condensed 11
font pango:Terminus 11px
键盘绑定
键盘绑定让 i3 可以在你按下某个特定的键时执行某个命令。 你可以绑定数字码(keycodes)或符号码(keysyms) (可以混用这两者,但是 i3 将不能确保这些绑定不会重复)。
-
符号码(keysym)可以描述一个特定的符号,比如
a
或者b
,但是我们用underscore
表示_
而不是它本身。 你可以用xmodmap(1)
来重新映射这些键。 要获得当前的符号码设置,你可以使用xmodmap -pke
。 如果交互式地要看到某个键对应着什么符号码,你可以使用xev
。 -
数字码(keycodes)不需要分配一个符号(对于某些笔记本或者其他设备的快捷键很有用),即使你(用 xmodmap)换用其他的键盘布局,这些绑定也不会发生变化。
我们的建议是: 如果你经常切换键盘布局,但想要键盘绑定在物理键盘上的位置不发生变化,可以用数字码。如果你并不需要切换键盘布局,并且希望有一个整洁且简单的配置文件,应当使用符号码。
一些工具(比如 import
或者 xdotool
)可能不应当在一个键被按下(KeyPress)时被触发。
对于这种情况,你可以用 --release
选项来配置这个绑定。
这会让指令在这个键被松开(KeyRelease)的时候被执行。
格式:
bindsym [--release] [<组>+][<修饰键>+]<符号码> 指令
bindcode [--release] [<组>+][<修饰键>+]<数字码> 指令
举例:
# 全屏
bindsym $mod+f fullscreen toggle
# 重启 i3wm
bindsym $mod+Shift+r restart
# 笔记本特定的键
bindcode 214 exec --no-startup-id /home/michael/toggle_beamer.sh
# 在按(松开) $mod+x 的时候模拟输入 ctrl+v
bindsym --release $mod+x exec --no-startup-id xdotool key --clearmodifiers ctrl+v
# 在按(松开) $mod+x 的时候截图
bindsym --release $mod+x exec --no-startup-id import /tmp/latest-screenshot.png
可用的修饰键(Modifier)有:
Mod1-Mod5
, Shift
, Control
。
这些是标准的修饰键,你可以参考 xmodmap(1)
对于 Group1, Group2, Group3, Group4
:
当你使用多种键盘布局时(比如使用了 setxkbmap -layout us,ru
),你可以指定在哪一个 XKB 组中这个绑定应该被激活。
默认情况下键盘绑定会被转换到 Group1 中,并且在所有组中都被激活。
如果你需要在某个键盘布局中覆盖绑定,可以指定相应的组。
出于向后兼容性考虑,Mode_switch
是 Group2
的别名。
鼠标绑定
当你在某个特定的区域按下某个鼠标按键时,i3 可以执行一个指令。 (详见 命令列表#命令条件) 你可以用类似按键绑定的方式配置鼠标绑定。
格式:
bindsym [--release] [--border] [--whole-window] [--exclude-titlebar] [<修饰键>+]按键<n> 命令
默认情况下,这些绑定仅在你点击一个窗口的标题栏时生效。
如果你指定了 --release
选项,i3wm 会在你松开鼠标按键时触发这个指令。
如果你指定了 --whole-window
选项,这个绑定在你点击窗口的其他部分是也会生效,但不包括窗口的边框。
如果需要在点击窗口边框时触发指令,你可以指定 --border
选项。
如果你指定了 --exclude-titlebar
选项,点击标题栏将不会触发指令。
举例:
# 通过在标题栏中键杀死一个窗口
bindsym --release button2 kill
# 通过在按下 $mod 时在窗口的任意位置中键来杀死一个窗口
bindsym --whole-window $mod+button2 kill
# 通过右键设置漂浮的窗口
bindsym button3 floating toggle
bindsym $mod+button3 floating toggle
# 用鼠标侧面的按键来移动窗口
bindsym button9 move left
bindsym button8 move right
绑定模式
你可以通过绑定模式配置多套绑定。
当你切换到另一个绑定模式时,当前模式的所有绑定将不再有效,
只有在新的模式中定义的绑定是有效的,直到你退出这个模式。
默认情况下 i3wm 处于 default
模式,没有定义模式的绑定会处于这一模式中。
要使用绑定模式,你需要定义一个绑定模式,然后切换到它。
在配置文件中,定义一个模式和切换到一个模式都使用 mode
。
如果把 mode
作为配置项使用,你可以定义在这个模式中生效的绑定。
如果把 mode
作为指令使用,触发它将会使 i3wm 切换到这个模式。
我们建议你使用 变量 简化配置,使配置易于维护。
我们建议你定义一个绑定来切换回默认的绑定模式。
你可以对绑定模式使用 pango_markup,
但你需要在定义绑定模式时显式地指定 --pango-markup
选项。
格式:
# 作为配置项
mode [--pango_markup] <name>
# 作为指令
mode <name>
举例:
# 按下 $mod+o 之后
# 用 f 打开 firefox,用 t 打开 thunderbird
# 用回车或 Esc 键返回默认模式
set $mode_launcher Launch: [f]irefox [t]hunderbird
bindsym $mod+o mode "$mode_launcher"
mode "$mode_launcher" {
bindsym f exec firefox
bindsym t exec thunderbird
bindsym Escape mode "default"
bindsym Return mode "default"
}
浮动修饰键
你有两种方法来使用鼠标移动浮动的窗口, 一种方法是拖拽标题栏,另一种方法被称为浮动修饰键。 当你按下浮动修饰键时,你可以拖拽窗口的任意部分来移动它。 通常我们会用你管理窗口的键作为浮动修饰键(比如 Mod1)。 你可以按下 Mod1,左键点击并拖拽一个窗口到你想要的位置。
当你按住浮动修饰键时,你还可以用右键拖拽改变窗口的大小。 如果你同时还按住了 Shift 键,窗口的宽和高会成比例地改变, 换句话说,窗口的宽高比会被保留。
格式:
floating_modifier <修饰键>
例子:
floating_modifier Mod1
限制浮动窗口大小
浮动窗口的宽和高可以有最大值或者最小值。
在 floating_maximum_size
中使用 -1 表示这个方向上的长度不会被限制。
如果没有定义 floating_maximum_size
,或者输入了 0,i3 会使用默认的设置限制窗口大小。
floating_minimum_size
与 floating_maximum_size
是类似的,它限制浮动窗口的最小大小。
格式:
floating_minimum_size <宽> x <高>
floating_maximum_size <宽> x <高>
例子:
floating_minimum_size 75 x 50
floating_maximum_size -1 x -1
新工作区方向
新的工作区会有默认的布局方向, 如果屏幕是横向的(宽大于高),默认会进行水平布局, 如果屏幕是竖向的(高大于宽),默认会进行垂直布局。
你可以使用 default_orientation
来改变这种行为。
格式:
default_orientation horizontal|vertical|auto
例子:
default_orientation vertical
新工作区容器布局模式
当你创建新工作区时,这个选项可以定义默认的容器布局模式。
格式:
workspace_layout default|stacking|tabbed
举例:
workspace_layout tabbed
窗口标题对齐
这个选项可以指定窗口标题对齐的方向,默认为 left
(左对齐)。
格式:
title_align left|center|right
新窗口默认边框样式
这个选项决定了新窗口的边框样式。
默认值是 normal
。
default_floating_border
仅对于新创建的浮动窗口有效(例如某些对话框),
而不对那些创建时不是浮动窗口,而在之后才被调整为浮动的窗口有效。
如果被设置为 pixel
,新窗口将会保留边框,而不显示标题栏。
如果被设置为 normal
,新窗口将同时具有边框和标题栏。
同时,你还可以指定边框的宽度。
格式:
default_border normal|none|pixel
default_border normal|pixel <边框宽度>
default_floating_border normal|none|pixel
default_floating_border normal|pixel <边框宽度>
请注意,new_window
和 new_float
已经被弃用,他们将在未来的更新中被移除。
我们强烈建议你使用新的选项。
举例:
default_border pixel
指定 normal
和 pixel
时,可以同时指定宽度:
举例:
# 和 none 效果一致
default_border pixel 0
# 3 px 宽的无标题栏边框
default_border pixel 3
靠近屏幕边缘隐藏边框
你可以使用 hide_edge_borders
隐藏连接在屏幕边缘上的窗口边框。
如果你使用滚动条,或者你只是不想浪费屏幕边框上的两列像素,这个选项会非常有用。
如果设置为 smart
,当工作区内只有一个窗口可见时,边框会被隐藏;
但当工作区内有多个可见的窗口,边框会被保留。
默认设置是 none
。
格式:
hide_edge_borders none|vertical|horizontal|both|smart
举例:
# 隐藏垂直方向的,屏幕边缘上的边框
hide_edge_borders vertical
针对窗口专用命令(for_window)
使用 for_window
指令,你可以让 i3 在遇到特定窗口时执行任何命令。例如,将窗口设置为浮动或更改其边框样式。
语法:
for_window <criteria> <command>
例子:
# 对所有的 XTerm 窗口开启浮动模式
for_window [class="XTerm"] floating enable
# 使所有的 urxvt 窗口的边框为 1 像素:
for_window [class="urxvt"] border pixel 1
# 一个很少用到但是很有趣的例子:
# 当我切换到 `~/work` 目录时使所有的窗口浮动
for_window [title="x200: ~/work"] floating enable
有效标准与命令的标准相同,请参阅 命令列表#命令条件。在运行时只能执行命令,不能执行配置指令,请参阅 命令列表。
打开窗口不聚焦
当一个新窗口出现时,它将被聚焦。no_focus
指令可以防止这种情况发生,并且必须与 命令列表#命令条件 结合使用。
请注意,这并不适用于所有情况,例如,当将数据提供给正在运行的应用程序导致它请求被聚焦时。 要配置这种情况下的行为,请参阅 聚焦窗口活动。
no_focus
对于工作区上的第一个窗口也将被忽略,因为在这种情况下不应该有理由不聚焦窗口。
这可以跟 workspace_layout
结合使用以获得更好的可用性。
语法:
no_focus <criteria>
例子:
no_focus [window_role="pop-up"]
变量
正如你在关于键盘绑定的部分中学到的那样,你将必须配置大量包含修饰键的绑定。 如果你想节省一些输入时间并能够更改你以后使用的修饰符,变量会很方便。
语法:
set $<name> <value>
例子:
set $m Mod1
bindsym $m+Shift+r restart
解析时直接替换文件中的变量。变量扩展不是递归的,因此不可能使用包含另一个变量的值来定义变量。
没有花哨的处理,也绝对没有改变这一点的计划。
如果你需要更动态的配置,你应该创建一个小脚本来生成配置文件并在启动 i3 之前运行它(例如在你的 ~/.xsession
文件中)。
另请参阅 xresources 以了解如何根据从 X 资源数据库加载的资源创建变量。
X 资源
变量 也可以使用在 X 资源数据库中配置的值来创建。 例如,这有助于避免在 i3 配置中配置颜色值。 相反,这些值可以在 X 资源数据库中配置一次,以在许多 X 应用程序中实现易于维护、一致的颜色主题。
定义一个资源将从资源数据库中加载该资源并将其值赋给指定的变量。 这是逐字完成的,因此值必须采用 i3 使用的格式。 如果无法从数据库加载资源,则必须指定回退。
语法:
set_from_resource $<name> <resource_name> <fallback>
例子:
# `~/.Xresources` 应该包含类似下行
# *color0: #121212
# 同时正确加载,例如,通过
# xrdb ~/.Xresources
# 该值被其他应用程序获取(例如 URxvt)和在 i3 配置文件中这样使用:
set_from_resource $black i3wm.color0 #000000
自动将客户端放到指定工作区
要自动在特定工作区上显示特定窗口,你可以直接分配。
你可以使用任何标准来匹配窗口,请参阅 命令列表#命令条件。
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'
在 i3 启动时自动运行应用
通过在按键绑定时使用 exec
关键字,你可以配置 i3 在初始启动时将执行哪些命令。
exec
命令不会在重新启动 i3 时运行,如果你需要在重新启动 i3 时也运行命令,则应使用 exec_always
关键字。这些命令将按顺序运行。
有关 ; (分号)和 ,(逗号)的特殊含义的详细信息,请参见 命令列表#命令链接:它们在 i3 中将命令链接在一起,因此如果它们出现在你的命令中,你需要使用带引号的字符串(如 exec_quoting 中所示)。
语法:
exec [--no-startup-id] <command>
exec_always [--no-startup-id] <command>
示例:
exec chromium
exec_always ~/my_script.sh
# 执行终端仿真器 urxvt,忽略启动通知
exec --no-startup-id urxvt
参数 --no-startup-id 在 exec 有详细介绍。
自动将工作区放到指定显示屏
如果你习惯于将客户端分配到工作区,其实将工作区放在特定屏幕上可能会更方便。 此外,将工作区分配给屏幕将决定 i3 在添加屏幕或启动时将哪个工作区用于新屏幕(例如,默认情况下,它将为第一个屏幕使用 1,为第二个屏幕使用 2,依此类推)。
语法:
workspace <workspace> output <output1> [output2]…
输出是你将屏幕附加到的 RandR 输出的名称。
在笔记本电脑上,你可能将 VGA1 和 LVDS1 作为输出名称。
你可以通过运行 xrandr --current
来查看现在的输出屏幕。
如果你的 X 服务器支持 RandR 1.5 或更新版本,i3 将使用 RandR 监视器对象而不是输出对象。
运行 xrandr --listmonitors
以查看列表。
通常,一个监视器对象只包含一个输出,并且与输出具有相同的名称;
但如果不是这种情况,你可以在 i3 的配置中指定监视器或输出的名称。
例如,Dell UP2414Q 内部使用两个定标器,因此其输出名称可能是“DP1”和“DP2”,但显示器名称是“Dell UP2414Q”。
(请注意,即使你指定了不跨越整个监视器的输出名称,i3 仍将使用包含监视器的整个区域,而不仅仅是输出的区域。)
你可以指定多个输出。i3 将使用第一个可用的输出屏幕。
如果你使用命名工作区,则必须引用它们:
例子:
workspace 1 output LVDS1
workspace 2 output primary
workspace 5 output VGA1 LVDS1
workspace "2: vim" output VGA1
改变颜色
你可以更改 i3 用于绘制窗口装饰的所有颜色。
语法:
<colorclass> <border> <background> <text> <indicator> <child_border>
colorclass 可以是以下之一:
client.focused
当前具有焦点的客户端。
client.focused_inactive
客户端是其容器的焦点之一,但目前没有焦点。
client.unfocused
不是其容器的焦点之一的客户端。
client.urgent
已激活紧急提示的客户端
client.placeholder
背景和文本颜色用于绘制占位符窗口内容(恢复布局时)。边框和指示器被忽略
client.background
背景颜色将用于绘制客户端窗口的背景,客户端将在其上呈现。只有未覆盖此窗口整个区域的客户端才会显示颜色。请注意,此颜色类仅采用单一颜色。
颜色采用 HTML 十六进制格式 (#rrggbb),请参见以下示例:
例子(默认颜色):
# class border backgr. text indicator child_border
client.focused #4c7899 #285577 #ffffff #2e9ef4 #285577
client.focused_inactive #333333 #5f676a #ffffff #484e50 #5f676a
client.unfocused #333333 #222222 #888888 #292d2e #222222
client.urgent #2f343a #900000 #ffffff #900000 #900000
client.placeholder #000000 #0c0c0c #ffffff #000000 #0c0c0c
client.background #ffffff
请注意,对于窗口装饰,子窗口周围的颜色是“child_border”,而“边框”颜色只是标题栏周围的两条细线。
指示器颜色用于指示将在何处打开新窗口。对于水平拆分容器,右边框将绘制为指示色,对于垂直拆分容器,底部边框将绘制。这仅适用于拆分容器内的单个窗口,否则与拆分容器外的单个窗口无法区分。
进程通信
i3 使用 Unix 套接字来提供 IPC 接口。这允许第三方程序从 i3 获取信息,例如当前工作区(以显示工作区栏),并控制 i3。
IPC 套接字默认启用,如果目录可用,将在 $XDG_RUNTIME_DIR/i3/ipc-socket.%p
中创建,如果没有则使用 /tmp/i3-%u.XXXXXX/ipc-socket.%p
,其中 %u
是你的 UNIX 用户名,%p
是 i3 的 PID,XXXXXX 是来自可移植文件名字符集的随机字符串(请参阅 mkdtemp(3))。
你可以通过环境变量 I3SOCK 或指定 ipc-socket 指令来覆盖默认路径。但是,这是不提倡,因为 i3 默认情况下会做正确的事情。 如果你决定更改它,强烈建议将其设置为你的主目录中的某个位置,以免其他用户无法创建该目录。
例子:
ipc-socket ~/.i3/i3-ipc.sock
然后,你可以使用 i3-msg
应用程序执行 命令列表 中列出的任何命令。
焦点跟随鼠标
默认情况下,当鼠标穿过窗口边界时,窗口焦点会跟随鼠标移动。 但是,如果你的设置让你的鼠标变得碍事(例如你不想完全禁用的笔记本电脑上的触摸板),你可能希望禁用鼠标跟随鼠标并仅使用键盘控制焦点。 鼠标在当前活动窗口内仍然有用(例如单击浏览器窗口中的链接)。
语法:
focus_follows_mouse yes|no
例子:
focus_follows_mouse no
鼠标活动
默认情况下,当将焦点切换到不同输出上的窗口时(例如,将工作区 3 上的窗口聚焦到输出 VGA-1 上,来自 LVDS-1 上的工作区 2),鼠标光标会聚焦到该窗口的中心。
使用 mouse_warping
选项,你可以控制鼠标光标何时应该变形。none
完全禁用变形,而输出是上述默认行为。
语法:
mouse_warping output|none
例子:
mouse_warping none
全屏模式下的弹出窗口
当处于全屏模式时,某些应用程序仍会打开弹出窗口(以 Xpdf 为例)。这是因为这些应用程序可能不知道它们处于全屏模式(它们不检查相应的提示)。在这种情况下,可以做三件事:
-
如果仅属于全屏应用程序,则显示弹出窗口。这是默认设置,对于大多数用户来说应该是合理的行为。
-
只需忽略弹出窗口(不要映射它)。当你处于全屏模式时,这不会打扰你。但是,某些应用程序可能对此反应不佳(死锁,直到你退出全屏)。
-
离开全屏模式。
语法:
popup_during_fullscreen smart|ignore|leave_fullscreen
例子:
popup_during_fullscreen smart
焦点环绕
默认情况下,当在具有多个窗口或子容器的容器中时,当尝试将焦点移动到容器边缘上时(并且该方向没有其他容器)—— 焦点环绕,相反的窗口将被聚焦。
如果需要,你可以通过将 focus_wrapping
配置指令设置为值 no
来禁用此行为。
启用后,如果指定方向上有另一个窗口或容器,则默认情况下不会发生焦点环绕,而是将焦点设置在该窗口或容器上。这是默认行为,因此你可以导航到所有窗口而无需使用 focus parent
。
如果你希望焦点始终环绕并且你知道使用 focus parent
切换到不同的容器,则可以将 focus_wrapping
设置为值 force
。
要限制当前工作空间内的焦点,请将 focus_wrapping
设置为工作空间的值。
你将需要使用 focus parent
,直到选择工作区以使用焦点命令切换到不同的工作区(工作区命令仍将按预期工作)。
语法:
focus_wrapping yes|no|force|workspace
# 旧语法,和 "focus_wrapping force" 等价
force_focus_wrapping yes
例子:
# 禁用焦点环绕
focus_wrapping no
# 强制焦点环绕
focus_wrapping force
强行多荧幕
正如 https://i3wm.org/docs/multi-monitor.html 中深入解释的那样,一些 X11 视频驱动程序(尤其是 nVidia 二进制驱动程序)仅提供对 Xinerama 的支持,而不是 RandR。在这种情况下,必须明确告知 i3 使用劣质的 Xinerama API,因此不支持动态重新配置屏幕(它们在启动时仅读取一次,仅此而已)。
对于无法修改 ~/.xsession
以添加 --force-xinerama
命令行参数的人,提供了一个配置选项:
语法:
force_xinerama yes|no
例子:
force_xinerama yes
另请注意,使用 Xinerama 时,你的输出名称不是描述性的(如 HDMI1),而是从 0 开始计数:xinerama-0、xinerama-1……
当切换当前工作区时自动来回切换
当切换到当前聚焦的工作空间时,此配置指令启用自动 workspace back_and_forth
(参见 back_and_forth)。
例如:假设你在工作区“1:www”并使用 mod+2 切换到“2:IM”,因为有人向你发送了一条消息。你现在不需要记住你是从哪里切换过来的,你只需再次按 $mod+2 即可切换回“1: www”。
语法:
workspace_auto_back_and_forth yes|no
例子:
workspace_auto_back_and_forth yes
延迟工作区变化紧急提示重置
如果另一个工作区上的应用程序设置了紧急提示,切换到该工作区可能会导致应用程序立即获得焦点,这也意味着窗口装饰颜色将立即重置为 client.focused
。
这可能会导致难以判断最初是哪个窗口引发了事件。
为了防止这种情况,你可以使用 force_display_urgency_hint
指令告诉 i3 延迟重置紧急状态一定时间。
将该值设置为 0 将禁用此功能。
默认是 500 ms.
语法:
force_display_urgency_hint <timeout> ms
例子:
force_display_urgency_hint 500 ms
聚焦窗口活动
如果一个窗口被激活,例如,通过 google-chrome www.google.com
,它可能会请求获得焦点。
这可能不是优选的,你可以配置不同的反应。
请注意,这可能不会影响正在打开的窗口。要防止新窗口被聚焦,请参阅 no_focus。
语法:
focus_on_window_activation smart|urgent|focus|none
不同模式的作用如下:
smart
这是默认行为。如果请求焦点的窗口位于活动工作区上,它将获得焦点。否则,将设置紧急提示。
urgent
窗口将始终标记为紧急,但焦点不会被窃取。
focus
该窗口将始终处于焦点状态,不会被标记为紧急。
none
该窗口既不会被聚焦,也不会被标记为紧急。
在窗口装饰绘制标记
如果激活,窗口上的标记(见 vim_like_marks)会在它们的窗口装饰中绘制。 但是,即使激活此选项,也不会绘制名称中以下划线 (_) 开头的任何标记。
此选项的默认值为 yes
。
语法:
show_marks yes|no
例子:
show_marks yes
连续行
配置文件支持换行,这意味着当您以反斜杠字符 (\
) 结束一行时,解析器将忽略换行符。此功能可用于创建更具可读性的配置文件。注释行无法连续。
例子:
bindsym Mod1+f \
fullscreen toggle
# 此行不连续 \
bindsym Mod1+F fullscreen toggle
配置 i3bar
你显示器底部的条栏是由一个叫 i3bar 的独立进程绘制的。将 “i3 用户界面” 的这一部分放在一个单独的进程中,有几个好处:
-
它是模块化的。如果你根本不需要工作区栏,或者你喜欢不同的工作区栏(dzen2、xmobar,甚至 gnome-panel?), 你可以直接删除 i3bar 的配置,然后使用你喜欢的替代品。
-
它遵循 UNIX 的理念,即 "让每个程序做好一件事"。i3 很擅长管理好你的每一个窗口, i3bar 则擅长在每个显示器上显示一个栏(除非你对它进行其他配置)。
-
这使得我们可以有两个独立的、干净的代码库。如果你想了解 i3,你不需要费心去了解 i3bar 的细节,反之亦然。
尽管如此,i3bar 与 i3 的配置在同一个配置文件中。这是因为它与 i3 紧密耦合(与 i3lock 或 i3status 相反,它们对使用其他窗口管理器的人很有用)。 因此,当我们已经有了一个好的配置基础结构时,在另一个地方配置是没有意义的。
想要配置你的工作区栏,首先需要在配置文件中创建一个叫做 bar
的块。
你可以有多个 bar
块来为不同的输出(显示器)使用不同的设置。
例子:
bar {
status_command i3status
}
i3bar 命令
默认情况下,i3 会直接将 i3bar
传到你的 shell 来处理、搜索 $PATH
以找到正确的版本。如果你在某个地方有一个不同的 i3bar
或者二进制文件不在 $PATH
里,你可以告诉 i3 执行哪个文件。
这个特定的命令会被传到 sh -c
执行,因此你可以使用 globbing,且必须使用正确的引号等。
语法:
i3bar_command <command>
例子:
bar {
i3bar_command /home/user/bin/i3bar
}
状态栏命令
i3bar 可以运行一个程序,把它的 stdout
的每一行显示在工作区栏的右边。这对显示系统信息很有用,比如你当前的 IP 地址、电池状态或日期/时间。
这个特定的命令会被传到 sh -c
执行,因此你可以使用 globbing,且必须使用正确的引号等。注意,对于信号处理,取决你的 shell(已知 dash(1)
的用户会受到影响),你必须使用 shell 的 exec
命令。这样信号就会传递给你的程序而不是 shell。
语法:
status_command <command>
例子:
bar {
status_command i3status --config ~/.i3status.conf
# 想要信号处理正常工作的 dash(1) 用户:
status_command exec ~/.bin/my_status_command
}
显示模式
你可以让 i3bar 在屏幕的一个边缘永久可见(dock
模式),或者让它在你按下修饰键时才显示出来( hide
模式)。也可以强制 i3bar 始终保持隐藏状态(invisible
模式)。修饰键可以通过 modifier
选项进行配置。
显示模式选项可以在运行期间通过 bar mode
命令改变。重新加载后,它会被恢复到配置的值。
hide
模式可以使屏幕空间被最大化利用,来显示实际的窗口内容。当工作区栏被隐藏时,为节省电池电量,i3bar 会向 status_command
进程发送 SIGSTOP
和 SIGCONT
信号。status_command
进程可以通过在其 JSON 头信息中设置适当的值来禁用该功能。
invisible
模式允许永久地最大化屏幕空间,也就是说工作区栏永远不会显示。因此,如果你不想被打扰,可以配置即使在紧急通知或修饰键被按下时,i3bar 也不弹出来。
为了控制 i3bar 在 hide
模式下是隐藏还是显示,存在一个 hidden_state
选项,在 dock
模式或 invisible
模式下没有效果。它表明了当前的工作区栏的 hideden_state
:(1)工作区栏和普通的 hide
模式一样是隐藏的,只有在有紧急通知或按下修饰键的情况下才会解除隐藏(hide
状态),或者(2)它被显示在当前可见工作区的上方(show
状态)。
和显示模式一样,hidden_state
也可以通过 i3 控制。可以通过使用 bar hidden_state
命令来实现。
默认的模式是 dock
模式;在 hide
模式下,默认的修饰键是 Mod4
(通常是 windows 键)。hidden_state
的默认值是 hide
。
语法:
mode dock|hide|invisible
hidden_state hide|show
modifier <Modifier>|none
例子:
bar {
mode hide
hidden_state hide
modifier Mod1
}
可以使用的修饰符有 Mod1
- Mod5
,Shift
,Control
(详见 xmodmap(1)
)。如果你不想要任何的修饰符触发这个行为,你也可以使用 none
。
鼠标按键命令
鼠标按键在 i3bar 上被按下时运行的命令可以被指定来覆盖默认行为。这很有用,例如,用于禁用滚轮动作或运行脚本来实现自定义功能
一个按钮总是被命名为 button<n>
,其中 1 到 7 是如下的默认按键,更高的数字是有更多按键的设备上的特殊按键。
-
button1 鼠标左键
-
button2 鼠标中键
-
button3 鼠标右键
-
button4 滚轮向上
-
button5 滚轮向下
-
button6 滚轮向右
-
button7 滚轮向左
请注意老的 wheel_up_cmd
和 wheel_down_cmd
命令已经被废弃,且会在将来的版本中被移除。我们强烈建议使用更通用的 binsym
配合 button4
和 button5
来替代。
语法:
bindsym [--release] button<n> <command>
例子:
bar {
# 禁用点击工作区按键
bindsym button1 nop
# 通过右键工作区栏来截图
bindsym --release button3 exec --no-startup-id import /tmp/latest-screenshot.png
# 向下滚动时执行自定义脚本
bindsym button5 exec ~/.i3/scripts/custom_wheel_down
}
Bar 编号
为配置的工作区栏指定编号。如果缺少这个选项,ID 会被设置为 bar-x
,其中 x 对配置文件中 bar
块所在的位置(bar-0
,bar-1
。。。)
语法:
id <bar_id>
例子:
bar {
id bar-1
}
位置
这个选项决定了 i3bar 会被显示在屏幕的哪个边上。
默认是底边。
语法:
position top|bottom
例子:
bar {
position top
}
输出
你可以将 i3bar 限制在一个或多个输出(显示器)。默认是处理所有的输出。如果你想要对不同的输出使用不同的选项,你可以使用多个 bar
块,这个时候限制输出就很有用了。
要使一个特定的 i3bar 实例处理多个输出,请多次使用 output
指令。
这些输出名称有特殊含义:
primary
选择在 X 服务器中被配置为主要的输出。
nonprimary
选择每一个在 X 服务器中没有被配置为主要的输出。
语法:
output primary|nonprimary|<output>
例子:
# 一个大显示器显示所有内容
bar {
# 显示器可能通过 HDMI 或者 DisplayPort 连接
output HDMI2
output DP2
status_command i3status
}
# 笔记本显示器:使用亮色和 i3status,少量的模块
bar {
output LVDS1
status_command i3status --config ~/.i3status-small.conf
colors {
background #000000
statusline #ffffff
}
}
# 把工作区栏同时显示在主显示器和 HDMI2 上
bar {
output primary
output HDMI2
status_command i3status
}
注意你可能没有配置主输出。想要配置,运行:
xrandr --output <output> --primary
托盘输出
i3bar 默认情况下提供一个系统托盘以供类似于 NetworkManager, VLC, Pidgin 的程序可以在这里放一个小图标。
你可以配置这些小图标应该被显示在哪个输出上,又或者你可以把这个功能完全禁用。
你也可以在你的配置文件里使用多个 tray_output
指令来指定一系列你想要显示托盘的输出。这个列表里按顺序第一个可用输出将会被用来显示托盘。
语法:
tray_output none|primary|<output>
例子:
# 禁用系统托盘
bar {
tray_output none
}
# 在主显示器上显示托盘图标
bar {
tray_output primary
}
# 在大显示器上显示托盘图标
bar {
tray_output HDMI2
}
注意你可能没有配置主输出。想要配置,运行:
xrandr --output <output> --primary
注意如果你有多个 bar 配置块,你要么在每个块里都指定 tray_output primary
,要么显式地在你不想要显示托盘的 bar 块里指定 tray_output none
。否则不同的实例为了显示图标可能会产生竞争。
托盘内边距
托盘会显示工作区栏的右侧。默认情况下,在图标的上、右、下侧和托盘间会有一个 2 个像素的内边距。
语法:
tray_padding <px> [px]
例子:
# 遵循费兹法则
tray_padding 0
字体
指定 bar 使用的自体。详见 字体
语法:
font <font>
例子:
bar {
font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1
font pango:DejaVu Sans Mono 10
}
自定义分隔符
如果你不喜欢默认的一像素宽的竖直分隔符,你可以自定义一个符号作为分隔符。
语法:
separator_symbol <symbol>
例子:
bar {
separator_symbol ":|:"
}
工作区按钮
指定是否需要显示工作区按钮。如果你想要一个可以显示额外信息的、只有状态栏的工作区栏的话,这会很有用。
默认会显示工作区按钮。
语法:
workspace_buttons yes|no
例子:
bar {
workspace_buttons no
}
工作区按钮最小宽度
默认情况下,工作区按钮的宽度是被工作区名字的宽度决定的。如果工作区的名字非常短,比如说一个字母,那工作区按钮可能会看起来太小。
这个选项指定了工作区按钮的最小宽度。如果工作区名太短没有办法撑满整个按钮,文本的两边会被加上额外的内边距以使文本居中。
默认值是 0,也就是不会加任何额外的内边距。
这个设置对 “绑定模式指示器” 也有效。
注意这里的像素指的是逻辑像素,在高分辨率屏幕下可能会被转换成更多的实际像素。
语法:
workspace_min_width <px> [px]
例子:
bar {
workspace_min_width 40
}
去除工作区数字和名字
这个设置指定了工作区按钮是否应该显示工作区编号。如果你想要工作区可以按顺序排列,同时又不想要编号前缀的话,这个设置会很有用。
当 strip_workspace_numbers
被设置为 yes
时,任何的被命名为 [n][:][NAME]
格式的工作区只会显示名字。举个例子,你可以使用罗马数字来替代普通数字作为你的工作区名,像是 1:I
, 2:II
, 3:III
, 4:IV
。
当 strip_workspace_name
被设置为 yes
时,任何的被命名为 [n][:][NAME]
格式的工作区只会显示编号。
默认情况下会在工作区按钮中显示整个名字。注意工作区名中的冒号是可选的,也就是说 [n][NAME]
也会被正确地去除名字和编号。
语法:
strip_workspace_numbers yes|no
strip_workspace_name yes|no
例子:
bar {
strip_workspace_numbers yes
}
绑定模式指示器
指定是否显示绑定模式指示器。如果你想要隐藏工作区按钮但是仍然能够看见绑定模式指示器的话,这个选项会很有用。关于什么是模式以及如何使用,详见 绑定模式。
默认情况下会显示绑定模式指示器。
语法:
binding_mode_indicator yes|no
例子:
bar {
binding_mode_indicator no
}
颜色
与 i3 一样,颜色使用 HTML 的十六进制格式 (#rrggbb)。目前,这些颜色可以被设置:
background
工作区栏的背景颜色
statusline
状态栏的文字颜色
separator
分隔符的文字颜色
focused_background
当前聚焦显示器输出的工作区栏的背景颜色。如果没有被设置,这个颜色会取 background
。
focused_statusline
当前聚焦显示器输出的状态栏的文字颜色。如果没有被设置,这个颜色会取 statusline
。
focused_separator
当前聚焦显示器输出的分隔符的文字颜色。如果没有被设置,这个颜色会取 separator
。
focused_workspace
聚焦工作区的按钮的边界,背景和文字颜色。
active_workspace
活跃且可见但没有被聚焦的工作区的按钮的边界、背景和文字颜色。仅当你有多个显示器时你才能区分这个和聚焦工作区的区别。
inactive_workspace
没有被聚焦,不活跃但可见的工作区的按钮的边界、背景和文字颜色。这是大部分工作区的状态。
urgent_workspace
当一个工作区中的窗口有紧急通知时的按钮的边界、背景和文字颜色。
binding_mode
绑定模式指示器的边界、背景和文字颜色。如果没有被设置,这个颜色会取 urgent_workspace
。
语法:
colors {
background <color>
statusline <color>
separator <color>
<colorclass> <border> <background> <text>
}
Example (default colors):
例子(默认颜色):
bar {
colors {
background #000000
statusline #ffffff
separator #666666
focused_workspace #4c7899 #285577 #ffffff
active_workspace #333333 #5f676a #ffffff
inactive_workspace #333333 #222222 #888888
urgent_workspace #2f343a #900000 #ffffff
binding_mode #2f343a #900000 #ffffff
}
}
透明度
i3bar 支持通过在配置中使用 --transparency
flag 来启用透明:
语法:
bar {
i3bar_command i3bar --transparency
}
在 i3bar 颜色配置和 i3bar 状态配置的颜色属性中你可以使用 RGBA 格式的颜色,也就是使用最后两位十六进制数字来指定透明度。举个例子,#00000000
是完全透明,而 #000000FF
则是完全不透明的黑色(和 #000000
是一样的)。
请注意由于托盘配置的工作方式,启用这个配置将会导致托盘图标的背景变成透明的。
命令列表
命令是你绑定在特定按键组合上的东西。你也可以通过使用 IPC 接口在运行时运行命令,而不需要按下一个键,一个简单的方法是使用 i3-msg
工具。
举例:
# 在你的 shell 中执行这个命令,去除当前的容器的边界
i3-msg border none
多个命令可以用 ;
(分号)连接。所以,如果想要将一个窗口移动到一个工作区中并立即切换到这个工作区,你可以配置如下的按键绑定:
bindsym $mod+x move container to workspace 3; workspace 3
另外,你还可以更改命令的作用域——即哪些容器会受到该命令的影响。判断标准在命令之前用一对方括号指定,用空格隔开。
当作用域用于多条命令时,应使用 ,
(逗号)而不是分号来分隔它们。判断标准只适用到下一个分号之前,所以如果你使用分号来分隔命令,只有第一个命令会对被匹配的窗口执行。
举例:
# 如果你想杀死所有 class 是 Firefox 的窗口,使用:
bindsym $mod+x [class="Firefox"] kill
# 同上,除了匹配时忽略大小写
bindsym $mod+x [class="(?i)firefox"] kill
# 只杀死 Firefox 的关于对话框
bindsym $mod+x [class="Firefox" window_role="About"] kill
# 打开浮动模式并移动容器到工作区 4
for_window [class="^evil-app$"] floating enable, move container to workspace 4
# 移动所有浮动窗口到 scratchpad
bindsym $mod+x [floating] move scratchpad
目前已实现的判断标准有:
class:
比较 window class(WM_CLASS 的第二部分)。使用特殊值 __focused__
匹配 window class 和目前拥有焦点的窗口相同的所有窗口。
instance:
比较 window instance(WM_CLASS 的第二部分)。使用特殊值 __focused__
匹配 window instance 和目前拥有焦点的窗口相同的所有窗口。
window_role:
比较 window role(WM_WINDOW_ROLE)。使用特殊值 __focused__
匹配 window role 和目前拥有焦点的窗口相同的所有窗口。
window_type:
比较 window type(_NET_WM_WINDOW_TYPE)。合法值有 normal
, dialog
, utility
, toolbar
, splash
, menu
, dropdown_menu
, popup_menu
, tooltip
和 notification
。
id:
比较 X11 window ID,你可以使用 xwininfo
获得 ID。
title:
比较 X11 窗口标题(_NET_WM_NAME 或者默认值 WM_NAME)。使用特殊值 __focused__
匹配窗口标题和目前拥有焦点的窗口相同的所有窗口。
urgent:
比较窗口的紧急状况。值可以是 "latest" 或者 "oldest",分别匹配最新的和最旧的紧急窗口。
workspace:
比较窗口所在工作区的名字。使用特殊值 __focused__
匹配目前拥有焦点的工作区中的所有窗口。
con_mark:
比较此容器的标记,见类似 VIM 的标记。如果一个容器的多个标记中有一个标记被匹配,这个容器就会被匹配。
con_id:
比较 i3 内部的容器 ID,你可通过 IPC 接口获得 ID。写脚本时使用它比较方便。使用特殊值 __focused__
匹配目前拥有焦点的那个窗口。
floating:
只匹配浮动窗口。这个判断标准没有值。
floating_from:
和 floating
相似但这个判断标准有两个可能的值:"auto" 和 "user"。当值是 "auto" 时,只有打开时就自动是浮动状态的窗口会被匹配。当值是 "user" 时,只有被用户改变为浮动的窗口会被匹配。
tiling:
只匹配平铺窗口。这个判断标准没有值。
tiling_from:
和 tiling
相似但这个判断标准有两个可能的值:"auto" 和 "user"。当值是 "auto" 时,只有打开时就自动是平铺状态的窗口会被匹配。当值是 "user" 时,只有被用户改变为平铺的窗口会被匹配。
判断标准 class
, instance
, role
, title
, workspace
和 mark
都是正则表达式(PCRE)。如何使用请见 pcresyntax(3)
或 perldoc perlre
。
运行应用(exec)
如果你不能实际启动任何应用程序,那么窗口管理器有什么用呢?exec 命令通过将你指定的命令传递给 shell 来启动一个应用程序。这意味着你可以使用通配符,并将会在 $PATH
中搜索程序。
格式:
exec [--no-startup-id] <命令>
举例:
# 打开 GIMP
bindsym $mod+g exec gimp
# 打开还不支持启动通知的终端模拟器 urxvt
bindsym $mod+Return exec --no-startup-id urxvt
--no-startup-id
参数禁用了对这个 exec 命令的启动通知支持。通过使用启动通知,i3 可以确保程序的窗口在你使用 exec 命令时所在的工作区中出现。同时,它还会在应用程序启动时将 X11 光标改为 watch(一个时钟)。所以,如果一个应用程序没有支持启动通知(不过大多数使用 GTK 和 Qt 的应用程序似乎都支持),将会出现 60 秒的时钟光标。
如果要执行的命令包含 ;
(分号)或 ,
(逗号),那么整个命令必须被引号包裹。例如,要为 shell 命令 notify-send Hello, i3
设置一个绑定,你可以在你的配置文件中添加这样一个条目:
# 运行一个包含逗号的命令
bindsym $mod+p exec "notify-send Hello, i3"
如果一个带有逗号和/或分号的命令本身需要引号,你必须用双反斜线转义内部引号,像这样:
# 运行一个包含逗号、分号和引号的命令
bindsym $mod+p exec "notify-send \\"Hello, i3; from $USER\\""
切分容器
split 命令使当前窗口成为一个分割容器。分割容器可以包含多个窗口。根据分割容器的布局,新的窗口会被放在当前窗口的右边(splith 横向分割),或者下面(splitv 纵向分割)。
如果你将这个命令应用于具有相同方向的分割容器,那么什么也不会发生。如果你应用于不同的方向,分割容器的方向将被改变(如果它没有一个以上的窗口)。如果分割容器只包含一个窗口,toggle
选项将切换分割容器的方向。否则,它将使当前窗口成为和父容器方向相反的分割容器。使用 layout toggle split
来改变分割容器的布局,从纵向分割变为横向分割或者反过来。你也可以自定义一个布局序列然后用 layout toggle
来在其中循环切换,见 操纵布局。
格式:
split vertical|horizontal|toggle
举例:
bindsym $mod+v split vertical
bindsym $mod+h split horizontal
bindsym $mod+t split toggle
操纵布局
分别使用 layout toggle split
, layout stacking
, layout tabbed
, layout splitv
或 layout splith
来改变当前容器的布局为横向分割/纵向分割、堆叠、标签、纵向分割或横向分割。
在 layout toggle
之后指定最多 4 个布局来在他们之间循环切换。每次执行该命令时,当前布局之后的布局将被应用。如果当前布局不在列表中,列表中的第一个布局将被激活。
要使当前窗口全屏,请使用 fullscreen enable
(或全局模式的 fullscreen enable global
),要离开任一全屏模式,请使用 fullscreen disable
,要在这两种状态之间切换,请使用 fullscreen toggle
(或 fullscreen toggle global
)。
同样,要使当前窗口浮动或平铺,请分别使用 floating enable
和 floating disable
(或 floating toggle
)。
格式:
layout default|tabbed|stacking|splitv|splith
layout toggle [split|all]
layout toggle [split|tabbed|stacking|splitv|splith] [split|tabbed|stacking|splitv|splith]…
举例:
bindsym $mod+s layout stacking
bindsym $mod+l layout toggle split
bindsym $mod+w layout tabbed
# 在堆叠/标签/分割之间切换
bindsym $mod+x layout toggle
# 在堆叠/标签/横向分割/纵向分割之间切换
bindsym $mod+x layout toggle all
# 在堆叠/标签/横向分割之间切换
bindsym $mod+x layout toggle stacking tabbed splith
# 在纵向分割/标签之间切换
bindsym $mod+x layout toggle splitv tabbed
# 在上一个分割布局/标签/堆叠之间切换
bindsym $mod+x layout toggle split tabbed stacking
# 切换全屏
bindsym $mod+f fullscreen toggle
# 切换浮动/平铺
bindsym $mod+t floating toggle
聚焦容器
要更改焦点,你可以使用 focus
命令,它有以下的选项:
<criteria>
聚焦于满足判断标准的容器。见 命令标准。
left|right|up|down
聚焦于对应方向最近的容器。
parent
聚焦于当前容器的父容器上。
child
focus parent
的反操作。聚焦于最后一个拥有焦点的子容器。
next|prev
自动聚焦到相邻的容器上。如果在命令后加上了 sibling
,该命令将聚焦于确切的同级容器,包括非叶子容器,如分割容器。否则,它是一个在父容器的方向上的自动版本的 focus left|right|up|down
。
floating
聚焦于上一个拥有焦点的浮动容器。
tiling
聚焦于上一个拥有焦点的平铺容器。
mode_toggle
在浮动/平铺容器之间切换。
output
加上一个方向或显示输出名称作为参数,将聚焦到对应的显示输出。
格式:
<criteria> focus
focus left|right|down|up
focus parent|child|floating|tiling|mode_toggle
focus next|prev [sibling]
focus output left|right|up|down|primary|<output>
举例:
# 聚焦于 firefox
bindsym $mod+F1 [class="Firefox"] focus
# 聚焦于左、下、上、右边的容器
bindsym $mod+j focus left
bindsym $mod+k focus down
bindsym $mod+l focus up
bindsym $mod+semicolon focus right
# 聚焦于父容器
bindsym $mod+u focus parent
# 聚焦于上一个拥有焦点的浮动/平铺容器
bindsym $mod+g focus mode_toggle
# 聚焦于右边的显示输出
bindsym $mod+x focus output right
# 聚焦于显示输出 HDMI-2
bindsym $mod+x focus output HDMI-2
# 聚焦于主显示输出
bindsym $mod+x focus output primary
注意,你可能还没有一个主显示输出。运行以下命令以指定一个:
xrandr --output <显示输出> --primary
移动容器
使用 move
命令来移动一个容器。
格式:
# 向给定的方向移动容器。可选的 px 参数表示如果容器是浮动的,
# 它应移动多远,默认为 10 像素。可选的 ppt 参数的意思是百分
# 点(percentage points),如果使用则表示如果容器是浮动的,
# 它应移动多少百分点,而不是像素值。
move <left|right|down|up> [<amount> [px|ppt]]
# 移动容器到屏幕上指定的 (pos_x, pos_y) 坐标。
move position <pos_x> [px|ppt] <pos_y> [px|ppt]
# 移动容器到屏幕中心。如果使用了 'absolute' 参数,容器将被
# 移动到所有显示输出的中心。
move [absolute] position center
# 移动容器到当前光标的位置,只会移动浮动的容器。
move position mouse
举例:
# 将容器向左、下、上、右边移动
bindsym $mod+j move left
bindsym $mod+k move down
bindsym $mod+l move up
bindsym $mod+semicolon move right
# 移动容器,但让浮动容器移动多余默认值的距离
bindsym $mod+j move left 20 px
# 移动容器到所有显示输出的中心
bindsym $mod+c move absolute position center
# 移动容器到当前光标的位置
bindsym $mod+m move position mouse
交换容器
两个容器可以通过使用 swap
命令进行交换(即移动到对方的位置)。它们将继承与之互换的容器的位置和尺寸。
参与交换的第一个容器可以通过正常的命令判断标准过程来选择,如果没有指定标准,正在聚焦的窗口是通常的默认窗口。第二个容器可以通过以下方法之一来选择:
id
窗口的 X11 窗口 ID。
con_id
容器的 i3 容器 ID。
mark
拥有一个标记的容器,见类似 VIM 的标记。
注意,不是所有容器都可交换。例如无法交换拥有父子关系的容器。
格式:
swap container with id|con_id|mark <参数>
举例:
# 交换聚焦的容器和标记为 "swapee" 的容器
swap container with mark swapee
# 交换标记为 "A" 和 "B" 的容器
[con_mark="^A$"] swap container with mark B
固定浮动窗口
如果你想让一个窗口固定在显示器上,即使你切换到另一个工作区,它还留在屏幕上,那么你可以使用 sticky
命令。例如,这对记事本、媒体播放器或视频聊天窗口很有用。
请注意,虽然任何窗口都可以通过这个命令变成固定的,但只有在窗口是浮动的情况下才会生效。
格式:
sticky enable|disable|toggle
举例:
# 固定启动为记事本的终端
for_window [instance=notepad] sticky enable
切换(已命名)工作区和移动至新工作区
要切换到一个工作区,应使用 workspace
命令,加上工作区的编号或名字。加上可选的选项 --no-auto-back-and-forth
以对本次命令禁用自动来回切换。
要移动容器到一个工作区,使用 move container to workspace
。
你也可以通过命令 workspace next
和 workspace prev
切换到下一个和上一个工作区。例如,如果你有工作区 1、3、4 和 9,然后你想用一个组合键循环浏览它们,用这两个命令就这很方便。如果要将这些限制在当前的输出,可以使用 workspace next_on_output
和 workspace prev_on_output
。同样,你可以使用 move container to workspace next
、move container to workspace prev
来将一个容器移动到下一个/上一个工作区,以及 move container to workspace current
(最后一个命令只有在与判断标准一起使用时才有意义)。
workspace next
可在编号的或命名的工作区中循环。但当它到达最后一个编号的/命名的工作区时,它在遍历完编号的工作区后会寻找命名的工作区,在遍历完命名的工作区后会寻找编号的工作区。
对于如何移动容器/工作区到一个不同的 RandR 输出,见移动容器或工作区到 RandR 输出。
工作区的名字会以 Pango 标记 的格式被 i3bar 解析。
要切换回之前聚焦的工作区,使用 workspace back_and_forth
;类似地你可以用 move container to workspace back_and_forth
来将一个容器移动到之前聚焦的工作区。
格式:
workspace next|prev|next_on_output|prev_on_output
workspace back_and_forth
workspace [--no-auto-back-and-forth] <名字>
workspace [--no-auto-back-and-forth] number <名字>
move [--no-auto-back-and-forth] [window|container] [to] workspace <名字>
move [--no-auto-back-and-forth] [window|container] [to] workspace number <名字>
move [window|container] [to] workspace prev|next|current
举例:
bindsym $mod+1 workspace 1
bindsym $mod+2 workspace 2
bindsym $mod+3 workspace 3:<span foreground="red">vim</span>
...
bindsym $mod+Shift+1 move container to workspace 1
bindsym $mod+Shift+2 move container to workspace 2
...
# 在当前聚焦的和上一个聚焦的工作区之间切换
bindsym $mod+b workspace back_and_forth
bindsym $mod+Shift+b move container to workspace back_and_forth
# 移动整个工作间到右边的显示输出
bindsym $mod+x move workspace to output right
# 移动 firefox 到当前工作区
bindsym $mod+F1 [class="Firefox"] move workspace current
命名的工作区
工作区用名字来标识。所以你可以可以在 workspace 命令中使用任意名字,而不只是数字:
bindsym $mod+1 workspace mail
...
如果你想让工作区同时有编号和名字,你可以在名字前面添加编号,像这样:
bindsym $mod+1 workspace 1: mail
bindsym $mod+2 workspace 2: www
...
注意,在这种情况下工作区将被命名为 "1: mail"。i3 以一种稍微特殊的方式处理以数字开头的工作区名称。通常情况下,命名的工作区是按照它们出现的顺序排序的。当它们以数字开头时,i3 将按数字排序。另外,你能用 workspace number 1
来切换到以数字 1 开头的工作区,而不管它的名字是什么。这在你动态改变工作区名称的情况下非常有用。要结合两个命令,你可以使用 workspace number 1: mail
来指定一个默认名字,如果目前没有以 "1" 开头的工作区的话。
重命名工作区
你可以重命名工作区。如果你从默认的编号的工作区开始做你的工作,并在之后重命名工作区以反映它们上的实际内容,这可能是有用的。你也可以省略旧的名字来重命名当前聚焦的工作区,如果你想在 i3-input
中使用重命名命令,这很方便。
格式:
rename workspace <旧名字> to <新名字>
rename workspace to <新名字>
举例:
i3-msg 'rename workspace 5 to 6'
i3-msg 'rename workspace 1 to "1: www"'
i3-msg 'rename workspace "1: www" to "10: www"'
i3-msg 'rename workspace to "2: mail"'
bindsym $mod+r exec i3-input -F 'rename workspace to "%s"' -P 'New name: '
如果你想在保持切换命令稳定的同时按需重命名工作空间,你可以使用这样的设置。
bindsym $mod+1 workspace number "1: www"
bindsym $mod+2 workspace number "2: mail"
...
如果工作区不存在,命令 workspace number "1: mail"
将会创建名为 "1: mail" 的工作区。
如果编号为 1 的工作区存在,此命令将切换到这个工作区并忽略名字。所以即使这个工作区被重命名为了 "1: web",上面的命令仍然会切换到它。
移动工作区到另一不同屏幕
对于如何移动容器/工作区到一个不同的 RandR 输出,见移动容器或工作区到 RandR 输出。
移动容器或工作区到 RandR 输出
要移动一个容器到另一个 RandR 输出(用类似 LVDS1
和 VGA1
的名字标识),或者用方向标识的 RandR 输出,有两个命令可用:
move container to output left|right|down|up|current|primary|<显示输出>
move workspace to output left|right|down|up|current|primary|<显示输出>
举例:
# 移动目前工作区到下一个输出(如果你只有两个输出,相当于在两个输出之间切换)
bindsym $mod+x move workspace to output right
# 将此窗口移动到投影仪输出
bindsym $mod+x move container to output VGA1
# 将此窗口移到主输出
bindsym $mod+x move container to output primary
注意,你可能还没有一个主显示输出。运行以下命令以指定一个:
xrandr --output <显示输出> --primary
移动容器和窗口到标记区
要把一个容器移到另一个有特定标记的容器上(见类似 VIM 的标记),你可以使用以下命令。
窗口将被移到树中被标记的容器之后,也就是说,它最后的位置与你在标记的容器拥有焦点时打开一个新窗口的位置相同。如果标记是在一个分割容器上,那么窗口将作为一个新的子节点出现在该容器内当前拥有焦点的子节点之后。
格式:
move window|container to mark <标记>
举例:
for_window [instance="tabme"] move window to mark target
改变窗口和容器大小
如果要使用键盘调整容器/窗口的大小,可以使用 resize
命令:
语法:
resize grow|shrink <direction> [<px> px [or <ppt> ppt]]
resize set [width] <width> [px | ppt]
resize set height <height> [px | ppt]
resize set [width] <width> [px | ppt] [height] <height> [px | ppt]
方向可以是 up
, down
, left
或 right
之一。或者你可以不那么具体并使用 width
或 height
,在这种情况下,i3 将从所有其他容器中获取/提供空间。
可选的 pixel 参数指定容器应增大或缩小的像素数(默认值为 10 像素)。 选的 ppt 参数表示“百分比点”,如果指定,它表示平铺容器应该增长或缩小那么多点,而不是 px 值。
注意 resize set
:
建议在专用绑定模式下定义用于调整大小的绑定。有关更多上下文,请参阅 绑定模式 和 i3 默认配置中的示例。
例子:
for_window [class="urxvt"] resize set 640 480
跳转到特定窗口
通常在多显示器环境中,你会希望快速跳转到特定窗口。例如,在工作区 3 上工作时,你可能想要跳转到邮件客户端,向你的老板发送电子邮件,告知你已经实现了一些重要目标。与其弄清楚如何导航到邮件客户端,不如使用快捷方式。你可以使用 focus
命令。
语法:
[class="class"] focus
[title="title"] focus
例子:
# 进入下一个打开的 VIM 实例
bindsym $mod+a [class="urxvt" title="VIM"] focus
类似 VIM 的标记(mark 和 goto)
此功能类似于跳转功能:它允许你直接跳转到特定窗口(这意味着切换到适当的工作区并将焦点设置到窗口)。 但是,你可以使用任意标签直接标记特定窗口,然后再使用它。 你可以使用 unmark 命令以相同的方式取消标记标签。 如果你不指定标签,取消标记将删除所有标记。 你不需要确保你的窗口具有唯一的类或标题,也不需要更改你的配置文件。
由于该命令需要包含要用于标记窗口的标签,因此不能简单地将其绑定到一个键。
i3-input
是为此目的创建的工具:它允许你输入命令并将命令发送到 i3。
它还可以为该命令添加前缀并为输入对话框显示自定义提示。
如果窗口已经有这个标记,附加的 --toggle
选项将删除该标记,否则将添加它。
请注意,你可能需要将此与 --add
(见下文)结合使用,否则任何其他标记都将被删除。
--replace
参数使 i3 删除任何现有标记,这也是默认行为。
你可以使用 --add
标志在窗口上放置多个标记。
如果你不想在窗口装饰中显示标记,请参阅 显示标记。
语法:
mark [--add|--replace] [--toggle] <identifier>
[con_mark="identifier"] focus
unmark <identifier>
你可以使用 i3-input
提示输入标记名称,然后使用 mark
和 focus
命令创建并跳转到自定义标记:
例子:
# 读取 1 个字符并用该字符标记当前窗口
bindsym $mod+m exec i3-input -F 'mark %s' -l 1 -P 'Mark: '
# 读取 1 个字符并转到带有该字符的窗口
bindsym $mod+g exec i3-input -F '[con_mark="%s"] focus' -l 1 -P 'Goto: '
或者,如果你不想弄乱 i3-input
,你可以为一组特定的标签创建单独的绑定,然后只使用这些标签:
例子(在终端):
# 标记焦点容器
mark irssi
# 从任何有它的容器中删除标记“irssi”
'[con_mark="irssi"] focus'
# remove the mark "irssi" from whichever container has it
unmark irssi
# 删除所有 firefox 窗口上的所有标记
[class="(?i)firefox"] unmark
窗口标题格式
默认情况下,i3 将简单地打印 X11 窗口标题。
使用 title_format
,可以通过将格式设置为所需的输出来自定义。
该指令支持 Pango markup 和以下将被替换的占位符:
%title
对于普通窗口,这是 X11 窗口标题(_NET_WM_NAME 或 WM_NAME 作为后备)。当在没有窗口的容器上使用时(例如,选项卡式/堆叠布局内的拆分容器),这将是容器的树表示(例如,“H[xterm xterm]”)。
%class
X11 窗口类(WM_CLASS 的第二部分)。这对应于 class
标准,请参阅 命令标准。
%instance
X11 窗口实例(WM_CLASS 的第一部分)。这对应于 instance
标准,请参阅 命令标准。
使用 for_window 指令,你可以根据 命令标准 为任何窗口设置标题格式。
语法:
title_format <format>
例子:
# 给焦点窗口一个前缀
bindsym $mod+p title_format "Important | %title"
# 以粗体打印所有窗口标题
for_window [class=".*"] title_format "<b>%title</b>"
# 以红色打印 Firefox 窗口的窗口标题
for_window [class="(?i)firefox"] title_format "<span foreground='red'>%title</span>"
改变边框样式
要更改当前客户端的边框,可以使用 border normal
使用普通边框(包括窗口标题),border pixel 1
使用 1 像素边框(无窗口标题)和 border none
使客户端无边框。
还有 border toggle
可以切换不同的边框样式。可选的像素参数可用于在切换到普通和像素样式时指定边框宽度。
请注意,“像素”是指逻辑像素。在 HiDPI 显示器上,一个逻辑像素由多个物理像素表示,因此 pixel 1
可能不一定转换为单个像素行宽边框。
语法:
border normal|pixel|toggle [<n>]
border none
# 旧语法,相当于 "border pixel 1"
border 1pixel
例子:
# 使用窗口标题,但没有边框
bindsym $mod+t border normal 0
# 不使用窗口标题和粗边框
bindsym $mod+y border pixel 3
# 既不使用窗口标题也不使用边框
bindsym $mod+u border none
启用共享内存日志
如 https://i3wm.org/docs/debugging.html 中所述,i3 可以记录到共享内存缓冲区,你可以使用 i3-dump-log
转储该缓冲区。shmlog
命令允许你在运行时启用或禁用共享内存日志记录。
注意在使用 shmlog <size_in_bytes>
时,当前的日志会被丢弃并启动一个新的日志。
语法:
shmlog <size_in_bytes>
shmlog on|off|toggle
例子:
# 启用/禁用日志记录
bindsym $mod+x shmlog toggle
# 或者,从终端:
# 将共享内存日志缓冲区增加到 50 MiB
i3-msg shmlog $((50*1024*1024))
启用调试日志
debuglog
命令允许你在运行时启用或禁用调试日志记录。
调试日志记录比非调试日志记录详细得多。
此命令不会激活共享内存日志记录 (shmlog),因此很可能与上述 shmlog 命令结合使用。
语法:
debuglog on|off|toggle
例子:
# 启用/禁用日志记录
bindsym $mod+x debuglog toggle
重载重启和退出
你可以使用 reload
使 i3 重新加载其配置文件。
你还可以使用 restart
命令就地重新启动 i3 以使其摆脱某种奇怪的状态(如果应该发生的话)或执行升级而不必重新启动 X 会话。
要正确退出 i3,你可以使用 exit
命令(简单地终止您的 X 会话也可以)。
例子:
bindsym $mod+Shift+r restart
bindsym $mod+Shift+w reload
bindsym $mod+Shift+e exit
Scratchpad
有两个命令可以将任何现有窗口用作便笺窗口。move scratchpad
将一个窗口移动到暂存器工作区。
这将使它不可见,直到你再次显示它。你将无法打开该工作区。
相反,当使用 scratchpad show
时,窗口将再次显示为浮动窗口,以你当前的工作区为中心(在可见的便签簿窗口上使用 scratchpad show
将使其再次隐藏,因此你可以使用键绑定来切换)。
请注意,这只是一个普通的浮动窗口,因此如果你想“将其从便笺窗口中删除”,你可以简单地使其再次平铺(floating toggle
)。
顾名思义,这对于拥有一个随时可用的带有你最喜欢的编辑器的窗口很有用。 但是,你也可以将它用于你不想一直看到的其他永久运行的应用程序:你的音乐播放器、alsamixer,甚至是邮件客户端……?
语法:
move scratchpad
scratchpad show
例子:
# 使当前聚焦的窗口成为便笺簿
bindsym $mod+Shift+minus move scratchpad
# 显示第一个便笺簿窗口
bindsym $mod+minus scratchpad show
# 显示 sup-mail 暂存窗口,如果有的话。
bindsym mod4+s [title="^Sup ::"] scratchpad show
Nop
有一个无操作命令 nop
允许你覆盖默认行为。这对于禁用鼠标中键单击时的焦点更改很有用。
可选的注释参数被忽略,但会被打印到日志文件中以供调试。
语法:
nop [<comment>]
例子:
# 禁用点击标题栏的焦点变化
# 使用鼠标中键
bindsym button2 nop
i3bar 控制
每个 i3bar 实例的配置中有两个选项可以在运行时通过 i3 调用命令来更改。
命令 bar hidden_state
和 bar mode
允许分别设置每个 bar 的当前 hidden_state 模式选项。
还可以在隐藏状态和显示状态以及停靠模式和隐藏模式之间切换。
每个 i3bar 实例都可以通过指定 bar_id 来单独控制,如果没有给出,则对所有 bar 实例执行该命令。
语法:
bar hidden_state hide|show|toggle [<bar_id>]
bar mode dock|hide|invisible|toggle [<bar_id>]
例子:
# 在隐藏状态和显示状态之间切换
bindsym $mod+m bar hidden_state toggle
# 在停靠模式和隐藏模式之间切换
bindsym $mod+n bar mode toggle
# 设置id为'bar-1'的bar实例切换到隐藏模式
bindsym $mod+b bar mode hide bar-1
# 将 id 为 'bar-1' 的 bar 实例设置为始终隐藏
bindsym $mod+Shift+b bar mode invisible bar-1
多显示器
正如你在网站上的目标列表中所看到的,i3 在开发时特别考虑了对多显示器的支持。本节将解释如何处理多显示器。
当你只有一个显示器时,事情很简单。你通常从显示器上的工作区 1 开始,然后根据需要打开新的工作区。
当你有一个以上的显示器时,每个显示器将得到一个初始工作区。第一个显示器得到 1,第二个得到 2,第三个得到 3。当你切换到其它显示器上的工作区时,i3 将先切换到该显示器,然后再切换到该工作区。这样一来,你就不需要用特定的快捷键来切换到一个显示器,也不需要记住你把哪个工作区放在哪个显示器上。新的工作空间将在当前活动的显示器上打开。不会存在一个没有工作区的显示器。
使用全局工作区的想法是基于这样的观察:大多数用户在他们额外显示器上的工作区个数通常非常有限。它们通常被用于一个特定的任务(如浏览器、shell)或者用于监视一些东西(如邮件、IRC、系统日志……)。因此,在一个显示器上使用一个工作区,而在其他显示器上使用所有其余的工作区往往是说得通的。然而,由于你可以在 i3 中创建无限数量的工作空间,并将它们与特定的屏幕绑定,所以你可以通过改变配置(例如使用 modes)来模拟每个屏幕有几个工作空间的“传统”方式。
配置显示器
如果你以前从未使用过多显示器,为了帮助你开始工作,这里有一个关于xrandr选项的简短概述,你可能会感兴趣。获取当前屏幕配置的概览总是很有用的。只要运行 "xrandr",你就会得到类似的输出:
$ xrandr
Screen 0: minimum 320 x 200, current 1280 x 800, maximum 8192 x 8192
VGA1 disconnected (normal left inverted right x axis y axis)
LVDS1 connected 1280x800+0+0 (normal left inverted right x axis y axis) 261mm x 163mm
1280x800 60.0*+ 50.0
1024x768 85.0 75.0 70.1 60.0
832x624 74.6
800x600 85.1 72.2 75.0 60.3 56.2
640x480 85.0 72.8 75.0 59.9
720x400 85.0
640x400 85.1
640x350 85.1
这里有几件事很重要。你可以看到 LVDS1
被连接了(当然,它是内部显示器),但 VGA1
没有。如果你有一个显示器连接到了端口,但 xrandr 仍然显示 "disconnected",你应该检查你的连接线、显示器或图形驱动程序。
你可以在第一行末尾看到的最大分辨率是显示器的最大组合分辨率。默认情况下,它通常太低,必须通过编辑 /etc/X11/xorg.conf
来更改。
下面假设你连接了 VGA1
,想把它作为一个额外的屏幕使用:
xrandr --output VGA1 --auto --left-of LVDS1
这个命令使 xrandr 尝试找到 VGA1
设备的原始分辨率,并将其配置在你的内部显示器的左边。当再次运行 "xrandr" 时,输出将看起来像这样:
$ xrandr
Screen 0: minimum 320 x 200, current 2560 x 1024, maximum 8192 x 8192
VGA1 connected 1280x1024+0+0 (normal left inverted right x axis y axis) 338mm x 270mm
1280x1024 60.0*+ 75.0
1280x960 60.0
1152x864 75.0
1024x768 75.1 70.1 60.0
832x624 74.6
800x600 72.2 75.0 60.3 56.2
640x480 72.8 75.0 66.7 60.0
720x400 70.1
LVDS1 connected 1280x800+1280+0 (normal left inverted right x axis y axis) 261mm x 163mm
1280x800 60.0*+ 50.0
1024x768 85.0 75.0 70.1 60.0
832x624 74.6
800x600 85.1 72.2 75.0 60.3 56.2
640x480 85.0 72.8 75.0 59.9
720x400 85.0
640x400 85.1
640x350 85.1
请注意 i3 和 xrandr 使用相同的 API,所以 i3 识别的显示器和 xrandr 命令显示的一样。
在做展示一节可以看到更多关于多显示器的配置。
多显示器环境下的有趣设置
如果你有一个以上的显示器,你可能会对在 i3 中的这几项配置感兴趣:
-
你可以指定哪个工作区应该放在哪个屏幕上。这允许你在启动时有一组不同的工作区,而不是只在第一个显示器上有一个工作区,第二个显示器有第二个,以此类推。参见自动将工作区放到指定显示屏。
-
如果你想让某些应用程序(如 MPlayer、Firefox、……)通常在大屏幕上打开,你可以把它们分配到一个特定的工作区,见自动将客户端放到指定工作区。
-
如果你在许多显示器上都有许多工作区,可能就很难记住你把哪个窗口放在了哪里。因此,你可以使用类似 vim 的标记来快速切换窗口。参见类似 VIM 的标记。
-
关于如何在显示器之间移动现有工作区的信息,请参见移动容器或工作区到 RandR 输出。
i3 和你的其他软件
显示状态栏
在大多数的窗口管理器用户中,一个非常常见的事情是屏幕某个角落的状态行。它通常是传统桌面环境任务栏中小部件的绝佳替代品。
如果你还没有找到你最喜欢的方式来生成这样的状态行(自己编写的脚本,conky 等),那么推荐使用 i3status 这个工具。它是用 C 编写的,目的是使用尽可能少的系统调用来减少 CPU 从睡眠状态唤醒的时间。因为 i3status 只输出文本,所以你需要将它与其他一些工具结合起来,比如 i3bar。有关如何在 i3bar 中显示 i3status 的信息,请参阅 状态栏命令。
无论你使用哪个应用程序来显示状态行,你都希望确保它使用 EWMH 提示注册为停靠窗口。i3 会将窗口定位在屏幕顶部或底部,具体取决于应用程序设置的提示。使用 i3bar,您可以配置其位置,参阅 i3bar 位置。
做展示(多显示器)
在进行演示时,你通常希望观众看到你在屏幕上看到的内容,然后浏览一系列幻灯片(如果演示很简单)。对于更复杂的演示,你可能希望有一些只有你可以在屏幕上看到的注释,而观众只能看到幻灯片。
例子一:每个人都得到相同的输出
这是简单的情况。你将计算机连接到视频投影仪,打开(计算机和视频投影仪)并配置 X 服务器以将计算机的内部平板克隆到视频输出:
xrandr --output VGA1 --mode 1024x768 --same-as LVDS1
然后 i3 将使用屏幕分辨率的最低通用子集,屏幕的其余部分将保持不变(它将显示 X 背景)。因此,在我们的示例中,这将是 1024x768(我的笔记本电脑有 1280x800)。
例子二:你可以看到比你的观众更多的东西
这个更难的情况。首先,你应该在内部平板附近的某处配置 VGA 输出,例如输出右边部分:
xrandr --output VGA1 --mode 1024x768 --right-of LVDS1
现在,i3 将在新屏幕上放置一个新工作区(取决于您的设置),并且你将处于多显示器模式(参阅 multi_monitor)。
由于 i3 不是合成窗口管理器,因此无法同时在两个屏幕上显示一个窗口。然而,你的演示软件需要完成这项工作(即在每个屏幕上打开一个窗口)。
高分辨率(HIDPI)
有关如何在 Linux 桌面的各个部分启用缩放的详细信息,请参阅 https://wiki.archlinux.org/index.php/HiDPI。i3 会从 Xft.dpi 属性读取所需的 DPI 值。该属性默认为 96 DPI,因此要实现 200% 缩放,你需要在 ~/.Xresources
中设置 Xft.dpi: 192。
如果你是刚得到新显示器的 i3 用户,请仔细确认:
- 你在 i3 配置中使用了可缩放字体(以 "pango:" 开头)。
- 你正在使用支持缩放的终端模拟器。你可以暂时切换到 gnome-terminal,它以支持开箱即用的扩展而闻名,直到你弄清楚如何在你最喜欢的终端模拟器中调整字体大小。
贡献者
以下排名不分先后: