在使用了多年KDE之后,我终究还是把自己的开发机桌面环境切换到了平铺式。作为一个VIM老手,我一直坚信能用键盘的地方就尽量不用鼠标。平铺模式从很多角度来说都非常符合我的xp,只能说相见恨晚。
我从DE切换到WM的过程并不艰辛,但毕竟也是一个折腾的过程。因此留下这篇博文权当一个记录。
为什么是平铺?
我们平时用的最多的桌面环境,诸如Windows、MacOS以及大部分Linux桌面环境,都是所谓“堆叠式”的。即窗口之间可以互相叠放,这非常利于用鼠标进行操作,也非常直观。
但是当我们需要快速切换到不同窗口时,一般的电脑用户可能习惯于到任务栏点选,熟练的用户可能习惯于使用快捷键。但是不管怎样,当窗口快速增多时,堆叠模式效率必然会下降。并且在寻找窗口、调整窗口大小、调整位置时,都不可避免需要用鼠标来操作。对于需要高度集中于编程的我来说,并不喜欢频繁切换键盘和鼠标。因此这种传统的模式并不适合于我。
到这里,平铺式窗口管理就呼之欲出了。这种模式将所有窗口平铺在桌面上面,并且互相不重叠。这样我们完全可以使用键盘来在不同窗口之间切换,并且一眼就可以看见当前打开窗口的所有内容。
当然,如果你有几十个窗口,把它们全部塞在一张桌面上面是不现实的,这会导致每个窗口都非常小。因此一般的平铺窗口管理器都会提供工作区的功能,每个工作区都是一个新的桌面。我们可以用键盘来切换工作区、将应用移动到别的工作区等。
其实,目前大部分的主流桌面环境,包括Windows、MacOS、KDE、Gnome等,都有提供类似的功能,包括窗口分屏、多工作区模式等。但是它们或多繁琐,或多不易使用。当然,也不乏在这些环境基础上面搭建新的管理器,例如yabai就是一个非常优秀的MacOS下的平铺管理器。
从堆叠到平铺的切换过程,其实更多是从DE到WM的切换过程。平铺窗口管理器一般都不是完整的桌面环境,它们不像我们熟知的KDE或Gnome那样,提供系统设置、应用启动器、状态栏等。它们都只提供最原始的窗口管理,其他功能都需要其他软件来完成。这恰好符合Linux软件的一个设计原则:只做一件事,且把它做好。
使用WM,我们可以只安装需要的软件,不用再担心桌面管理程序吃掉太多资源(其中很多功能我们几乎用不到)。
平铺窗口管理并不适合所有人,甚至不适合大部分人,它永远都应该是类似VIM这样小众的工作模式。在尝试它之前,应该先问自己几个问题:
- 我熟悉Linux系统吗?
- 我有没有精力折腾Linux桌面环境?
- 我习惯完全用键盘来操作窗口吗?
如果这几个问题有一个是否定的,放弃平铺,去用KDE / Gnome吧。
为什么是Hyprland?
如果了解Linux混沌的桌面环境现状,一定避不开一个话题,就是X11和Wayland的问题。Wayland作为X11的替代者,这几年社区一直在推进,至于效果就仁者见仁了。
但是到了今天,我实际用下来,Wayland已经处于可用状态了。并且实际上有xorg-xwayland这样的东西存在,X11的软件也都基本能跑起来(除了个别过分依赖xorg特性的)。
Wayland目前最致命的问题还是对于N卡的支持问题,因为NVIDIA官方驱动并没有对Wayland做适配(Linus:Fxxk you, NVIDIA!),因此只能用开源驱动。如果你用是的N卡,建议不要尝试Wayland。
X11下最经典的平铺桌面管理器是i3,也有一众其它不同的WM可供选择。
Wayland下面,目前最主流就两个:Sway和Hyprland。我为什么使用了后者?主要是:
- 我以前并没有使用i3,因此不存在将配置从i3切换过来的需求,不需要Sway的“兼容i3配置”。
- Hyprland比Sway更加酷炫,支持圆角窗口、平滑以及淡出淡入特效等。
- Hyprland对于输入法的支持更加好。
- Hyprland对于多显示器的支持比Sway更好,支持为不同显示器配置不同分辨率。
如果你是老的i3用户,想快速切换到Wayland下面,Sway是更好的选择,因为它兼容i3的配置文件。
Hyprland安装
Hyprland是可以和其他DE共存的,如果你现在用的是KDE或者Gnome,同样可以安装和体验Hyprland。只需要在登录的时候选择你需要进入的桌面环境。
在Arch下,安装Hyprland:
1
2
3
4
sudo pacman -S hyprland
# 因为大部分软件都是X11,需要这个来支持在Wayland中运行它们
sudo pacman -S xorg-xwayland
安装其他一些非必要的软件:
1
2
3
4
5
6
sudo pacman -S hyprpaper # 用于更换桌面壁纸
sudo pacman -S swaylock-effects # 用于实现锁屏
sudo pacman -S waybar # 状态栏
sudo pacman -S mako # 通知
yay -S rofi-lbonn-wayland-git # 应用启动器,rofi的Wayland版本
sudo pacman -S kitty # Hyprland的默认终端
另外,还有一些工具类的软件可以选择性安装:
1
2
3
4
5
6
7
8
9
10
11
sudo pacman -S thunar # 文件管理器,来自于xfce
sudo pacman -S ristretto # 图片浏览器,来自于xfce
sudo pacman -S nm-connection-editor # 网络管理器
sudo pacman -S blueman # 蓝牙管理器
sudo pacman -S lxappearance # 用于更换应用主题
# 用于进行截屏,注意,flameshot在Wayland下用不了
sudo pacman -S grim slurp swappy
# 剪切板工具
sudo pacman -S wl-clipboard cliphist
到这里,Hyprland以及常用软件就安装好了,你可以退出桌面环境,进入tty,使用命令Hyprland
(注意大写)进入Hyprland环境。
推荐使用SDDM来登录并切换不同的桌面环境(如果你已经安装了SDDM或者别的启动器,请跳过这一步):
1
2
3
4
5
sudo pacman -S sddm
sudo systemctl enable sddm
# 进入SDDM
sudo systemctl start sddm
在SDDM,应该可以选择进入Hyprland或其他不同的桌面环境。
Hyprland基本配置
Hyprland提供了一个默认的配置能够让你快速开始,这里需要对其中的配置做一些简单的变更,下面是一些参考。
Hyprland的配置文件在.config/hypr/hyprland.conf
。Hyprland默认情况下会帮你生成一个配置文件,这会导致Hyprland产生告警,第一件事在配置文件中找到下面这行并删除:
1
autogenerated=1
状态栏
在启动的时候打开状态栏:
1
2
3
# ~/.config/hypr/hyprland.conf
exec-once = waybar
关于如何配置waybar,请参考:waybar wiki。
壁纸
在启动的时候配置壁纸:
1
2
3
# ~/.config/hypr/hyprland.conf
exec-once = hyprpaper
壁纸配置在另外一个文件:.config/hypr/hyprpaper.conf
下。它支持给不同显示器配置不同配置,甚至是配置随机壁纸。如果你只有一张壁纸,可以这么配置:
1
2
3
4
# ~/.config/hypr/hyprpaper.conf
preload = /path/to/wallpaper.png
wallpaper = HDMI-A-2,/path/to/wallpaper.png
HDMI-A-2
是你的显示器名称,可以用hyprctl monitors
命令查看。
关于更加高级的壁纸配置方法,参考:Hyprpaper Usage。
通知和输入法
在启动的时候,配置通知和输入法:
1
2
3
4
5
6
7
8
9
10
11
12
# ~/.config/hypr/hyprland.conf
exec-once = mako # 通知
exec-once = fcitx5 # 输入法
# 输入法环境变量
env = XIM,fcitx
env = XIM_PROGRAM,fcitx
env = INPUT_METHOD,fcitx
env = GTK_IM_MODULE,fcitx
env = QT_IM_MODULE,fcitx
env = XMODIFIERS,@im=fcitx
基本快捷键
在平铺窗口中,我们一般使用Super
作为快捷键(Windows下的Win键,Mac下的Command键)。你也可以改为Alt
等其它方案。
下面是常见的快捷键绑定配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# ~/.config/hypr/hyprland.conf
# Super + Return:打开终端。这里替换为你喜欢的终端。
bind=SUPER, RETURN, exec, kitty
# Super + Q:关闭窗口
bind=SUPER, Q, killactive,
# Super + F:全屏化当前窗口
bind=SUPER, F, fullscreen, 0,
# Super + D:应用启动器
bind=SUPER, D, exec, rofi -show drun
# Super + U:打开浏览器。这里替换为你喜欢的浏览器。
bind=SUPER, U, exec, google-chrome-stable
# Super + P:选择区域截屏,类似于flameshot。
bind=SUPER, P, exec, grim -g "$(slurp)" - | swappy -f -
# Super + E:打开文件管理器
bind=SUPER, E, exec, thunar
# Super + Shift + Space:将当前窗口切换到浮动模式
bind=SUPERSHIFT, SPACE, togglefloating,
# Super + Shift + C:重新加载Hyprland
bind=SUPERSHIFT, C, exec, hyprctl reload
你可以根据你自己的习惯配置快捷键绑定。
剪切板历史
有时候,你可能希望查看并搜索剪切板历史,还能选择历史剪切板进行复制。这可以通过cliphist
完成。
增加下面配置以实现:
1
2
3
4
5
6
7
# ~/.config/hypr/hyprland.conf
# 监听剪切板变更
exec-once = wl-paste --watch cliphist store
# Super + V:搜索并选择剪切板历史
bind=SUPER, V, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
调整音量
我们需要绑定快捷键以让键盘的音量调整能有作用:
1
2
3
4
5
6
# ~/.config/hypr/hyprland.conf
bind=, XF86AudioRaiseVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ +5%
bind=, XF86AudioLowerVolume, exec, pactl set-sink-volume @DEFAULT_SINK@ -5%
bind=, XF86AudioMute, exec, pactl set-sink-mute @DEFAULT_SINK@ toggle
bind=, XF86AudioMicMute, exec, pactl set-source-mute @DEFAULT_SOURCE@ toggle
调整窗口大小
在平铺模式下,我们无法通过鼠标来调整窗口大小,需要进入RESIZE模式并用键盘来完成,配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# ~/.config/hypr/hyprland.conf
# Super + R:切换到RESIZE模式
bind=SUPER,R,submap,resize
submap=resize
# 在RESIZE模式下使用hjkl调整窗口大小
binde=,h,resizeactive,-10 0
binde=,l,resizeactive,10 0
binde=,k,resizeactive,0 -10
binde=,j,resizeactive,0 10
# ESC退出RESIZE模式
bind=,escape,submap,reset
submap=reset
切换窗口
使用 Super + 方向 可以切换窗口,我这里替换为了VIM的hjkl:
1
2
3
4
5
6
7
8
9
10
11
12
13
# ~/.config/hypr/hyprland.conf
# Super + hjkl:切换焦点窗口
bind=SUPER,h,movefocus,l
bind=SUPER,l,movefocus,r
bind=SUPER,j,movefocus,u
bind=SUPER,k,movefocus,d
# Super + Shift + hjkl:移动窗口
bind=SUPERSHIFT,h,movewindow,l
bind=SUPERSHIFT,l,movewindow,r
bind=SUPERSHIFT,j,movewindow,u
bind=SUPERSHIFT,k,movewindow,d
切换工作区
使用 Super + 数字 可以快速切换工作区,每个工作区都可以配置自己的名字,这里我用的是纯数字。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# ~/.config/hypr/hyprland.conf
# Super + 数字:切换工作区
bind = SUPER, 1, workspace, 1
bind = SUPER, 2, workspace, 2
bind = SUPER, 3, workspace, 3
bind = SUPER, 4, workspace, 4
bind = SUPER, 5, workspace, 5
bind = SUPER, 6, workspace, 6
bind = SUPER, 7, workspace, 7
bind = SUPER, 8, workspace, 8
bind = SUPER, 9, workspace, 9
bind = SUPER, 0, workspace, 0
# Super + TAB:切换到上一个工作区
binds {
# 切换到上一个工作区时,更加符合一般cycle逻辑
workspace_back_and_forth = false
allow_workspace_cycles = true
}
bind = SUPER, TAB, workspace, previous
# Super + Shift + 数字:将当前窗口移动到别的工作区
bind = SUPERSHIFT, 1, movetoworkspace, 1
bind = SUPERSHIFT, 2, movetoworkspace, 2
bind = SUPERSHIFT, 3, movetoworkspace, 3
bind = SUPERSHIFT, 4, movetoworkspace, 4
bind = SUPERSHIFT, 5, movetoworkspace, 5
bind = SUPERSHIFT, 6, movetoworkspace, 6
bind = SUPERSHIFT, 7, movetoworkspace, 7
bind = SUPERSHIFT, 8, movetoworkspace, 8
bind = SUPERSHIFT, 9, movetoworkspace, 9
bind = SUPERSHIFT, 0, movetoworkspace, 0
bind = SUPERSHIFT, TAB, movetoworkspace, previous
更多配置
以上只列出了基本配置,关于特效、键盘、鼠标等其它配置请参考:Hyprland wiki。
你应该在日常使用中不断寻找最适合自己的WM配置。每个人的WM配置都应该是不同的,抄作业只是一个开始!
常见问题
哪些软件跑在XWayland下面?
想知道你的哪些应用是运行在原生Wayland,哪些是在XWayland下的?可以用命令hyprctl clients
完成。
如果输出的xwayland
是0
,那么该应用是原生在wayland下运行的!例如Thunderbird:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Window 617bcb4aa920 -> Inbox - wenqian.tang@ucloud.cn - Mozilla Thunderbird:
mapped: 1
hidden: 0
at: 3,43
size: 2554,1394
workspace: 4 (4)
floating: 0
monitor: 0
class: thunderbird
title: Inbox - Mozilla Thunderbird
initialClass: thunderbird
initialTitle: Mozilla Thunderbird
pid: 1672
xwayland: 0 >>> 注意我!!!
pinned: 0
fullscreen: 0
fullscreenmode: 0
fakefullscreen: 0
grouped: 0
swallowing: 0
focusHistoryID: 3
默认的Chrome就是在XWayland下运行的:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Window 617bcb476330 -> Linux 平铺窗口管理 Hyprland 简易入门 - Fioncat的博客 | Fioncat Blog - Google Chrome:
mapped: 1
hidden: 0
at: 3,43
size: 2554,1394
workspace: 3 (3)
floating: 0
monitor: 0
class: Google-chrome
title: Linux 平铺窗口管理 Hyprland 简易入门 - Fioncat的博客 | Fioncat Blog - Google Chrome
initialClass: Google-chrome
initialTitle: New Tab - Google Chrome
pid: 1278
xwayland: 1 >>> 注意我!!!
pinned: 0
fullscreen: 0
fullscreenmode: 0
fakefullscreen: 0
grouped: 0
swallowing: 0
focusHistoryID: 5
要想让Chrome运行在Wayland下,可以执行:
1
google-chrome-stable --enable-features=UseOzonePlatform --ozone-platform=wayland
连接不了蓝牙键盘!
用Blueman,你可能无法连接蓝牙键盘!不知道为啥,Blueman在Wayland下无法正常显示键盘配对的PIN码。
这时候就需要到命令行手动连接蓝牙键盘了:
1
2
3
4
5
# 先关闭blueman,以防止冲突
killall blueman-applet
# 开始手动进行蓝牙配对
bluetoothctl
在配对模式下,输入下面的命令扫描蓝牙设备:
1
2
3
4
agent KeyboardOnly
default-agent
power on
scan on
这会输出一堆蓝牙设备的信息。从中找到你要连接的设备,记下它的MAC地址(例如,如果要连接的是HHKB键盘,应该在输出可以看到HHKB-Hybrid_1
字样),然后开始配对:
1
pair <MAC>
开始配对之后,屏幕上面会出现类似下面的PIN码:
1
2
Request PIN code
[agent] Enter PIN code: ****
正常在你的键盘上面输入PIN码,即可完成配对。