I3 (简体中文)

From ArchWiki
Jump to: navigation, search
翻译状态: 本文是英文页面 i3翻译,最后翻译时间:2017-03-22,点击这里可以查看翻译后英文页面的改动。

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

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

安装

安装 i3 软件包组,这个组里包含了:

  • i3-wm:窗口管理器
  • i3statusi3blocks:这两个软件都可以通过管道向 i3bar 输送系统状态消息
  • i3lock 则专于锁屏

从显示管理器启动

i3-wm 软件包自带了 i3.desktop,可以支持将 i3 作为 Xsession 启动。i3-with-shmlog.desktop 这个入口则附加了日志功能(对于调试很有用)。i3-gnomeAUR 软件包则把 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 键盘上的四个导航键 jkl 和 "分号" on a Qwerty keyboard会被映射在拥有相同位置的按键上,举例说,Dvorak 键盘上的 htns。这个小戏法的副作用是 最多十五个按键会被以一种破话位置记忆的方式被映射 - 所以,对于 Dvorak 用户, “重启”被绑定于 $mod1+p 而不是 $mod1+r,“竖直分割”被绑定于 $mod1+d 而不是 $mod1+h,类似的还有更多。

因此,其他键盘布局的用户若是想要直截了当的,符合教程中给出的按键绑定的键盘绑定,可能更倾向于不去使用 "config wizard" 。这可以拷贝 /etc/i3/config~/.config/i3/config (或 ~/.i3/config),然后编辑此文件。

注意,用户也可以建立一份以键码为基础的配置。例如,对于那些经常切换键盘布局,但是想要 i3 的键盘绑定保持相同的用户。

颜色主题

Tango-preferences-desktop-locale.pngThis article or section needs to be translated.Tango-preferences-desktop-locale.png

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可选方案

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 || py3statusAUR

状态栏中的图标字体

'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):

Merge-arrows-2.pngThis article or section is a candidate for merging with Internationalization.Merge-arrows-2.png

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
提示: 示范配置文件中用 eth0wlan0 作为接口名,如果与您系统并不一致,请参考 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, 即执行虚拟终端的脚本。它会试图按以下顺序一一执行,直到成功启动某虚拟终端:

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

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

关机,重启和锁屏

虽说并没有现成的关机,重启或锁屏按钮,但我们可以添加热键以实现。首先我们需要创建脚本,并储存为 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"

Merge-arrows-2.pngThis article or section is a candidate for merging with List of applications/Security#Screen lockers.Merge-arrows-2.png

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

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

屏幕保护器及电源管理

您可以用 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] 作出响应,即根据来自X服务器的信号,运行或是杀死锁屏器。以下能把 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
 }

疑难排除

Tango-preferences-desktop-locale.pngThis article or section needs to be translated.Tango-preferences-desktop-locale.png

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

普遍问题

很多时候,你遇到的 bug 在开发中的版本就被修复了。可以从 AUR 上的 i3-gitAURi3status-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

绑定快捷键不起作用

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 来指定一个主显示输出。你也可以试试按照 [6] 显式地指定一个具体的输出,或者干脆删掉这行配置。[7] 关于显示输出的细节可以参看 Xrandr 页面. 自从 i3 4.12 版本起,由 i3-config-wizard 生成的默认配置已经不再包含这行配置了。

参见

Arch Linux Forums