< 返回博客

切换到i3wm


在Linux上,能被用户直接接触到的软件和应用大都不止一个选择,桌面环境更是一片百花争鸣的景象:用户量大的就有好多,KDE、Gnome、Xfce、Unity,比较小众的也有Deepin、Lxde等等。流行点的桌面环境我大都用过,这些桌面环境各有特色,每个都有自己的用户定位。比如Gnome系的桌面都走的简约大方路线,使用上向Mac靠拢;而windows用户使用KDE很容易上手,而且KDE在方便使用的同时,可定制性也相当的高;Xfce的设计理念则更加符合Unix哲学中模块化的思想,将一个个小组件拼装成一个功能强大的集合,可定制性特别地高,但想要用的好也就不容易,一年前我就是因为Xfce上的QT5主题一直弄不好才弃坑转向开箱即用的KDE,现在想来还是当时水平不够。总的来说,就我个人而言,对程序员来说,一个桌面环境能称得上优秀,外观是一方面,更重要的是在易用性和可玩性之间找到一个合适的平衡点——用户不会因为上手难而放弃,也不会在用户想要很多功能时找不到直接的接口(说的就是你Gnome)。在这点上我认为KDE算是做的比较好的,开箱即用,外观美观大方,功能齐全,想要的基本都有。要在GEEK和“Don't Make Me Think”之间进行权衡,这点在任何面向最终用户的产品设计中都是重要的原则

当然,即使在Gnome中,所有功能也都可以通过其他模块实现,但这里仅仅是就桌面环境而言,这些也就不谈。

而我今天要介绍的i3wm——一款算不上桌面环境(DE)的窗口管理器(WM),这个桌面(暂且这样称呼)的设计绝对不符合我上面的标准:D,它不是一个足够优秀的桌面环境,但的的确确是足够好用的桌面(如果会用的话)。

i3是一种动态的平铺式窗口管理器,所谓平铺式,就是窗口不会被重叠放置,窗口的分布由窗口管理器管理。由于不会重叠,鼠标操作也就可以减到很少,在i3中,几乎所有操作通过键盘都可以完成。

基本安装使用

各发行版都是可以直接从包管理器中获得i3以及其他组件,相关的安装和基本配置我这里就不啰嗦了,有任何疑问可以查阅Arch的文档官方文档

配置注意

这里我主要记录一下配置i3时遇到的问题以及注意的事情。

  • 不用Alt做修饰键。i3默认修饰键为Alt_L,但是这个按键很常用,先不说Emacs用户,就是在各种shell下的快捷键默认用的Emacs绑定,ALT根本冲突到不能用,所以后来我换到了Super键,也就是键盘上印着微软或苹果的标志的那个键,一般来说这个按键非系统软件不会用到,就是按起来有点费劲。

  • i3中的方向键绑定。刚开始看到i3中的快捷键,心想这不就是vim的快捷键嘛,舒服。结果两分钟后我就难受了,它的方向键是j,k,l,;,也就是刚好吧vim的方向键向右推一个键,以避免与Mod+h键(指定水平分割)冲突。这样一来,及其难受,之后慢慢适应吧:crystal_ball:。

  • i3bar的字体问题。i3bar中有的特殊Unicode字符无法显示,这个Arch的文档里面有提到,但一开始没看到。为了使i3bar看上去不那么单调,我在Unicode中找到了一些特殊字符,点缀i3bar中的信息,但这些字符无法显示出来,因为我在i3bar中只用到了Droid Sans Mono for Powerline这一个字体,这个字体中没有实现这个Unicode字符,也就无法显示了。解决方式Arch文档里有写,就是装上ttf-font-awesome这个字体,将其设置到i3bar中,这个字体中包含一些特殊字符。具体见状态栏中的图标字体

  • 壁纸自动切换。i3自身是不带壁纸管理的,我用的feh作为壁纸管理器。主要命令是feh --bg-fill /path/to/wallpapers --randomize。这个命令没执行一次,文件夹里面的图片就会被随机选取一个设置为i3的壁纸,可以直接把这行命令加入到i3config里,但是这样只能每次登录更换一次壁纸。所以我写了个小脚本来自动切换壁纸。

    #! /usr/bin/bash
    while :; do
        feh --bg-fill ~/Photo/Wallpapers/ --randomize
        sleep 10
    done
    

    保存这个脚本到环境变量,在i3的config中运行这个脚本,每过10s壁纸就会换一次。

    但是还有个问题就是,这个脚本有可能同时运行两个实例,导致壁纸切换的速度改变。这里可以使用flock命令解决这个问题,flock会在运行一个程序前检查一个指定的文件锁,如果该文件锁存在,则可以选择等待或停止运行该程序;文件锁不存在,则会建立文件锁,成功后运行程序。有了这个小工具,那么就可以在i3的config中加入

    exec --no-startup-id flock -n ~/.cache/autofeh.lock ~/.local/bin/autofeh
    

    其中~/.local/bin/autofeh是我的脚本的路径。

    flock命令的原理是flock(2)系统调用,有兴趣的可以man 2 flock看一下。

  • 主题和字体。Linux下的GUI软件主要在QtGTK+两个框架下编写,所以每个桌面(环境)都会不可避免地牵扯到Qt和GTK+的主题样式问题(这方面Gnome做的很好,表扬:+1:),在Ubuntu下两个框架的风格很统一(说是两个,其实是四个:GTK2,GTK3,QT4,QT5),一般几乎感觉不到差异,其他的环境可能都需要或多或少地配置一下。在这里总结一下配置用的工具:

    • GTK2——gtk-theme-switch2

    • GTK3——lxappearance

    • QT4——qtconfig-qt4

    • QT5——qt5ct

    这些东西都是可以自己找配置文件自己改的,但是我懒得弄,就找工具代做了,省时省力。

今天就先总结这么多。