从 GNOME 迁移到 i3

8 minute read

本文记录一下在我的 Manjaro 上从 GNOME 迁移到 i3-gaps 的经历,也可以为在其它 Arch 系发行版上安装 i3-gaps 提供一些参考。i3 是一种平铺窗口管理器(tiling window manager)。我在本机安装 i3 之前先在虚拟机上尝试了一下 Manjaro 的 i3 edition 以熟悉一下 i3 的 key bindings,以下在配置时有所参考它的默认配置。


安装

i3-wmi3-gaps 这两个包都提供 i3 window manager,而且它们互相冲突。由于我在虚拟机中体验的是 i3-gaps 所以这里就用了 i3-gaps 这个版本。

使用 pacman 安装 i3-gaps。安装之后在目录 /usr/share/xsessions 中会出现 i3.desktop,直接重启即可在 gdm 菜单中看到 i3,选择它再输入密码登录即可进入 i3。 Gdm 是在安装 GNOME 的时候安装的,也可以选择其它的登录管理器。

再安装一些基本的程序,如 dmenu 或者 dmenu-manjaro(推荐),终端和顶栏。我使用的终端是 termite,顶栏是 polybar


由于没有图形化的菜单,所以 i3 中的配置基本上都是手写配置文件。我的 i3 配置文件 ~/.config/i3/config 是在 Manjaro i3 edition 的默认配置基础上修改的。

软件配置

fcitx

需要将 fcitx 加入自动启动的程序中,因为 GNOME 会自动启动 fcitx 而 i3 不会。需要注意的是如果使用 vim 的 fcitx.vim 插件的话不能以 root 的身份启动 fcitx(如将 fcitx 命令放在 ~/.xprofile 中),不然打开 vim 时出现 fcitx.vim 插件报错:

socket file of fcitx not found, fcitx.vim not loaded.

原因是 /tmp/fcitx-socket-:1 这个 socket 的所有者是 root,fcitx.vim 对它没有写权限。启动命令最好放在 i3 的配置文件中,即在 ~/.config/i3/config 中加入:

exec --no-startup-id fcitx

GNOME Keyring 自动解锁

如果使用 startx 启动 i3,那么需要额外的配置来使 GNOME Keyring 自动解锁。根据 Arch Wiki,自动解锁需要使用其中的「PAM method」。修改文件 /etc/pam.d/login,将

auth optional pam_gnome_keyring.so

加入 auth section 的末尾,再将

session optional pam_gnome_keyring.so auto_start

加入 session section 的末尾。然后将以下内容加入 ~/.xinitrc

eval "$(/usr/bin/gnome-keyring-daemon --start --components=pkcs11,secrets,ssh)"
export SSH_AUTH_SOCK

设置墙纸

可以使用 feh 来设置墙纸,使用命令

feh --bg-fill <image file>

在 i3 启动时自动执行该命令即可。

notify-send

使用 notify-send 发现并没有显示通知。此时需要安装一个 notification daemon,我选的是 dunst。将它加入 i3 自动启动的程序中或者利用 systemd 自动启动即可。

Termite 透明背景

使用 termite 的透明背景功能需要安装 xcompmgr 并让它自动启动。

设置 xdg-open 使用的程序

参考 Arch Wiki,修改 ~/.config/mimeapps.list(没有就创建该文件),如下:

[Default Applications]
application/pdf=org.pwmt.zathura.desktop
image/png=sxiv.desktop

截图

使用 scrot。写一个脚本以支持不同的使用方式并使用 zenity 选择保存位置,如 这个脚本。并在 ~/.config/i3/config 中添加:

bindsym Print exec --no-startup-id /path/to/screenshot.sh --whole
bindsym $mod+Shift+Print exec --no-startup-id /path/to/screenshot.sh --window
bindsym Shift+Print --release exec --no-startup-id /path/to/screenshot.sh --select

这样的效果是使用 PrtSc 截取全屏,Shift+PrtSc 截取一个区域,Super+Shift+PrtSc 截取当前的窗口。

挂载

在 i3 中没有自带 GNOME 中插入 U 盘自动挂载的功能,不过可以利用 dmenu 写一个选择并挂载 drive 的脚本 (link),再给这个脚本绑定一个快捷键即可。

图片和 PDF 阅读器

由于从 GNOME 3.32 开始一些 GNOME 应用的标题栏变得很厚,evince 和 gthumb 在 i3 这种平铺窗口管理器下有一个很高的标题栏,所以打算换一个阅读器。选择的图片阅读器是 sxiv,PDF 阅读器是 zathura。对应的配置文件在我的 dotfiles 仓库里。

QQ

在 GNOME 使用 QQ 我是用的 archlinuxcn/deepin.com.qq.office 这个包。但是在 i3 中启动时会报 X Error of failed request,解决方法是安装 xsettingsd,将其挂在后台再启动 QQ。

xsettingsd 的配置文件可以通过先运行 /usr/lib/gsd-xsettings 再使用 xsettingsd 自带的 dump_xsettings 命令获取,将命令的输出写入 ~/.config/xsettingsd/xsettingsd.conf,然后将以 GtkGdk 开头的行全部删除。

硬件相关

连接 WiFi、蓝牙

安装 network-manager-appletblueman,再设置自动启动 nm-appletblueman-applet 即可,重新登录(或者手动启动这两个程序)即可在系统托盘看到对应的菜单。

开机时自动打开蓝牙:编辑文件 /etc/bluetooth/main.conf,将 [Policy] 一节中的 AutoEnable 设置为 true:

[Policy]
AutoEnable=true

Disable beeps

根据 Arch Wiki,使用命令

sudo rmmod pcspkr

或者把此设置永久化:

echo "blacklist pcspkr" | sudo tee /etc/modprobe.d/nobeep.conf

Remap CapsLock

我一般会将 CapsLock 键映射成 Ctrl 键,可以利用 ~/.Xmodmap 文件进行设置:

clear lock
clear control
add control = Caps_Lock Control_L Control_R
keycode 66 = Control_L Control_L Control_L Control_L

然后在 ~/.xinitrc 中加入 xmodmap ~/.Xmodmap。这样设置之后就无法通过键盘中的某一个键实现 CapsLock 了,如果需要的话可以使用 xdotool key Caps_Lock 命令来触发。

注意!

用这种方法对执行 xmodmap 命令后连接的键盘没有效果。经过一番调研1,2,一个解决方案是使用 inotifywait 监控 /dev/input 中的新设备并在有新设备时执行 xmodmap 命令,写一个 脚本 并设置自动启动即可。

触摸板相关

目标:

  • 轻拍触摸板相当于按键
  • 触摸板自然滚动(natrual scrolling)

参考 这里,将以下内容写入文件 /etc/X11/xorg.conf.d/90-touchpad.conf

Section "InputClass"
        Identifier "touchpad"
        MatchIsTouchpad "on"
        Driver "libinput"
        Option "Tapping" "on"
        Option "TappingButtonMap" "lrm"
        Option "NaturalScrolling" "on"
        Option "ScrollMethod" "twofinger"
EndSection

重启或注销再登录即可看到效果。

多显示器

配置多个显示器可以使用 xrandr 工具。图形化的配置工具可以使用 arandr 这个包。

暖色屏幕(night shift)

在晚上将屏幕颜色调成偏暖眼睛看得舒服些。在 GNOME 中内置了这个功能,在 i3 中可以安装 redshift 来达到相同的效果。安装后可通过 systemd 自动开启,使用

systemctl --user enable redshift

或者如果想要状态栏的图标:

systemctl --user enable redshift-gtk

锁屏

想要达到以下的效果:

  • 定时锁定
  • 合上屏幕自动锁定
  • 锁屏后短时间黑屏

利用 xsetxss-lock 配合锁屏工具 i3lockxset 用于设置屏幕黑暗时间,xss-lock 可以监控 DPMS 信号并自动执行锁屏程序。在 i3 配置文件中加入

exec --no-startup-id xss-lock -n /path/to/dim-screen.sh -- /path/to/lock.sh -i

dim-screen.sh 修改自 xss-lock 的仓库,lock.sh 如链接。

音量/亮度调节键

参考 StackOverflow 上的一个 答案,安装 xorg-xbacklight 并将以下五行加入 ~/.config/i3/config

bindsym XF86AudioMute exec "amixer sset 'Master' toggle"
bindsym XF86AudioLowerVolume exec "amixer sset 'Master' 5%-"
bindsym XF86AudioRaiseVolume exec "amixer sset 'Master' 5%+"
bindsym XF86MonBrightnessUp exec "xbacklight -inc 5"
bindsym XF86MonBrightnessDown exec "xbacklight -dec 5"