如果你想要一款漂亮的、面向未來的視窗管理器,Ivon推薦你一定要試試Hyprland!
Hyprland是使用wlroots函式庫寫成的視窗管理器兼Wayland合成器,由Vaxry(vaxerski)開發,2022年5月推出正式版。2024年6月,Hyprland成為獨立的合成器,不再基於wlroots開發。
它跟Sway一樣,都是為純Wayland的Linux環境準備的,替代過去以X為主的視窗管理器。
相較於Sway意圖模仿i3wm,Hyprland作者有自己更多的想法。Ivon很滿意的部分是,Hyprland能輕鬆自定義外觀和按鍵設定,且預設的樣子就不錯看了,內建圓角、模糊、透明效果可以調,不用再裝其他程式。
Hyprland支援觸控板手勢、Nvidia閉源驅動、bspwm或i3的視窗排列方式,功能多樣。
Hyprland甚至有內建看板娘Hypr-chan呢!可惜後來移除了,得自己下載桌布。
即使擁有華麗特效,開機RAM佔用才500MB出頭而已,讓你高效率操作電腦的同時,又不佔用太多系統資源。
雖然如此,Hyprland仍不是開箱即用的「桌面」,你需要花點時間配置。它畢竟是視窗管理器,需要搭配其他程式才會好用。設定時勤讀官方文件、配置設定檔、手動寫啟動服務是免不了的。
這篇教學文章Ivon盡量把常用的功能都包進去,使讀者可以手動配置出一個大致能用的Hyprland桌面,再融入我的一點個人化配置。
環境#
- 裝置:MSI Modern 15 A10RBS
- 系統:Arch Linux
- 核心版本:6.6.4
- CPU:Intel i5-10210u
- GPU:Intel UHD 620
- GPU2:Nvidia MX350
Arch Linux系統安裝方法此處不贅述,你可以用 archinstall安裝一個純文字最小系統再裝Hyprland;或是從現有桌面環境設定Hyprland,再沿用其顯示管理器(例如GDM、SDDM)來登入Hyprland。
Ivon的主力GPU用Intel內顯,Nvidia安裝閉源驅動,再透過PRIME存取。
1. 安裝Hyprland#
現階段作者會一直加新功能,所以Linux最好用滾動發行版,例如Arch Linux、openSUSE Tumbleweed,以方便取得最新版Hyprland套件。
因為如果發行版收的套件版本太舊,你可能就無法參考官方文件調整設定檔了!
Arch Linux不用擔心版本問題,直接從官方套件庫裝Hyprland。
sudo pacman -S hyprland
1.1. Hyprland配套程式#
建議安裝這些程式搭配Hyprland使用,使其成為完整的桌面環境。有些套件是AUR的,嫌麻煩直接用yay指令裝就行了,它會自動辨別。
yay -S kitty waybar otf-font-awesome network-manager-applet brightnessctl pw-volume hyprshot power-profiles-daemon wofi hyprpaper swayidle swaylock wlogout dunst cliphist pipewire pipewire-pulse wireplumber pavucontrol xorg xorg-xwayland xdg-desktop-portal-hyprland xdg-desktop-portal-gtk polkit-kde-agent qt5-wayland qt6-wayland qt5ct qt6ct nwg-look udiskie greetd greetd-tuigreet chezmoi fcitx5-im fcitx5-chewing fcitx5-qt fcitx5-gtk fcitx5-chinese-addons
這些套件功能如下:
kitty
Hyprland預設終端機。我倒覺得終端機簡單夠用就好,個人偏好gnome-console
waybar
,otf-font-awesome
狀態欄與Emoji字體network-manager-applet
從狀態欄開關網路brightnessctl
亮度控制pw-volume
音量控制hyprshot
截圖工具power-profiles-daemon
電源模式控制wofi
應用程式選單hyprpaper
桌布程式swayidle
,swaylock
,wlogout
暫停模式,螢幕鎖定,登出選單dunst
桌面通知守護行程cliphist
剪貼簿pipewire
,pipewire-pulse
,wireplumber
,pavucontrol
音訊系統xorg
,xorg-xwayland
X視窗系統,不是所有程式都支援Wayland。xdg-desktop-portal-hyprland
,xdg-desktop-portal-gtk
負責檔案選擇器、螢幕共享等功能polkit-kde-agent
密碼驗證對話框qt5-wayland
,qt6-wayland
讓QT程式支援Waylandudiskie
自動掛載隨身碟qt5ct
,qt6ct
設定QT程式主題nwg-look
:設定GTK程式主題greetd
,greetd-tuigreet
開機負責登入桌面的顯示管理器chezmoi
備份設定檔(dotfile)的好工具fcitx5
中文輸入法
1.2. 命令行狂人適用的程式#
這裡是極簡應用程式,命令行狂人適用。我個人不太會用這些,因為我覺得不直觀…看圖的話我習慣用Gwenview,檔案管理器則是Dolphin、錄影用OBS等。
ranger
檔案管理器mpd
搭配Waybar的音樂播放器mpv
影片/音樂播放器ytfzf
純文字YouTube播放器vim
文字編輯器feh
圖片檢視器mupdf
文件閱讀器wl-recorder
螢幕錄影qutebrowser
極簡QtWebEngine瀏覽器,用類似vim快捷鍵的方式操作
2. 撰寫Hyprland設定檔#
想知道全部可用選項,請看Hyprland官方的說明文件,詳細明瞭: Configuring Hyprland - Hyprland Wiki
這裡講Ivon個人的設定,盡量保留預設並另外加功能。
- 複製Hyprland預設設定檔
mkdir ~/.config/hypr
cp /usr/share/hyprland/hyprland.conf ~/.config/hypr/hyprland.conf
- 用vim編輯
vim ~/.config/hypr/hyprland.conf
- 大致上,
hyprland.conf
檔案的結構可以切成四塊:
- exec區塊的定義啟動Hyprland跟著啟動的程式
- 環境變數
- 外觀、動畫、手勢、個別程式視窗規則的設定
- bind的區域是快捷鍵綁定。
雖然Hyprland沒有嚴格規定設定檔的順序,但為了方便討論我沿用此規則。
螢幕設定(Monitors)#
- 如果有的話,將
auto-generated=1
警告註解掉。
# autogenerated = 1
- 螢幕規則,設定自動取得螢幕名稱、使用螢幕最高解析度、自動取得座標,再設定全域縮放為1.15倍。
monitor =,highres,auto,1.15
- 此設定會自動套用第二個螢幕,因為我不確定外接的第二個螢幕會是什麼解析度,所以就讓它自動偵測。
自動執行的程式(Autostart)#
設定要啟動的程式,
exec-once
跟exec
的差別在於,前者要重新登入桌面才會啟動,後者則是每編輯一次設定檔就會自動重啟。先匯入systemd環境變數,瀏覽器類的程式會用到。
exec-once = dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
- 再啟動fcitx5、dunct、nm-applet、剪貼簿服務。
exec-once = hyprpaper
exec-once = wl-paste --type text --watch cliphist store
exec-once = wl-paste --type image --watch cliphist store
exec-once = waybar
exec-once = nm-applet
exec-once = fcitx5 -d --replace
exec-once = dunst
exec-once = /usr/lib/polkit-kde-authentication-agent-1
exec-once = udiskie &
- 如果你的程式可以用systemd服務啟動那就不用寫在這邊。
環境變數(Environment variables)#
env環境變數的寫法為env = 名稱, 數值
- 設定滑鼠大小
env = XCURSOR_SIZE,24
- 指定目前的工作階段為Hyprland
env = XDG_CURRENT_DESKTOP, Hyprland
env = XDG_SESSION_TYPE, wayland
env = XDG_SESSION_DESKTOP, Hyprland
- 指定所有程式都使用Wayland,QT程式使用kvantum當主題。不過QT程式因為縮放有問題,所以我設定QT優先使用X而非Wayland協定。
# 預設文字編輯器
env = EDITOR, vim
# 給Firefox啟用Wayland
env = MOZ_ENABLE_WAYLAND, 1
env = GDK_BACKEND, "wayland,x11"
env = QT_QPA_PLATFORM, "xcb;wayland"
env = QT_QPA_PLATFORMTHEME, qt5ct
- 還有設定全域縮放比例(應該只對XWayland程式有效),依照程式框架個別設定
env = QT_AUTO_SCREEN_SCALE_FACTOR, 1
env = QT_SCALE_FACTOR, 1.15
env = GDK_DPI_SCALE, 1.15
- 再設定Fictx5的環境變數
env = GTK_IM_MODULE, fcitx
env = QT_IM_MODULE, fcitx
env = XMODIFIERS, @im=fcitx
Intel、AMD顯示卡不需要特別設定即可獲得GPU硬體加速;如果是用Nvidia專有驅動的話需參考 Hyprland作者的說明設定一些環境變數。
注意有時從終端機或Waybar手動啟動程式,程式可能還是吃不到Hyprland環境變數,這時就得將環境變數放到~/.config/environment.d/envvars.conf
或/etc/environment
解決。
動畫視窗裝飾(Look and feel)#
動畫、視窗裝飾這部份看個人喜好調整,我沒有做太多修改。僅修改rounding
讓視窗圓角不要那麼圓。
視窗排列模式
視窗排列模式分成dwindle與master
dwindle
模式即bspwm,視窗大小是動態變化的。
master
模式就是i3wm那樣,一個視窗開在左邊,新視窗會從右邊依序分割開啟。
我維持dwindle
模式,不更動。
視窗規則
視窗規則可用class:程式名稱
選取要設定規則的視窗,比如我設定pavucontrol面板一律懸浮。如果不知道具體名字請用hyprctl clients
指令查詢。
windowrulev2 = size 50% 50%, center, floating:(pavucontrol)
我還設定所有懸浮視窗一律置中,並限制最大寬高50%,防止檔案選擇器這類的視窗過於巨大。冒號後面用星號選取所有符合此類型的程式視窗
windowrulev2 = size 50% 50%, center, floating:*
雜項
在misc這塊,使用這二個變數,關閉Hyprland的預設桌布及看板娘。
misc {
force_default_wallpaper = -1 # Set to 0 to disable the anime mascot wallpapers
disable_hyprland_logo = false
}
輸入(Input)#
- 啟用觸控版切換工作區的手勢。設定輕觸等同按下,觸控板等同滑鼠右鍵,雙指點選為左鍵
gestures {
workspace_swipe = true
}
touchpad{
tap-to-click = true
}
- 加上這條,關閉XWayland的自動縮放,防止程式模糊。縮放部份用環境變數調整就可以了。
xwayland {
force_zero_scaling = true
}
按鍵綁定(Keybindings)#
鍵盤綁定部分預設的我沒改,Mod鍵維持Super鍵(Windows鍵)
我另外綁了鎖定鍵、音量鍵、亮度調節鍵、截圖鍵。想確認具體按鍵代碼可以用wev
程式偵測。
# Mod + Shift + 方向鍵調整視窗大小
binde = $mainMod SHIFT, right, resizeactive, 10 0
binde = $mainMod SHIFT, left, resizeactive, -10 0
binde = $mainMod SHIFT, up, resizeactive, 0 -10
binde = $mainMod SHIFT, down, resizeactive, 0 10
# 音量鍵
binde=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+
bindl=, XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-
# 亮度鍵
binde=, XF86MonBrightnessDown, exec, brightnessctl set 5%-
bindl=, XF86MonBrightnessUp, exec, brightnessctl set +5%
# 全螢幕擷圖鍵
bind = , PRINT, exec, hyprshot -m output
終於弄好了,但還沒完呢!
Hyprland支援邊改設定檔邊套用變更。作者說法是一修改設定檔便會自動套用變更,但如果沒反應的話請用指令強制重新載入設定檔,或者重新登入桌面。
hyprctl reload
3. 設定Hyprland的配套程式#
狀態欄Waybar的設定#
- 將自己加入input群組
sudo usermod -a -G input $USER
- 編輯預設設定檔
mkdir ~/.config/waybar/
cp /etc/xdg/waybar/* ~/.config/waybar/
vim ~/.config/waybar/config/config.jsonc
- 將Waybar放在所有視窗最上層
"layer": "top",
- 最上面的
"modules"
是狀態欄要顯示的按鈕,不要的直接從json陣列移除就可以了,例如mpd
用不到就刪除。另外加入工作區編號指示器hyprland/workspaces
、登出按鈕wlogout
。
"modules-left": ["hyprland/workspaces", "custom/wofi", "custom/brave", "custom/dolphin"],
"modules-center": [],
"modules-right": ["idle_inhibitor", "pulseaudio", "backlight", "keyboard-state", "hyprland/language", "battery", "tray", "clock", "custom/wlogout"],
因為不支援圖片,Waybar使用Emoji當小圖示,如果電腦無法顯示請安裝相應字體,或者將其改為ASCII符號。
下滑到
"network"
這一段,設定隱藏網路SSID名稱還有 IP位址,把這些資訊改放到tooltip欄位。
"network": {
// "interface": "wlp2*", // (Optional) To force the use of this interface
"format-wifi": "",
"format-ethernet": "{ifname} ",
"tooltip-format": "{essid} {signalStrength}% {ifname} via {gwaddr} ",
"format-linked": "{ifname} (No IP) ",
"format-disconnected": "Disconnected ⚠",
"format-alt": "{ifname} {gwaddr}",
"tooltip": true
},
- 最下面加入
"custom/wlogout"
的按鈕,設定點選啟動登出面板
"custom/wlogout":{
"format":"",
"on-click":"wlogout"
}
wlogout面板提供待機、鎖定螢幕、重開機的選單,需要進一步設定的請複製cp /etc/wlogout/* ~/.config/wlogout/
後再編輯具體指令。待機因為我電腦的硬體支援度不佳所以沒啟用。
- Waybar的顏色樣式請編輯
~/.config/waybar/style.css
桌布Hypraper的設定#
桌布程式會疊在Hyprland預設的桌布上。
- 編輯預設設定檔
vim ~/.config/hypr/hyprpaper.conf
- 填入桌布路徑,wallpaper後面留白指定全部螢幕都使用同一張桌布
preload = /home/user/.config/wallpapers/wallpaper.jpg
wallpaper = ,/home/user/.config/wallpapers/wallpaper.jpg
登入畫面greetd設定#
tuigreetd是純文字介面不需要設定背景。
- 編輯設定檔
sudo vim /etc/greetd/config.toml
2.設定記住登入用戶,並在登入後執行Hyprland
[default_session]
command = "tuigreet --time --asterisks --remember --cmd Hyprland"
- 如果有裝其他桌面環境,將現有的顯示管理器停用,改啟用greetd
sudo systemctl disable gdm
sudo systemctl enable greetd
系統部分的設定#
- 設定自動啟動NetworkManager服務
sudo systemctl enable NetworkManager
- 設定自動啟動電源管理模式的設定
sudo systemctl enable power-profiles-daemon
- 設定自動啟動PipeWire服務
systemctl enable --user pipewire
systemctl enable --user pipewire-pulse
- xdg-desktop-portal服務應該會自動啟動,但也可以手動設定
systemctl enable --user xdg-desktop-portal-hyprland
systemctl enable --user xdg-desktop-portal-gtk
- 複製xdg-portal-desktop設定檔到使用者家目錄
cp /usr/share/xdg-desktop-portal/hyprland-portals.conf ~/.config/xdg-desktop-portal/portals.conf
- 設定Portal偏好為Hyprland優先其次GTK。
[preferred]
default=hyprland;gtk
- 設定完成後建議重開機。如果沒裝其他桌面環境,初次登入Hyprland要手動產生使用者家目錄:
sudo pacman -S xdg-dirs-update
LC_ALL=C xdg-user-dirs-update --force
4. Hyprland操作方式#
Hyprland的視窗(window)是平鋪在螢幕上的,開新程式會直接顯示在目前程式的旁邊,不會重疊。
Hyprland提供多個工作區(workspace)用於擺放多個不同的程式,例如工作區1放瀏覽器,工作區2放文字編輯器。
dwindle模式下,Hyprland開的新視窗會按照滑鼠所在位置決定。
預設按鍵綁定#
Hyprland預設綁定的Mod鍵是Windows鍵
- Mod + Q 開啟終端機
- Mod + C 關閉目前聚焦的視窗
- Mod + M 終止Hyprland
- Mod + E 開啟檔案管理器
- Mod + V 讓視窗懸浮
- Mod + R 開啟Wofi
- Mod + P 固定目前視窗大小
- Mod + J 切換垂直與水平視窗排列
- Mod + 方向鍵(或l/r/u/d) 切換視窗聚焦
- Mod + 數字鍵 切換工作區
- Mod + Shift + 數字鍵 將視窗移動到該工作區
- Mod + S,開啟scratchpad(將視窗最小化後集中的特殊工作區)
- Mod + Shift + S,將視窗移動到scratchpad
- Mod + 滑鼠滾輪 在工作區間切換(觸控板是三指手勢滑動)
- Mod + 滑鼠左鍵 移動視窗
- Mod + 滑鼠右鍵 調整視窗大小
雙螢幕切換#
Hyprland預設每個螢幕一個工作區(跟window rule一樣,workspace也可以設定自動規則,參照官方文件),拖動視窗可以把它丟到第二個螢幕。Hyprland預設是讓第二個螢幕顯示在左方。
如果要設定螢幕相對位置,則使用hyprctl monitor
指令取得所有螢幕名稱,再於hyprland.conf
個別設定解析度。由於螢幕的座標數值是從左上角開始計算的,指定X軸便可以控制螢幕的相對方位。
# 使螢幕DP-1位於DP-2的左邊
monitor=DP-1, 1920x1080, 0x0, 1
monitor=DP-2, 1920x1080, 1920x0, 1
# 使螢幕DP-1位於DP-2的右邊
monitor=DP-1, 1920x1080, 1920x0, 1
monitor=DP-2, 1920x1080, 0x0, 1
也可以用mirror
設定鏡射模式,讓第二螢幕跟第一螢幕顯示同樣內容
# 使DP-2螢幕鏡射DP-1的內容
monitor=DP-2,highres,auto,1,mirror,DP-1
需要獨顯加速請使用 Nvidia PRIME指令。
順帶一提Hyprland可以用hyprctl做虛擬輸出,方便在SSH或分享螢幕的時候做個假螢幕出來
# 做個Wayland的第二螢幕
hyprctl output create wayland
# SSH遠端啟用
hyprctl output create headless
一些應用程式問題#
要設定GTK程式主題,執行nwg-look
;QT則是qt5ct
。
Firefox的Wayland支援狀況良好。
Chromium系在純Wayland模式支援不佳,硬體加速有問題,將就用XWayland跑吧。但XWayland字體偶爾會模糊一下。
GTK的檔案選擇器會莫名變很大,可能要設定window rule。
終端機啟動X11程式如果吃不到環境變數,請在~/.config/environment.d/envvars.conf
加入DISPLAY:0
5. 用chezmoi備份dotfile#
將Hyprland及配套程式的設定檔集中管理,備份到私人Git儲存庫。
參考 Chezmoi使用教學