Linux 平铺窗口管理 Hyprland 简易入门

Linux Tilling Window Manager Hyprland Simple Guide

Posted by Fioncat on March 29, 2024

screenshot

screenshot

在使用了多年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下面,目前最主流就两个:SwayHyprland。我为什么使用了后者?主要是:

  • 我以前并没有使用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完成。

如果输出的xwayland0,那么该应用是原生在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码,即可完成配对。