I3 (简体中文) - ArchWiki

# I3 (简体中文)

From ArchWiki
Jump to navigation Jump to search

Related articles

- Desktop environment
- Display manager
- File manager functionality
- Window manager
- Comparison of tiling window managers
- Clipboard
- Autostarting#Graphical
[broken link: invalid section]

翻译状态： 本文是英文页面 i3 的翻译，最后翻译时间：2017-03-22，点击这里可以查看翻译后英文页面的改动。

i3 是一种动态的平铺式窗口管理器，其灵感来自于面向开发者与资深用户的 wmii。

i3 的既定目标包括清晰可读的文档，完善的多显示器支持，基于树形结构的窗口管理，提供 vim 式的多种操作模式。

## 安装

安装 i3-wm 或者 i3 软件包组，后者里包含了：

- i3-wm：窗口管理器
- i3status 和 i3blocks：这两个软件都可以通过stdout向 i3bar 输送系统状态消息
- i3lock ：锁屏

Note: i3-wm 与 i3-gaps 冲突，默认安装的是 i3-gaps （原始i3加上窗口间间隔和别的功能）。

打了补丁的各种版本的i3可以在AUR里找到：

- i3-wm-iconpatch — 窗口图标支持

  https://github.com/ashinkarov/i3-extras || i3-wm-iconpatchAUR

## 启动

### 从显示管理器启动

i3-wm 软件包自带了 `i3.desktop`，可以支持将 i3 作为 Xsession 启动。`i3-with-shmlog.desktop` 这个入口则附加了日志功能（对于调试很有用）。i3-gnomeAUR和i3-gnome-gitAUR 软件包则把 `i3-wm` 集成到了 GNOME 中去。

### 从 xinitrc 启动

编辑 Xinitrc ，在其末尾添加这一行：

    exec i3

如果想记录 i3 程序所有的输出，这一行要写成：

    exec i3 -V >> ~/i3log-$(date +'%F-%k-%M-%S') 2>&1

## 使用

可在 official documentation 获取更多细节 i3 User's Guide.

## 键盘映射

在 i3 里，一切命令均以「修饰键」开头，即 `$mod`. 默认上来说是 Alt 键 `alt`(Mod1),但开始键 `Super`(Mod4) 也更为广泛接受。Super 键往往带有 Windows 图标，在苹果键盘上则是 Command 键。

见 i3 偏好 和 Using i3 以获取默认映射表。见 Keyboard 绑定 以获取添加新快捷键的说明。

非Qwerty键盘布局的用户可能会希望跳过 以下所说的“配置助手”。

### 容器

i3 以树形结构的方式管理窗口，容器是最小的单位。这种结构可以被水平或竖式分割。容器默认是平铺的，但可以设置为标签式或栈式布局，同样也可以设置为浮动式（适用于对话窗口）。浮动的窗口总是显示在顶部。

### 程序启动器

i3 使用 dmenu 作为首席程序启动器，键绑定默认为 `$Mod+d`.

i3-wm 包含了 i3-dmenu-desktop ——— 一个 "dmenu" 的Perl 包装器，它通过现成的所有程序 .desktop 文件，生成名单。 j4-dmenu-desktop-gitAUR 软件包也是一个不错的选择。

## 设置

见 Configuring i3 以获取更多细节。此文章余下部分假设 i3 的配置文件位于 `~/.config` 目录。

### 配置助手和可选键盘布局

当 i3 首次启动时，它会启动配置助手 i3-config-wizard。此工具会通过重写位于 `/etc/i3/config.keycodes` 的模板配置文件来创建 `~/.config/i3/config`。他会对默认模板造成两次修改。

1. 它会询问用户以选择默认的修饰建。它会在模板文件中添加一行，类似于 `set $mod Mod1`; 然后
2. 它会用用户设置的键盘布局相应的 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 的键盘绑定保持相同的用户。

### 颜色主题

This article or section needs to be translated.

Notes: please use the first argument of the template to provide more detailed indications. (Discuss in Talk:I3 (简体中文)#)

配置文件允许用户自定义窗口装饰颜色, 但配置文件的语法使创建或共享主题不切实际。有几个方案使这更容易, 包括各种用户贡献的主题。

- i3-style — 从储存json对象中的主题修改配置, 用于频繁调整或更改主题颜色

  https://github.com/acrisci/i3-style || nodejs-i3-styleAUR[broken link: archived in aur-mirror]

- j4-make-config — 合并配置与主题或个人配置部件, 例如本机特定的配置, 这允许快速更改主题和灵活、动态地自定义配置

  https://github.com/okraits/j4-make-config || j4-make-config-gitAUR

### 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
        }
    }

更多细节，见Configuring i3bar 。

### i3bar可选方案

一些用户可能更偏好于类似于常规 桌面环境 提供的面板。这可以通过在 i3 启动时运行面板程序达成。

例如 XFCE 面板[broken link: invalid section]，在 `~/.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

### i3status

拷贝默认的配置文件到家目录：

    $ cp /etc/i3status.conf ~/.config/i3status/config

不是所有的插件都被在默认配置文件中被定义，一些配置值对于系统也可能是无效的，所以需要相应的更新。具体见 i3status(1) 。

#### i3status可选方案

- conky — 高度可扩展系统监视器。配合 i3 的使用方法见 this tutorial

  https://github.com/brndnmtthws/conky || conky

- i3blocks — 通过 shell 脚本扩展。 它可以处理点击事件，中断，和定义或更在块的基础上更新间隔。

  https://github.com/vivien/i3blocks || i3blocks

- i3pystatus — 默认带有许多插件和选项的可扩展 Python 3 状态栏

  https://github.com/enkore/i3pystatus i3pystatus || i3pystatus-gitAUR

- i3situation — 另一个 Python 3 状态栏生成器。

  https://github.com/HarveyHunt/i3situation || i3situation-gitAUR

- j4status — 提供了状态栏，可以通过插件扩展，且是用 C 写成的。额外的插件由j4status-plugins-gitAUR.

  http://j4status.j4tools.org/ || j4status-gitAUR提供

- goi3bar — Go语言 写的 i3status 替代品。配置文件同时还有各种插件，并发选项和丰富的插件支持。

  https://github.com/denbeigh2000/goi3bar/ || goi3bar-gitAUR

- goblocks — Go语言 写的轻便快速的 i3status 替代品。

  https://github.com/davidscholberg/goblocks || goblocksAUR

- bumblebee-status — 多主题的Python状态栏生成器。

  https://github.com/tobi-wan-kenobi/bumblebee-status/ || bumblebee-status-gitAUR

- ty3status — Typescript编写的 i3status 替代品，

  https://github.com/mrkmg/ty3status || ty3status-gitAUR

#### i3status 包装器

- i3cat — 基于go语言做的包装器，它可以链接来自多个资源的输入，也可以处理鼠标操作来转发用户特定的信号到子程序。

  http://vincent-petithory.github.io/i3cat/ || i3cat-gitAUR

- py3status — 一个可扩展的基于Python的 i3status 包装器。

  https://github.com/ultrabug/py3status || py3status

#### 状态栏中的图标字体

'i3bar' 有个补丁[broken link: invalid section]负责实现对 XBM 图标的支持，不过我们也可以使用图标字体。

- ttf-font-awesome — 可以通过 CSS定制的可缩放矩阵字体。[1]显示了每个图像的 Unicode 值。

  http://fortawesome.github.io/Font-Awesome/ || ttf-font-awesome

- ttf-font-icons — 也提供了全面的图像字符，包括彼此毫无重叠的 Awesome 和 Ionicons, 也很好地避免了 Awesome 与 DejaVu Sans 的微秒重叠。

  http://kageurufu.net/icons.pdf || ttf-font-iconsAUR.

要结合这些字体，在配置文件中一种字体属性的后缀用`,`分割字体。示例：

    ~/.config/i3/config

    bar {
       ...
       font pango:DejaVu Sans Mono, Icons 8
       ...
     }

依照 pango syntax, 在逗号分割的多个字体的后面，字体大小只被设置一次，对每个字体都设置大小将会造成除了最后一个字体以外，其他的字体都被忽略。

在`~/.config/i3status/config` 中使用unicode数字添加图标。输入法在文本处理器间有所区分。 例如，插入心型图标(unicode 数字 f004):

This article or section is a candidate for merging with Internationalization.

Notes: Should be described in one place; see also ArchWiki:Requests#Input methods. (Discuss in Talk:I3 (简体中文)#)

- 在多个图形化的文本处理器(如 gedit, Leafpad) 和终端模拟器 (如 GNOME Terminal, xfce4-terminal)中: `ctrl+shift+u`, `f004`, `Enter`
- Emacs: `ctrl+x`, `8`, `Enter`, `f004`, `Enter`
- Vim (在插入模式): `Ctrl+v`, `uf004`
- urxvt: 按住 `Ctrl+Shift`, 键入`f004`

### 在窗口之间快速跳转

- quickswitch-for-i3 – 一把可在 i3 的窗口之间快速跳转，定位的 Python 实现。
- i3-wm-scripts – 用正则表达式在窗口之间进行搜索并跳转
- winmenupy 启动 dmenu 时就会依次列出工作空间上的一系列客户端，选定其中一个并跳转即可

### i3status

首先我们得把默认设置文件复制到 home 目录，以好工作：

    $ cp /etc/i3status.conf ~/.i3status.conf

提示： 示范配置文件中用 `eth0` 和 `wlan0` 作为接口名，如果与您系统并不一致，请参考 Network configuration#Device names[broken link: invalid section]

。

#### 添加温度状态

如果您想在往 i3status 添加您的 CPU 温度状态，在 `~/,i3status.confg` 添加以下几句：

    ~/.i3status.conf

    order += "cpu_temperature 0"
    cpu_temperature 0 {
            format = "T: %degrees °C"
        max_threshold = 65
            path = "/sys/devices/platform/coretemp.0/temp1_input"
    }

如果温度报告它无法读取温度数值，那修改一句：

    path = "/sys/class/thermal/thermal_zone0/temp"

### 修改工作区的名称

注意: 工作区即 workspace

虽说不是必须的，但很多人期望能给常用工作区起名。首先您需要确定您期望哪些工作区固定在哪些显示器。在虚拟终端执行 `xrandr` 下，它告诉您当前您有哪些现成的显示器。一般来说，会有代表笔记本的 LVDS1, 或是 VGA1, HDMI1, HDMI2 等等，即外接显示器。如果您在用 Xinerama, 那显示器名称要改用 xinerama-0, xinerama-1 等等。在 `~/.i3/config` 上添加您设想的工作区名称，您就也得在「移动所在窗口到任意工作区的命令」上加以修改。

    # Workspace names
    workspace "1:Web" output LVDS1
    workspace "2:Mail" output LVDS1
    workspace "3:Irc" output LVDS1
    workspace "4:Shell" output LVDS1

    # switch to workspace
    bindsym $mod+1 workspace 1:Web
    bindsym $mod+2 workspace 2:Mail
    bindsym $mod+3 workspace 3:Irc
    bindsym $mod+4 workspace 4:Shell

    # move focused container to workspace
    bindsym $mod+Shift+1 move container to workspace 1:Web
    bindsym $mod+Shift+2 move container to workspace 2:Mail
    bindsym $mod+Shift+3 move container to workspace 3:Irc
    bindsym $mod+Shift+4 move container to workspace 4:Shell

### 让程序启动时，只出现在指定工作区

为了效率，您可以规定某些程序在启动时，自动出现在指定的工作区里。有两种途径：您可以用 `assign` 命令，那当手动启动某程序时，它直接被导向您指定的工作区。例如：

    # 把 URxvt 导向 workspace 2
    assign [class="URxvt"] 2

或者，如果您有修改了工作区名称，那您就要用新工作区名，而不是原来的数字：

    # 把 URxvt 导向 workspace 4:Shell
    assign [class="URxvt"] 4:Shell

注意: 为了确定一个窗口的 class, title, instance 等等，您可以用该工具 `xprop`, 通过安装 xorg-xprop 可得。

再次，您还可以通过 `i3-msg` 在工作区之间跳转，间隔地自动执行常用程序：

    exec --no-startup-id i3-msg 'workspace 1:Web; exec /usr/bin/firefox'
    exec --no-startup-id i3-msg 'workspace 2:Mail; exec urxvt -name Mail -e /usr/bin/mutt'
    exec --no-startup-id i3-msg 'workspace 3:Irc; exec /usr/bin/urxvt -name irssi -e /usr/bin/irssi'
    exec --no-startup-id i3-msg 'workspace 4:Shell; exec /usr/bin/urxvt'

### 标签式或层叠式的网络浏览器

有些网络浏览器并没有实现 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

### 虚拟终端

默认来说，当您按 `$mod+Return`, 便会启动 `i3-sensible-terminal`, 即执行虚拟终端的脚本。它会试图按以下顺序一一执行，直到成功启动某虚拟终端：

- `$TERMINAL`
- urxvt
- rxvtAUR
- terminator
- EtermAUR
- atermAUR
- xterm
- gnome-terminal
- roxtermAUR
- xfce4-terminal

您可以直接通过以下句的修改，以指定特定虚拟终端

    bindsym $mod+Return exec i3-sensible-terminal

### 便笺本

能有个便笺本以快速呼出并粘贴是多么派得上用场啊！i3 让您能够把窗口送往「便笺本工作区」。它基本上一直被隐藏起来，直到您通过 `scratchpad show` 命令呼出它。要把当前窗口送往便笺本工作区，用 `$mod+Shift+minus`，或是通过`$mod+minus` 呼出它。往 `~/.i3/config` 添加以下几句：

    # 把当前窗口设为便笺本
    bindsym $mod+Shift+minus move scratchpad

    # 呼出第一个便笺本
    bindsym $mod+minus scratchpad show

您可以选个喜爱的编辑器进启动程序列表，并自动送往便笺本巩固走去，好随时快速呼出。以下例子示范了如果在 `~/.i3/config` 添加以下，您则可以启动 urxvt 虚拟终端，附带着 nano 编辑器，以及自动送往便笺本：

    # 自动启动被特定了名称的虚拟终端，
    exec --no-startup-id urxvt -name scratchpad -e /usr/bin/nano
    # 当激活时，送往便笺本
    for_window [class="URxvt" instance="scratchpad"] move scratchpad

### 主题与配色方案

配置文件允许定制窗口颜色，但严重依赖具体的语法，使得用户不方便创造或分享主题。不过好在已有旨在简化这方面的现成项目，提供了众多用户分享的主题，可应用于您的配置上。T

- i3-style 通过 JSON 对象来修改您的主题，该格式为折腾配色方案而诞生。 nodejs-i3-styleAUR[broken link: archived in aur-mirror]
- j4-make-config 在您原本的配置基础上，追加某种用户所分享，或由您定制的主题，以便灵活地调整配置。 j4-make-config-gitAUR.

### 关机，重启和锁屏

虽说并没有现成的关机，重启或锁屏按钮，但我们可以添加热键以实现。首先我们需要创建脚本，并储存为 `i3exit`。别忘了用 `chmod +x` 命令把它设为可执行文件并放进 `$PATH`。该脚本假设您安装了 polkit 包，后者允许普通用户执行 power management 命令。

    #!/bin/sh
    lock() {
        i3lock
    }

    case "$1" in
        lock)
            lock
            ;;
        logout)
            i3-msg exit
            ;;
        suspend)
            lock && systemctl suspend
            ;;
        hibernate)
            lock && systemctl hibernate
            ;;
        reboot)
            systemctl reboot
            ;;
        shutdown)
            systemctl poweroff
            ;;
        *)
            echo "Usage: $0 {lock|logout|suspend|hibernate|reboot|shutdown}"
            exit 2
    esac

    exit 0

在 `~/.i3/config` 中添加以下：

    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 i3exit lock, mode "default"
        bindsym e exec --no-startup-id i3exit logout, mode "default"
        bindsym s exec --no-startup-id i3exit suspend, mode "default"
        bindsym h exec --no-startup-id i3exit hibernate, mode "default"
        bindsym r exec --no-startup-id i3exit reboot, mode "default"
        bindsym Shift+s exec --no-startup-id i3exit shutdown, mode "default"

        # back to normal: Enter or Escape
        bindsym Return mode "default"
        bindsym Escape mode "default"
    }
    bindsym $mod+Pause mode "$mode_system"

This article or section is a candidate for merging with List of applications/Security#Screen lockers.

Notes: The following does not belong here, it's not like that i3lock can be used only with i3 (Discuss in Talk:I3 (简体中文)#)

有些对 i3lock 的替代方案，特别地有「模糊效果」：

- i3lock-wrapper from i3-extras repo (AUR: i3lock-wrapperAUR[broken link: package not found])
- i3lock-blurAUR

### 屏幕保护器及电源管理

您可以用 DPMS 实现黑屏，或是睡眠／关掉您的显示器。在 `~/.i3/config` 添加以下，效果是显示器闲置十分钟后就会自动睡眠。

    exec --no-startup-id xset dpms 600

用 xss-lock 可以对您的 i3 session 加以定义锁屏器。xss-lock 会追踪系统事件并作出应有的反应： `suspend`, `hibernate`, `lock-session`, and `unlock-session` 比如锁屏并等待，直到用户解除锁屏或是杀死锁屏器的进程。它也能对 X screensaver[broken link: invalid section] 作出响应，即根据来自Ｘ服务器的信号，运行或是杀死锁屏器。以下能把 xss-lock 加进开机自启动程序：

    xss-lock -- i3lock -i background_image &

### 网速显示

可以把上游的脚本修改来用。这个脚本已经具有自动查找网卡的能力。如果需要自行指定网卡：

- 用 `ip addr` 命令找到你的网卡代号，如`wlan0`
- 在 `/sys/devices` 路径下，用如下命令来确认网卡是存在的:

     $ find /sys/devices -name wlan0

把上面的脚本下载到适当的位置 (比如 `~/.config/i3`) ，把你想观测的网卡代号写进去。

- 把这个脚本改为可执行属性

     $ chmod +x ~/.i3/config/net-speed.sh

- 修改`~/.i3/config` 中对应章节：

     bar {
       status_command exec ~/.i3/config/net-speed.sh
     }

## 疑难排除

### 通用

很多时候，你遇到的 bug 在开发版中被修复了。可以从 AUR 上的 i3-gitAUR 与 i3status-gitAUR 编译安装最新的开发版。上游（即 i3 项目开发者）希望你能用开发版再试试看能否重现问题 [2] 延伸阅读：Debug - Getting Traces#General.

### i3 信息栏上的某些按钮不能用

举例：`i3-nagbar` 上的“Edit Config”按钮是要调用 `i3-sensible-terminal` 命令的。这就需要你的终端模拟器能够被i3识别。

### 平铺的终端窗口中出现折行错乱

从 v4.3 版本起，i3 会无视平铺窗口的扩大提示（size increment hints）[3]。这就带来了折行错乱等问题。平铺之前尝试先把窗口改成浮动状态，可以绕过这个问题。

### 鼠标指针总处于忙碌状态

当启动了某些并不支持启动提醒的脚本或程序时，鼠标指针会逗留在忙碌状态六十秒左右。

为排除此现象，凡是 `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` 参数，使命令在松开按键之后执行 [4]：

    bindsym --release Print exec --no-startup-id scrot
    bindsym --release Shift+Print exec --no-startup-id scrot -s

### 画面撕裂现象

因为 i3 的双倍缓冲实现得不到位，会出现画面撕裂或闪烁。安装并配置好 compton 可以解决这一问题。[5]

### 看不到系统托盘图标

为了让 `tray_output primary` 这一行配置生效，有时需要用 xrandr 来指定一个主显示输出。你可以试试按照 tray_output 显式地指定一个具体的输出，或者干脆删掉这行配置[6]。 关于显示输出的细节可以参看 Xrandr 页面. 自从 i3 4.12 版本起，由 i3-config-wizard 生成的默认配置已经不再包含这行配置了。

### Spotify 的默认工作区

普通的 `assign` 是不行的，要用 `for_window`，例如：

    ~/.config/i3/config

    ...
    for_window [class="Spotify"] move to workspace $ws10

## 参见

- Comparison of tiling window managers
- Official website
- Source code
- Suspend/resume service files[broken link: invalid section]
- Collection of scripts and patches
- Deepin Wiki 上的 i3 中文条目
- 好用的 titling wm——i3wm

Arch Linux Forums

- The i3 thread - A general discussion about i3
- i3 desktop screenshots and config sharing

Categories:

- Tiling WMs (简体中文)
- Dynamic WMs (简体中文)

Hidden categories:

- Pages with ignored display titles
- Pages with broken section links
- Pages or sections flagged with Template:Translateme
- Pages with broken package links
- Pages or sections flagged with Template:Merge