i3wm的使用说明

1. 默认键位

给那些“太长不看”的人,以下图片是默认热键。

与$mod(Alt)一起按:

Alt

与Shift+$mod一起按:

Alt+Shift

红色按键是你需要按的修饰键(默认配置),蓝色按键是盲打键位。

要注意的是,若是没有配置文件就启动i3,i3-config-wizard 会帮助你创建一个配置文件,键位位置会跟上图所示一样,不管你是什么键盘布局。
如果你喜欢上图的设置,可以拒绝 i3-config-wizard的引导,默认以 etc/i3/config 作为配置文件

2. 使用i3

贯穿整个使用文档,关键字$mod将当作已配置好的修饰键,修饰键默认为Alt键(Mod1),windows(Mod4)键也是一个受欢迎的替换方案

2.1 打开虚拟终端和移动位置

打开一个新的虚拟终端是非常简单的操作,默认情况下,这个操作的组合键是 $mod+Enter ,默认配置下是Alt+Enter。按下$mod+Enter,将会打开一个新的虚拟终端,它将占满你屏幕的所有空间。

termialFillTheScreen

如果你现在打开另一个虚拟终端,i3会把屏幕空间一分为二,各占一半。新创建的窗口会被i3放在已有窗口的旁边(宽屏)或者下面(竖屏)

newATerminal

要在两个终端之间移动焦点,你可以使用vi编辑器风格的方向键。然而,在i3里,盲打键位就是方向键(vi编辑器里的方向键为了兼容大多数键盘布局,都向左移动了一个键位)。因此,$mod+j是向左,$mod+k是向上,$mod+l是向下,$mod+;是向右。像上图的情况,用$mod+k$mod+l在两个终端之间切换。当然,你也可以使用箭头方向键。

现在,你的workspace是按特定方向(默认水平方向)划分(容器里包含两个终端)。你可把每个window都再分离一次(水平或者垂直),就像workspace一样。“window”指一个容器包含一个X11窗口(如一个浏览器或者一个终端),“split container”指的是容器包含一个或多个窗口。

TODO:picture of the tree

垂直分割窗口,在创建新窗口前按$mod+v,水平分割窗口,按$mod+h

2.2 改变容器布局

一个split container 可以设置成下面所列出的布局之一。

splith/splitv

容器里的每个窗口都获得等量大小的空间。splith 控制每个窗口在彼此的左右方。splitv 控制每个窗口在彼此的上下方。

stacking

容器里只显示一个正在活动的窗口。在容器上方得到一个窗口的列表。

tabbed

与stacking是一个原理,不过tabbed的窗口列表是单行显示的标签页。

切换模式:$mod+e打开splith/splitv,$mod+s打开stacking,$mod+w打开tabbed

layoutmode

2.3 把一个窗口切换到全屏模式

把一个窗口全屏显示或者退出全屏,按 $mod+f

在i3里还有全局全屏模式,那么这个窗口将占据所有的显示输出(多屏显示)(配置命令: fullscrren toggle global

2.4 打开其他应用程序

除了通过终端打开应用程序,你也可以使用dmenu来打开程序,默认情况下通过$mod+d调出。只需要输入你要打开的应用的名字(或者是名字的一部分),应用必须在$PATH中才能正常打开。

另外,如果你有一个需要经常打开的应用,你可以创建一个组合键来直接打开它,细节请看 配置 部分.

2.5 关闭窗口

如果一个程序未提供一个关闭的机制(很多程序都提供了一个关闭方案,Esc键或者一个快捷键,比如Ctrl+w),你可以按$mod+Shift+q 来杀掉这个窗口。对于支持 WM_DELETE 协议的应用程序,它将正确地关闭(保存任何修改或进行其他清理)。如果程序不支持 WM_DELETE 协议。X server 将杀掉这个程序并且之后的动作取决与此程序。

2.6 使用workspaces

使用工作空间是分组归类一堆窗口的好方法。默认情况下,你处在第一个workspace,就像i3bar左下角所指示的一样。要切换到其他workspace,按下$mod+数字键(你要切换到的workspace的数字)。如果工作空间不存在,它将被创建。

一个常见的例子是把网页浏览器放在第一workspace,聊天工具放在另一个workspace,还有另一个你运行的其他软件放在第三个workspace。当然,你可以不必照着做。

如果你拥有多个显示屏,在启动时将会在每个屏幕创建一个workspace。如果你打开一个新的workspace,他会绑定到你正在工作的显示屏。当你切换一个在其他 显示屏的workspace时,i3会把焦点设置到那个显示屏。

2.7 移动一个window到另一个workspace

移动一个窗口到另一个工作空间,按$mod+Shift+目标工作区数字。跟切换workspaces时一样的情况,如果目标工作空间不存在,它将被创建。

2.8 调整窗口大小

调整容器大小最简单的办法是用鼠标:拖拽边框到想要的大小。

你也可以定义快捷键来调整,可以看看这个例子,default config--由i3提供

2.9 重启i3

为了重启i3你可以使用$mod+Shift+r(例如当有一个bug时,恢复到正常状态,或者升级到一个新版本i3)。

2.10 退出i3

不关掉Xserver且利落地退出i3,你可以按$mod+shift+e。通常,会有一个对话向你确认是否退出。

2.11 浮动模式

浮动模式是相对于平铺模式的。窗口的位置和大小不是由i3自动管理的,而是由你手工调整。使用这个模式有违于平铺模式,但是他对一些案例如"Save as"对话窗口,或者toolbar窗口(GIMP或类似的)是有用的。这些窗口通常会设置恰当的提示和默认情况下被打开于浮动模式。

你可以通过按$mod+Shift+space来切换一个窗口的浮动模式。通过鼠标拖动标题栏,你可以移动这个窗口,通过拖动边框,你可以调整窗口大小。你也可以通过使用floating_modifier来操作。另一个调整浮动窗口大小的方法是鼠标右击标题栏并且拖拽。

关于用键盘来调整浮动窗口的大小,请看调整大小的绑定模式,由i3提供
default config

浮动窗口一直处于平铺窗口的上方

3 树

i3保存着所有关于 X11 output 的数据,workspace和窗口布局在里面是树形图的结构。根节点是X11根窗口,随后是X11 putputs,然后是 dock areas 和一个 content container,随后是workspace,最后是window本身。在旧版本的i3,每个workspace有多个list和table,这个方法的结果是难以使用(真的难),理解和实现。

3.1 树是由容器组成的

我们把树的组件叫做Containers。一个容器可以掌控一个窗口(意思是一个X11 window,你可以真正看到的,使用的,比如说一个浏览器)。另外,Containers可以再包含一个或者多个Containers。一个简单的workspace例子是:当你在单个显示器打开i3时,只有一个workspace,你这时打开了两个终端,你最后得到的树是:

Two terminals on standard workspace

tree

3.2 定位和Split Containers

当以树作为数据结构时,为了构建一个布局,使用所谓的 Split Containers 是很正常的。在i3里,每个容器都有属于自己的方位(水平,垂直,或者未指定),并且定位取决于上一级容器的布局(垂直的有splitev和stacking,水平的有splith和tabbed)。所以我们以一个workspace作为例子,workspace 容器的默认布局是splith(如今很多显示器是宽屏的)。如果你把布局切换成splitv(默认情况下按$mod+v)然后打开两个终端,i3会把你的窗口设置成这个样子:

vertical

从version 4开始,i3多了一个有趣的新特性,它能够分割任何东西:让我们假设你现在在workspace里打开了两个终端(以splith布局打开,也就是水平定位)焦点处于右边的终端,现在你想要要在当前终端下面打开另外一个终端。如果你直接打开新终端,它会被放在最右边而不是下面。解决办法是按$mod+v用splitv布局来分割容器(要打开Horizontal Split Container,用$mod+h)。现在你可以在当前终端下面打开一个新终端了:

Vertical Split Container

tree

你可能已经猜到了:它能够无限分割到下一层。

3.3 聚焦于父容器

$mod+a

我们继续以上图为例。我们在左边有一个终端,右边有两个垂直分布的终端,焦点处在右下角的终端。当你又打开一个新终端,他会被放在右下角终端的下面。

所以说,要怎么把新终端放到右边而不是下面呢,答案是使用focus parent,它会把焦点转移到当前容器的父容器。在这种情况下,你会把焦点放在水平方向的workspace里的vertical split Container。因此,新窗口会被打开在Vertical Split Container的右边:

Focus parent, then open new terminal

3.4 隐式容器

在一些情况下,i3需要隐式地创建一个容器来完成你的命令。

一个例子如下:你在单个显示器启用i3,在单个workspace打开3个终端。workspace节点在i3的layout tree里,这些终端窗口直属于workspace节点。默认workspace节点的方向设置是水平的。

现在你往下移动其中一个终端($mod+Shift+k by default)。那么workspace节点会被设置成垂直布局,你移动的这个终端就会出现在屏幕的下面并且直属于workspace。一个新的容器被创建,用于容纳另外两个终端。当你切换到tabbed模式,你会注意到这个情况。你最终会得到一个有标签页容器,里面有两个窗口(比如 "H[urxvt firefox]"),还有一个你刚才移动到下面的终端窗口。

4 配置i3

到这里,真正有趣的事情才刚刚开始;-)。很多东西都非常依赖于你样要的工作环境,所以我们无法提供一个默认的且合理的配置。

虽然没有使用编程语言来进行配置,i3在你希望让窗口管理器怎么做的方面依然保持着灵活的特性。

例如,你可以配置一个绑定用来跳到指定的窗口,可以设置打开指定的应用程序到指定的workspace,可以自动启动某个程序,可以改变i3的配色,还可以设置快捷键来做一些有用的事情。

要改变i3的配置,复制 /etc/i3/config~/.i3/config并且用一个文本编辑器来编辑它(或者是复制到~/.config/i3/config,如果你喜欢XDG目录方案)

第一次启动i3时,i3会引导你创建一个配置文件,你可以告诉向导程序在配置文件里设置Alt(Mod1)或windows(Mod4)键作为辅助按键。当然,创建的配置文件会使用你当前键盘布局的键盘符号。要启动向导程序,请在终端输入命令i3-config-wizard
请确认你当前并没有~/.i3/config/。否则向导程序将会退出。

4.1 备注

在配置文件里使用备注是可行的和推荐的,为了以后参考或修改,适当地记录你的配置。备注以#开始,而且只能用在每行的开头:

例子

# This is a comment

4.2 字体

i3支持以 X core字体和 FreeType 字体来渲染窗口标题

你可以使用xfontsel(1) 生成一个 X core字体类型。你需要使用一个支持ISO-10646编码的字体来显示特殊字符(Unicode)。

一个FreeType字体类型是由一个字体系列,风格,粗细,便提,伸延组成的,FreeType字体支持从右到左的渲染和往往比 X core字体支持更多的Unicode符号。

如果i3不能打开配置好的字体,i3会吧错误输出到日志文件,退回到可以工作的字体

语法:

font <X core font description>
font pango:<family list> [<style options>] <size>

例子:

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

4.3 键盘绑定

一个键盘绑定会让i3在按下特定的按键后执行一个命令。i3允许以keycode或keysym绑定(你可已随便更改绑定,虽然i3并不会帮你解决键位冲突)

  • Keysym(key symbol)是指键盘上的符号。像是"A"或者"B",但是像是那些奇怪的"underscore"而不是"_"。这些符号是你们用Xmodmap重新映射的按键。要获得当前键盘的映射,使用命令 xmodmap -pke 。要以交互方式输入一个按键,查看它是被设置成什么keysym,使用命令 xev

  • Keycode 不需要拥有一个已赋值符号(方便某些笔记本热键),而且他们即使在你换了键盘布局后,也不会改变keycode本身(当使用xmodmap)。

我的建议是:如果你经常更换键盘布局,但是不想改变绑定键位的物理位置,使用keycodes。如果你不改变键盘布局,而且想要一个简单干净的配置文件,使用keysyms。

某些工具(例如import或者xdotool)可能无法运行在一些KeyPress事件,因为键盘/指针被占用了。针对这些情况,可以使用 --release 标记,这将在按键被松开后执行命令。

语法:

bindsym [--release] [<Group>+][<Modifiers>+]<keysym> command
bindcode [--release] [<Group>+][<Modifiers>+]<keycode> command

例子:

# Fullscreen
bindsym $mod+f fullscreen toggle

# Restart
bindsym $mod+Shift+r restart

# Notebook-specific hotkeys
bindcode 214 exec --no-startup-id /home/michael/toggle_beamer.sh

# Simulate ctrl+v upon pressing $mod+x
bindsym --release $mod+x exec --no-startup-id xdotool key --clearmodifiers ctrl+v

# Take a screenshot upon pressing $mod+x (select an area)
bindsym --release $mod+x exec --no-startup-id import /tmp/latest-screenshot.png

可以使用的修饰键:

Mod1-mod5,Shift,Control

默认修饰请看 xmodmap(1)

Group1, Group2, Group3, Group4
当使用多个键盘布局(例如setxkbmap -layout us,ru)时,您可以指定哪个XKB组(也称为“布局”)键盘绑定应处于活动状态。默认的,键盘绑定会被转换成Group1并且活跃在所有键盘布局。如果你想为其中一个键盘布局重写键盘绑定,指定到相应的group。为了向后兼容,“Mode_switch” 是Group2的别名。

4.4 鼠标绑定

在容器范围内按下一个已经绑定的鼠标按键,i3将会执行一个命令。你可以用绑定键盘的方法设置鼠标绑定。

语法:

bindsym [--release] [--border] [--whole-window] [<Modifiers>+]button<n> command

默认的,绑定只会在点击到标题栏的时候运行。如果添加了--release标记,它会在按键松开时运行。

如果添加了--whole-window标记,绑定会在你点击到窗口任何一个部位时运行,但是边框除外。为了让一个绑定在点击到边框时运行,指定一个--border标记。

例子:

# The middle button over a titlebar kills the window
bindsym --release button2 kill

# The middle button and a modifer over any part of the window kills the window
bindsym --whole-window $mod+button2 kill

# The right button toggles floating
bindsym button3 floating toggle
bindsym $mod+button3 floating toggle

# The side buttons move the window around
bindsym button9 move left
bindsym button8 move right

绑定模式

你可以拥有多套键位绑定模式,当你切换到其他绑定模式的时候,所有当前键位绑定会被释放,并且只有你新切换的绑定模式生效。唯一的预设的绑定模式是defalut的,他伴随i3的启动,并且没有定义任何指定的绑定模式。

使用绑定模式有以下两部分组成:定义一个绑定模式和切换到它。为了做到这个,需要一个配置指令和一个命令,他们被称为mode。配置指令被用来定义一组绑定并且把它放到一个绑定模式,而命令是用来切换到一个绑定模式。

建议与[variables]组合使用绑定模式,以便维护更容易。以下是一个简单案例

请注意定义一个退回默认模式的绑定键

注意,可以使用[pango_markup]来设置绑定模式, 但是你需要通过添加 --pango_markup标记给定义模式来明确地开启它。

语法

# config directive
mode [--pango_markup] <name>

# command
mode <name>

例子

# Press $mod+o followed by either f, t, Esc or Return to launch firefox,
# thunderbird or return to the default mode, respectively.
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 Esc mode "default"
    bindsym Return mode "default"
}

4.6 浮动调节

移动浮动窗口。你可以选择其中一个方式,1拖动标题栏,2配置可以通过按键和鼠标点击窗口来移动窗口的浮动调节器。最常见的设置是用与管理窗口相同的按键(例如Mod1)。也就是说,你可以按住Mod1,同时鼠标左键点击拖动动窗口到你想要的方位。

当你按住浮动调节器时(Mod1),你可以通过按住鼠标右键并拖动,来调整那一个窗口的大小。如果你同时按住了Shift键,窗口将会按比例缩放(宽高比会保留)。

语法

floating_modifier <Modifier>

例子

floating_modifier Mod1

4.7 限制浮动窗口的大小

浮动窗口的最大最小面积可以被指定。如果其中的floating_maximum_size被指定为-1,那么对于窗口的最大值将不会被约束。如果其中的floating_maximum_size为定义,或者被制定为0,i3会使用默认值来限制窗口最大值。floating_minimum_size的处理方法一定程度上与floating_maximum_size的相同。

语法

floating_minimum_size <width> x <height>
floating_maximum_size <width> x <height>

例子

floating_minimum_size 75 x 50
floating_maximum_size -1 x -1

4.8 工作区的定位

新工作区有一个默认合适的定位:宽屏用水平定位,竖屏用垂直定位。

你可以重写default_orientation的行为

语法

default_orientation horizontal|vertical|auto

例子

default_orientation vertical

4.9 新容器的布局模式

这个选项决定了工作区级别的容器该用什么布局模式

语法

workspace_layout default|stacking|tabbed

例子

workspace_layout tabbed

4.10 新窗口的边框风格

此选项决定新窗口拥有什么样的边框风格。默认是normal。注意,new_float 仅应用于作为浮动窗口呼出的窗口。例如对话窗口,而不是到后来才被设置成浮动窗口的窗口。

语法

new_window normal|none|pixel
new_window normal|pixel <px>
new_float normal|none|pixel
new_float normal|pixel <px>

例子

new_window pixel

"normal" 和 "pixel" 边框风格支持设置边框像素大小的可选项。

例子

# The same as new_window none
new_window pixel 0

# A 3 px border
new_window pixel 3

4.11 隐藏靠近屏幕边缘的边框

你可以使用hide_edge_borders来隐藏与屏幕边缘靠近的边框。如果你使用滚动条的话这很有用,或者不想浪费甚至两像素的显示空间。"smart"选项是在工作区内只有一个可见窗口时才隐藏边框,而在工作去内有多个窗口,他不会隐藏边框。

语法

hide_edge_borders none|vertical|horizontal|both|smart

例子

hide_edge_borders vertical

4.12 指定窗口的任意命令(for window)

使用for_window指令,当i3碰到特定的窗口,你可以让i3执行任何命令。它可以用在让窗口浮动,改变他们的边框的方面,等。

语法

for_window <criteria> <command>

例子

# enable floating mode for all XTerm windows
for_window [class="XTerm"] floating enable

# Make all urxvts use a 1-pixel border:
for_window [class="urxvt"] border pixel 1

# A less useful, but rather funny example:
# makes the window floating as soon as I change
# directory to ~/work
for_window [title="x200: ~/work"] floating enable

有效的命令请command_criteria

4.13 不把焦点放在新建窗口

当一个新窗口出现时,焦点会移到它那里。no_focus 指令允许预防这种情况发生,而且它必须与command_criteria一起使用

注意,他不会在所有情景下生效,例如,当数据正输送给一个运行中的程序,使得焦点必须移到它身上。设置这种情况的行为,参考focus_on_window_activation

在工作区的第一个窗口中,no_focus也会被忽略,在这种情况下,没有理由不把焦点放在这个窗口。与workspace_layaout结合使用会有更好是可用性。

语法

no_focus <criteria>

例子

no_focus [window_role="pop-up"]

4.14 变量

正如您在有关键盘绑定的章节中了解到的,你将要配置许多包含修饰键的绑定,如果你想要保存一些输入并能够改变你之后要用的修饰键,那么变量就很方便了。

语法

set $<name> <value>

例子

set $m Mod1
bindsym $m+Shift+r restart

在解释过程中,变量会在文件中被替换。变量扩张不是递归的,所以不可能用一个包含另一个变量的值来定义变量。对于这个没有其他的想法,而且绝对没有改变的计划。如果你需要更多的动态配置,你应该创建一些用来生成配置文件在i3启动之前运行的脚本。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容